summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/pull_request_template.md13
-rw-r--r--.gitignore2
-rw-r--r--.gitlab-ci.yml31
-rw-r--r--VERSION4
-rw-r--r--client/mysql.cc189
-rw-r--r--client/mysqladmin.cc1
-rw-r--r--client/mysqlbinlog.cc382
-rw-r--r--client/mysqlcheck.c1
-rw-r--r--client/mysqlimport.c1
-rw-r--r--client/mysqlshow.c1
-rw-r--r--client/mysqltest.cc53
-rw-r--r--cmake/build_configurations/mysql_release.cmake2
-rw-r--r--cmake/os/Windows.cmake4
-rw-r--r--cmake/ssl.cmake3
-rw-r--r--cmake/win_compatibility.manifest5
-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.7.py)4
-rw-r--r--debian/changelog2
-rw-r--r--debian/control112
-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.7.README.Debian)0
-rw-r--r--debian/mariadb-client-10.8.docs (renamed from debian/mariadb-client-10.7.docs)0
-rw-r--r--debian/mariadb-client-10.8.install (renamed from debian/mariadb-client-10.7.install)0
-rw-r--r--debian/mariadb-client-10.8.links (renamed from debian/mariadb-client-10.7.links)0
-rw-r--r--debian/mariadb-client-10.8.manpages (renamed from debian/mariadb-client-10.7.manpages)0
-rw-r--r--debian/mariadb-client-10.8.menu (renamed from debian/mariadb-client-10.7.menu)2
-rw-r--r--debian/mariadb-client-core-10.8.install (renamed from debian/mariadb-client-core-10.7.install)0
-rw-r--r--debian/mariadb-client-core-10.8.links (renamed from debian/mariadb-client-core-10.7.links)0
-rw-r--r--debian/mariadb-server-10.8.README.Debian (renamed from debian/mariadb-server-10.7.README.Debian)0
-rw-r--r--debian/mariadb-server-10.8.config (renamed from debian/mariadb-server-10.7.config)2
-rw-r--r--debian/mariadb-server-10.8.dirs (renamed from debian/mariadb-server-10.7.dirs)0
-rw-r--r--debian/mariadb-server-10.8.install (renamed from debian/mariadb-server-10.7.install)5
-rw-r--r--debian/mariadb-server-10.8.links (renamed from debian/mariadb-server-10.7.links)0
-rw-r--r--debian/mariadb-server-10.8.logcheck.ignore.paranoid (renamed from debian/mariadb-server-10.7.logcheck.ignore.paranoid)0
-rw-r--r--debian/mariadb-server-10.8.logcheck.ignore.server (renamed from debian/mariadb-server-10.7.logcheck.ignore.server)0
-rw-r--r--debian/mariadb-server-10.8.logcheck.ignore.workstation (renamed from debian/mariadb-server-10.7.logcheck.ignore.workstation)0
-rw-r--r--debian/mariadb-server-10.8.mariadb.init (renamed from debian/mariadb-server-10.7.mariadb.init)2
-rw-r--r--debian/mariadb-server-10.8.mysql-server.logrotate (renamed from debian/mariadb-server-10.7.mysql-server.logrotate)0
-rw-r--r--debian/mariadb-server-10.8.mysql.default (renamed from debian/mariadb-server-10.7.mysql.default)0
-rw-r--r--debian/mariadb-server-10.8.postinst (renamed from debian/mariadb-server-10.7.postinst)0
-rw-r--r--debian/mariadb-server-10.8.postrm (renamed from debian/mariadb-server-10.7.postrm)0
-rw-r--r--debian/mariadb-server-10.8.preinst (renamed from debian/mariadb-server-10.7.preinst)0
-rw-r--r--debian/mariadb-server-10.8.prerm (renamed from debian/mariadb-server-10.7.prerm)0
-rw-r--r--debian/mariadb-server-10.8.templates (renamed from debian/mariadb-server-10.7.templates)6
-rw-r--r--debian/mariadb-server-10.8.triggers (renamed from debian/mariadb-server-10.7.triggers)0
-rw-r--r--debian/mariadb-server-core-10.8.install (renamed from debian/mariadb-server-core-10.7.install)0
-rw-r--r--debian/mariadb-server-core-10.8.links (renamed from debian/mariadb-server-core-10.7.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.yml76
-rw-r--r--debian/source/lintian-overrides12
-rw-r--r--debian/tests/control2
-rw-r--r--debian/tests/smoke4
-rw-r--r--extra/innochecksum.cc3
-rw-r--r--extra/mariabackup/CMakeLists.txt5
-rw-r--r--extra/mariabackup/backup_copy.cc21
-rw-r--r--extra/mariabackup/changed_page_bitmap.cc4
-rw-r--r--extra/mariabackup/changed_page_bitmap.h2
-rw-r--r--extra/mariabackup/xb_plugin.cc4
-rw-r--r--extra/mariabackup/xtrabackup.cc689
-rw-r--r--extra/mariabackup/xtrabackup.h3
-rw-r--r--extra/my_print_defaults.c64
-rw-r--r--include/json_lib.h14
-rw-r--r--include/m_ctype.h4
-rw-r--r--include/my_global.h8
-rw-r--r--include/my_rdtsc.h27
-rw-r--r--include/my_sys.h12
-rw-r--r--include/ssl_compat.h2
m---------libmariadb0
-rw-r--r--libmysqld/CMakeLists.txt1
-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/include/check_utf8_cli.inc3
-rw-r--r--mysql-test/include/check_windows_admin.inc3
-rw-r--r--mysql-test/include/ctype_unicode_allchars.inc23
-rw-r--r--mysql-test/include/default_mysqld.cnf3
-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/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/main/analyze_format_json.result884
-rw-r--r--mysql-test/main/analyze_stmt_orderby.result454
-rw-r--r--mysql-test/main/brackets.result152
-rw-r--r--mysql-test/main/charset_client_win.test1
-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/cte_recursive.result948
-rw-r--r--mysql-test/main/ctype_ldml.result37
-rw-r--r--mysql-test/main/ctype_ldml.test21
-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/derived_cond_pushdown.result18746
-rw-r--r--mysql-test/main/derived_view.result520
-rw-r--r--mysql-test/main/desc_index_range.result219
-rw-r--r--mysql-test/main/desc_index_range.test128
-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/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_math.result120
-rw-r--r--mysql-test/main/func_math.test54
-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/having_cond_pushdown.result2888
-rw-r--r--mysql-test/main/in_subq_cond_pushdown.result2987
-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/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/key.result6
-rw-r--r--mysql-test/main/key.test9
-rw-r--r--mysql-test/main/merge.result58
-rw-r--r--mysql-test/main/merge.test103
-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.test58
-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.test58
-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/mysqld--help.result7
-rw-r--r--mysql-test/main/mysqldump-system.result10
-rw-r--r--mysql-test/main/mysqldump-system.test4
-rw-r--r--mysql-test/main/mysqldump.test4
-rw-r--r--mysql-test/main/opt_trace.result231
-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.test51
-rw-r--r--mysql-test/main/order_by_pack_big.result178
-rw-r--r--mysql-test/main/partition.result4
-rw-r--r--mysql-test/main/partition_error.result2
-rw-r--r--mysql-test/main/partition_exchange.result138
-rw-r--r--mysql-test/main/partition_exchange.test42
-rw-r--r--mysql-test/main/partition_order.result15
-rw-r--r--mysql-test/main/partition_order.test14
-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.result2220
-rw-r--r--mysql-test/main/rowid_filter_innodb.result2388
-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/sp-cursor.result40
-rw-r--r--mysql-test/main/sp-cursor.test51
-rw-r--r--mysql-test/main/sp-inout.result2033
-rw-r--r--mysql-test/main/sp-inout.test1964
-rw-r--r--mysql-test/main/statistics.result98
-rw-r--r--mysql-test/main/statistics.test79
-rw-r--r--mysql-test/main/statistics_json.result8324
-rw-r--r--mysql-test/main/statistics_json.test462
-rw-r--r--mysql-test/main/statistics_upgrade.result87
-rw-r--r--mysql-test/main/statistics_upgrade.test67
-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/type_timestamp.result2
-rw-r--r--mysql-test/main/type_timestamp.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/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/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/compat/oracle/r/sp-cursor.result43
-rw-r--r--mysql-test/suite/compat/oracle/r/sp-inout.result2571
-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/encryption/r/innodb_encrypt_log_corruption.result66
-rw-r--r--mysql-test/suite/encryption/r/tempfiles_encrypted.result360
-rw-r--r--mysql-test/suite/engines/funcs/r/ix_using_order.result4
-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/is_columns_mysql.result8
-rw-r--r--mysql-test/suite/funcs_1/r/is_columns_mysql_embedded.result8
-rw-r--r--mysql-test/suite/galera/r/galera_as_slave.result6
-rw-r--r--mysql-test/suite/galera/t/galera_as_slave.test16
-rw-r--r--mysql-test/suite/galera_3nodes/disabled.def2
-rw-r--r--mysql-test/suite/gcol/inc/gcol_supported_sql_funcs_main.inc12
-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/heap/heap_hash.result22
-rw-r--r--mysql-test/suite/heap/heap_hash.test20
-rw-r--r--mysql-test/suite/innodb/include/no_checkpoint_end.inc15
-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/innodb-index,debug.rdiff10
-rw-r--r--mysql-test/suite/innodb/r/innodb-index.result48
-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_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/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.result18
-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/rename_table.result2
-rw-r--r--mysql-test/suite/innodb/r/truncate_missing.result2
-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/innodb-index-online.opt1
-rw-r--r--mysql-test/suite/innodb/t/innodb-index.test53
-rw-r--r--mysql-test/suite/innodb/t/innodb-table-online-master.opt2
-rw-r--r--mysql-test/suite/innodb/t/innodb-wl5522-debug.test2
-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/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.test2
-rw-r--r--mysql-test/suite/innodb/t/log_file_name_debug.test50
-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/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/t/create.test20
-rw-r--r--mysql-test/suite/innodb_gis/r/geometry.result4
-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_table.result18
-rw-r--r--mysql-test/suite/json/r/json_table_mysql.result18
-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/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/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/parts/r/engine_defined_part_attributes.result288
-rw-r--r--mysql-test/suite/parts/t/engine_defined_part_attributes.test216
-rw-r--r--mysql-test/suite/perfschema/include/default_mysqld_autosize.cnf5
-rw-r--r--mysql-test/suite/perfschema/r/sxlock_func.result2
-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_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/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_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.test75
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_alter_restart_slave.test121
-rw-r--r--mysql-test/suite/sys_vars/r/binlog_alter_two_phase.result53
-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/keep_files_on_create_basic.result48
-rw-r--r--mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff79
-rw-r--r--mysql-test/suite/sys_vars/r/sysvars_innodb.result37
-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/t/binlog_alter_two_phase.test52
-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/sysvars_innodb.test1
-rw-r--r--mysys/CMakeLists.txt1
-rw-r--r--mysys/array.c26
-rw-r--r--mysys/charset.c134
-rw-r--r--mysys/crc32ieee.cc4
-rw-r--r--mysys/get_password.c55
-rw-r--r--mysys/my_conio.c223
-rw-r--r--mysys/my_getopt.c48
-rw-r--r--mysys/my_init.c75
-rw-r--r--mysys/my_largepage.c22
-rw-r--r--mysys/my_rdtsc.c2
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6.result33
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6.test21
-rw-r--r--scripts/mysql_install_db.sh18
-rw-r--r--scripts/mysql_system_tables.sql2
-rw-r--r--scripts/mysql_system_tables_fix.sql8
-rw-r--r--scripts/wsrep_sst_rsync.sh2
-rw-r--r--sql/CMakeLists.txt10
-rw-r--r--sql/create_options.cc113
-rw-r--r--sql/create_options.h25
-rw-r--r--sql/field.cc44
-rw-r--r--sql/field.h19
-rw-r--r--sql/ha_partition.cc5
-rw-r--r--sql/handler.cc11
-rw-r--r--sql/item_create.cc68
-rw-r--r--sql/item_geofunc.cc1
-rw-r--r--sql/item_strfunc.cc36
-rw-r--r--sql/item_strfunc.h22
-rw-r--r--sql/key.cc20
-rw-r--r--sql/log.cc162
-rw-r--r--sql/log.h3
-rw-r--r--sql/log_event.cc56
-rw-r--r--sql/log_event.h97
-rw-r--r--sql/log_event_client.cc66
-rw-r--r--sql/log_event_server.cc437
-rw-r--r--sql/mdl.cc8
-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.cc6
-rw-r--r--sql/mysqld.h2
-rw-r--r--sql/opt_histogram_json.cc1181
-rw-r--r--sql/opt_histogram_json.h148
-rw-r--r--sql/opt_range.cc150
-rw-r--r--sql/opt_range.h218
-rw-r--r--sql/opt_range_mrr.cc49
-rw-r--r--sql/opt_subselect.cc3
-rw-r--r--sql/opt_sum.cc5
-rw-r--r--sql/partition_element.h11
-rw-r--r--sql/rpl_gtid.cc880
-rw-r--r--sql/rpl_gtid.h460
-rw-r--r--sql/rpl_mi.cc15
-rw-r--r--sql/rpl_mi.h21
-rw-r--r--sql/rpl_parallel.cc263
-rw-r--r--sql/rpl_parallel.h26
-rw-r--r--sql/rpl_rli.cc12
-rw-r--r--sql/rpl_rli.h52
-rw-r--r--sql/share/errmsg-utf8.txt6
-rw-r--r--sql/signal_handler.cc4
-rw-r--r--sql/slave.cc125
-rw-r--r--sql/sp_head.cc195
-rw-r--r--sql/sp_head.h12
-rw-r--r--sql/sql_admin.cc2
-rw-r--r--sql/sql_alter.cc3
-rw-r--r--sql/sql_binlog.cc67
-rw-r--r--sql/sql_class.cc10
-rw-r--r--sql/sql_class.h44
-rw-r--r--sql/sql_explain.cc45
-rw-r--r--sql/sql_explain.h1
-rw-r--r--sql/sql_lex.cc21
-rw-r--r--sql/sql_partition.cc24
-rw-r--r--sql/sql_priv.h2
-rw-r--r--sql/sql_select.cc21
-rw-r--r--sql/sql_show.cc3
-rw-r--r--sql/sql_statistics.cc490
-rw-r--r--sql/sql_statistics.h223
-rw-r--r--sql/sql_table.cc433
-rw-r--r--sql/sql_table.h3
-rw-r--r--sql/sql_yacc.yy272
-rw-r--r--sql/sys_vars.cc13
-rw-r--r--sql/table.cc2
-rw-r--r--sql/table.h11
-rw-r--r--sql/temporary_tables.cc19
-rw-r--r--sql/tztime.cc6
-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--storage/archive/ha_archive.cc4
-rw-r--r--storage/connect/ha_connect.cc9
-rw-r--r--storage/connect/mysql-test/connect/r/index.result9
-rw-r--r--storage/connect/mysql-test/connect/t/index.test10
-rw-r--r--storage/federatedx/ha_federatedx.cc41
-rw-r--r--storage/federatedx/ha_federatedx.h3
-rw-r--r--storage/innobase/CMakeLists.txt6
-rw-r--r--storage/innobase/btr/btr0btr.cc19
-rw-r--r--storage/innobase/btr/btr0cur.cc11
-rw-r--r--storage/innobase/btr/btr0pcur.cc2
-rw-r--r--storage/innobase/btr/btr0sea.cc7
-rw-r--r--storage/innobase/buf/buf0buf.cc96
-rw-r--r--storage/innobase/buf/buf0checksum.cc15
-rw-r--r--storage/innobase/buf/buf0dblwr.cc10
-rw-r--r--storage/innobase/buf/buf0dump.cc15
-rw-r--r--storage/innobase/buf/buf0flu.cc191
-rw-r--r--storage/innobase/buf/buf0lru.cc6
-rw-r--r--storage/innobase/data/data0data.cc44
-rw-r--r--storage/innobase/dict/dict0crea.cc25
-rw-r--r--storage/innobase/dict/dict0dict.cc36
-rw-r--r--storage/innobase/dict/dict0load.cc20
-rw-r--r--storage/innobase/dict/dict0mem.cc26
-rw-r--r--storage/innobase/dict/dict0stats.cc11
-rw-r--r--storage/innobase/eval/eval0eval.cc4
-rw-r--r--storage/innobase/fil/fil0crypt.cc2
-rw-r--r--storage/innobase/fil/fil0fil.cc197
-rw-r--r--storage/innobase/fsp/fsp0file.cc21
-rw-r--r--storage/innobase/fsp/fsp0fsp.cc6
-rw-r--r--storage/innobase/fsp/fsp0sysspace.cc37
-rw-r--r--storage/innobase/fts/fts0fts.cc2
-rw-r--r--storage/innobase/handler/ha_innodb.cc299
-rw-r--r--storage/innobase/handler/handler0alter.cc51
-rw-r--r--storage/innobase/ibuf/ibuf0ibuf.cc5
-rw-r--r--storage/innobase/include/buf0buf.h27
-rw-r--r--storage/innobase/include/buf0buf.inl3
-rw-r--r--storage/innobase/include/buf0flu.h29
-rw-r--r--storage/innobase/include/data0data.h10
-rw-r--r--storage/innobase/include/dict0dict.h20
-rw-r--r--storage/innobase/include/dict0mem.h32
-rw-r--r--storage/innobase/include/fil0fil.h92
-rw-r--r--storage/innobase/include/fsp0file.h5
-rw-r--r--storage/innobase/include/fsp0sysspace.h9
-rw-r--r--storage/innobase/include/ibuf0ibuf.inl18
-rw-r--r--storage/innobase/include/log0crypt.h68
-rw-r--r--storage/innobase/include/log0log.h814
-rw-r--r--storage/innobase/include/log0log.inl311
-rw-r--r--storage/innobase/include/log0recv.h120
-rw-r--r--storage/innobase/include/mtr0log.h3
-rw-r--r--storage/innobase/include/mtr0mtr.h37
-rw-r--r--storage/innobase/include/mtr0mtr.inl19
-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.h1
-rw-r--r--storage/innobase/include/srv0mon.h9
-rw-r--r--storage/innobase/include/srv0srv.h45
-rw-r--r--storage/innobase/include/univ.i3
-rw-r--r--storage/innobase/include/ut0crc32.h37
-rw-r--r--storage/innobase/include/ut0ut.h10
-rw-r--r--storage/innobase/log/log0crypt.cc358
-rw-r--r--storage/innobase/log/log0log.cc1418
-rw-r--r--storage/innobase/log/log0recv.cc2259
-rw-r--r--storage/innobase/mtr/mtr0mtr.cc956
-rw-r--r--storage/innobase/os/os0file.cc359
-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.cc240
-rw-r--r--storage/innobase/row/row0ftsort.cc10
-rw-r--r--storage/innobase/row/row0import.cc2
-rw-r--r--storage/innobase/row/row0ins.cc36
-rw-r--r--storage/innobase/row/row0log.cc10
-rw-r--r--storage/innobase/row/row0merge.cc38
-rw-r--r--storage/innobase/row/row0mysql.cc3
-rw-r--r--storage/innobase/row/row0purge.cc2
-rw-r--r--storage/innobase/row/row0sel.cc56
-rw-r--r--storage/innobase/row/row0vers.cc27
-rw-r--r--storage/innobase/srv/srv0mon.cc95
-rw-r--r--storage/innobase/srv/srv0srv.cc49
-rw-r--r--storage/innobase/srv/srv0start.cc565
-rw-r--r--storage/innobase/trx/trx0trx.cc25
-rw-r--r--storage/innobase/ut/ut0ut.cc12
-rw-r--r--storage/maria/ha_maria.cc8
-rw-r--r--storage/maria/ma_search.c30
-rw-r--r--storage/mroonga/ha_mroonga.cpp8
-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/ha_myisam.cc11
-rw-r--r--storage/myisam/mi_search.c25
-rw-r--r--storage/rocksdb/ha_rocksdb.cc3
-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/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/rdb_datadic.cc13
-rw-r--r--storage/rocksdb/rdb_datadic.h2
-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/bugfix/r/index.result105
-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/include/init_spider.inc32
-rw-r--r--storage/spider/spd_conn.cc772
-rw-r--r--storage/spider/spd_db_conn.cc1262
-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.cc264
-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.h4
-rw-r--r--storage/spider/spd_param.cc234
-rw-r--r--storage/spider/spd_param.h33
-rw-r--r--storage/spider/spd_table.cc867
-rw-r--r--storage/spider/spd_table.h9
-rw-r--r--storage/spider/spd_trx.cc373
-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/json_lib.c8
-rw-r--r--support-files/CMakeLists.txt4
-rwxr-xr-xsupport-files/mini-benchmark.sh229
-rw-r--r--support-files/rpm/server.cnf4
-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
686 files changed, 107182 insertions, 42952 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 02de7b865dc..05c65848514 100644
--- a/.gitignore
+++ b/.gitignore
@@ -239,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
@@ -256,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 6db89cd332f..bc88dc8cef3 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -39,7 +39,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
@@ -364,6 +364,35 @@ fedora upgrade:
- new-installed-database.sql
- new-upgraded-database.sql
+mini-benchmark:
+ stage: test
+ dependencies:
+ - 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 || 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/VERSION b/VERSION
index 91f606347b6..19a2bba13ac 100644
--- a/VERSION
+++ b/VERSION
@@ -1,4 +1,4 @@
MYSQL_VERSION_MAJOR=10
-MYSQL_VERSION_MINOR=7
-MYSQL_VERSION_PATCH=5
+MYSQL_VERSION_MINOR=8
+MYSQL_VERSION_PATCH=4
SERVER_MATURITY=stable
diff --git a/client/mysql.cc b/client/mysql.cc
index db0780cba74..caed22b8a95 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;
@@ -4816,6 +4938,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/mysqladmin.cc b/client/mysqladmin.cc
index 6fa5d6c73d0..a7159d2bb6a 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 a642d4df0b5..21980ca03d6 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;
@@ -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;
@@ -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 480308aa015..eb063765a37 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/mysqlimport.c b/client/mysqlimport.c
index 8723641c74b..48f11667cd1 100644
--- a/client/mysqlimport.c
+++ b/client/mysqlimport.c
@@ -525,6 +525,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 9b31d87225c..cbac1817c3c 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 56359ca6c07..7d807e00c1d 100644
--- a/client/mysqltest.cc
+++ b/client/mysqltest.cc
@@ -3282,6 +3282,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.
@@ -3356,6 +3397,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);
@@ -3382,7 +3431,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);
diff --git a/cmake/build_configurations/mysql_release.cmake b/cmake/build_configurations/mysql_release.cmake
index 531352d0338..a0ee64523b0 100644
--- a/cmake/build_configurations/mysql_release.cmake
+++ b/cmake/build_configurations/mysql_release.cmake
@@ -106,6 +106,7 @@ ELSEIF(RPM)
SET(PLUGIN_AUTH_SOCKET YES CACHE STRING "")
SET(WITH_EMBEDDED_SERVER ON CACHE BOOL "")
SET(WITH_PCRE system CACHE STRING "")
+ SET(CLIENT_PLUGIN_ZSTD OFF)
IF(RPM MATCHES "fedora|centos|rhel")
SET(WITH_ROCKSDB_BZip2 OFF CACHE STRING "")
ENDIF()
@@ -120,6 +121,7 @@ ELSEIF(DEB)
SET(PLUGIN_AUTH_SOCKET YES CACHE STRING "")
SET(WITH_EMBEDDED_SERVER ON CACHE BOOL "")
SET(WITH_PCRE system CACHE STRING "")
+ SET(CLIENT_PLUGIN_ZSTD OFF)
SET(WITH_ROCKSDB_BZip2 OFF CACHE STRING "")
ELSE()
SET(WITH_SSL bundled CACHE STRING "")
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/ssl.cmake b/cmake/ssl.cmake
index 1bd46bc0f39..646aa37a91c 100644
--- a/cmake/ssl.cmake
+++ b/cmake/ssl.cmake
@@ -113,7 +113,8 @@ MACRO (MYSQL_CHECK_SSL)
)
IF(NOT OPENSSL_ROOT_DIR)
IF(WITH_SSL_PATH)
- SET(OPENSSL_ROOT_DIR ${WITH_SSL_PATH})
+ # workaround for https://gitlab.kitware.com/cmake/cmake/-/issues/22945
+ SET(OPENSSL_ROOT_DIR ${WITH_SSL_PATH} ${WITH_SSL_PATH}/lib64)
ENDIF()
ENDIF()
FIND_PACKAGE(OpenSSL)
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/debian/additions/mariadb.conf.d/50-server.cnf b/debian/additions/mariadb.conf.d/50-server.cnf
index 728ca23178b..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.7 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.7]
+[mariadb-10.8]
diff --git a/debian/additions/source_mariadb-10.7.py b/debian/additions/source_mariadb-10.8.py
index d126a9a28d3..9b672189fdc 100644
--- a/debian/additions/source_mariadb-10.7.py
+++ b/debian/additions/source_mariadb-10.8.py
@@ -1,4 +1,4 @@
-'''apport package hook for mariadb-10.7
+'''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.7', 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/changelog b/debian/changelog
index 59109117207..72bd7ddc685 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,4 +1,4 @@
-mariadb-10.7 (1:10.7.0) unstable; urgency=medium
+mariadb-10.8 (1:10.8.0) unstable; urgency=medium
* Initial Release
diff --git a/debian/control b/debian/control
index 61000bd2432..bb7147948f3 100644
--- a/debian/control
+++ b/debian/control
@@ -1,4 +1,4 @@
-Source: mariadb-10.7
+Source: mariadb-10.8
Section: database
Priority: optional
Maintainer: MariaDB Developers <maria-developers@lists.launchpad.net>
@@ -263,7 +263,7 @@ Description: MariaDB common configuration files
.
This package includes configuration files common to all MariaDB programs.
-Package: mariadb-client-core-10.7
+Package: mariadb-client-core-10.8
Architecture: any
Depends: libmariadb3 (>= 10.5.4),
mariadb-common (>= ${source:Version}),
@@ -276,7 +276,8 @@ Conflicts: mariadb-client-10.0,
mariadb-client-10.4,
mariadb-client-10.5,
mariadb-client-10.6,
- mariadb-client-10.7 (<< ${source:Version}),
+ mariadb-client-10.7,
+ mariadb-client-10.8 (<< ${source:Version}),
mariadb-client-5.1,
mariadb-client-5.2,
mariadb-client-5.3,
@@ -288,6 +289,7 @@ Conflicts: mariadb-client-10.0,
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,
@@ -311,7 +313,8 @@ Breaks: mariadb-server-10.0,
mariadb-server-core-10.4,
mariadb-server-core-10.5,
mariadb-server-core-10.6,
- mariadb-server-core-10.7 (<< ${source:Version}),
+ 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,
@@ -326,7 +329,8 @@ Replaces: mariadb-client-10.0,
mariadb-client-10.4,
mariadb-client-10.5,
mariadb-client-10.6,
- mariadb-client-10.7 (<< ${source:Version}),
+ mariadb-client-10.7,
+ mariadb-client-10.8 (<< ${source:Version}),
mariadb-client-5.1,
mariadb-client-5.2,
mariadb-client-5.3,
@@ -338,6 +342,7 @@ Replaces: mariadb-client-10.0,
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,
@@ -351,7 +356,8 @@ Replaces: mariadb-client-10.0,
mariadb-server-core-10.4,
mariadb-server-core-10.5,
mariadb-server-core-10.6,
- mariadb-server-core-10.7 (<< ${source:Version}),
+ 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,
@@ -379,11 +385,11 @@ Description: MariaDB database core client binaries
.
This package includes the core client files, as used by Akonadi.
-Package: mariadb-client-10.7
+Package: mariadb-client-10.8
Architecture: any
Depends: debianutils (>=1.6),
libconfig-inifiles-perl,
- mariadb-client-core-10.7 (>= ${source:Version}),
+ mariadb-client-core-10.8 (>= ${source:Version}),
mariadb-common,
${misc:Depends},
${perl:Depends},
@@ -396,7 +402,8 @@ Conflicts: mariadb-client (<< ${source:Version}),
mariadb-client-10.4,
mariadb-client-10.5,
mariadb-client-10.6,
- mariadb-client-10.7 (<< ${source:Version}),
+ mariadb-client-10.7,
+ mariadb-client-10.8 (<< ${source:Version}),
mariadb-client-5.1,
mariadb-client-5.2,
mariadb-client-5.3,
@@ -423,7 +430,8 @@ Breaks: mariadb-client-core-10.0,
mariadb-client-core-10.4,
mariadb-client-core-10.5,
mariadb-client-core-10.6,
- mariadb-client-core-10.7 (<< ${source:Version}),
+ mariadb-client-core-10.7,
+ mariadb-client-core-10.8 (<< ${source:Version}),
mariadb-server-10.0,
mariadb-server-10.1,
mariadb-server-10.2,
@@ -431,7 +439,8 @@ Breaks: mariadb-client-core-10.0,
mariadb-server-10.4,
mariadb-server-10.5,
mariadb-server-10.6,
- mariadb-server-10.7 (<< ${source:Version}),
+ 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,
@@ -439,7 +448,8 @@ Breaks: mariadb-client-core-10.0,
mariadb-server-core-10.4,
mariadb-server-core-10.5,
mariadb-server-core-10.6,
- mariadb-server-core-10.7 (<< ${source:Version}),
+ mariadb-server-core-10.7,
+ mariadb-server-core-10.8 (<< ${source:Version}),
mysql-server-5.5,
mysql-server-5.6,
mysql-server-5.7,
@@ -459,6 +469,7 @@ Replaces: mariadb-client (<< ${source:Version}),
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,
@@ -470,7 +481,8 @@ Replaces: mariadb-client (<< ${source:Version}),
mariadb-client-core-10.4,
mariadb-client-core-10.5,
mariadb-client-core-10.6,
- mariadb-client-core-10.7 (<< ${source:Version}),
+ mariadb-client-core-10.7,
+ mariadb-client-core-10.8 (<< ${source:Version}),
mariadb-server-10.0,
mariadb-server-10.1,
mariadb-server-10.2,
@@ -478,7 +490,8 @@ Replaces: mariadb-client (<< ${source:Version}),
mariadb-server-10.4,
mariadb-server-10.5,
mariadb-server-10.6,
- mariadb-server-10.7 (<< ${source:Version}),
+ 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,
@@ -486,7 +499,8 @@ Replaces: mariadb-client (<< ${source:Version}),
mariadb-server-core-10.4,
mariadb-server-core-10.5,
mariadb-server-core-10.6,
- mariadb-server-core-10.7 (<< ${source:Version}),
+ 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,
@@ -527,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.7
+Package: mariadb-server-core-10.8
Architecture: any
Depends: mariadb-common (>= ${source:Version}),
${misc:Depends},
@@ -539,6 +553,7 @@ Conflicts: mariadb-server-core-10.0,
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,
@@ -558,14 +573,16 @@ Breaks: mariadb-client-10.0,
mariadb-client-10.4,
mariadb-client-10.5,
mariadb-client-10.6,
- mariadb-client-10.7 (<< ${source:Version}),
+ 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,
- mariadb-server-10.7 (<< ${source:Version}),
+ mariadb-server-10.7,
+ mariadb-server-10.8 (<< ${source:Version}),
mysql-client-5.5,
mysql-server-5.5,
mysql-server-5.6,
@@ -581,14 +598,16 @@ Replaces: mariadb-client-10.0,
mariadb-client-10.4,
mariadb-client-10.5,
mariadb-client-10.6,
- mariadb-client-10.7 (<< ${source:Version}),
+ 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,
- mariadb-server-10.7 (<< ${source:Version}),
+ 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,
@@ -625,7 +644,7 @@ Description: MariaDB database core server files
.
This package includes the core server files, as used by Akonadi.
-Package: mariadb-server-10.7
+Package: mariadb-server-10.8
Architecture: any
Suggests: mailx,
mariadb-test,
@@ -640,8 +659,8 @@ Depends: galera-4 (>= 26.4),
libdbi-perl,
lsb-base (>= 3.0-10),
lsof [linux-any],
- mariadb-client-10.7 (>= ${source:Version}),
- mariadb-server-core-10.7 (>= ${source:Version}),
+ mariadb-client-10.8 (>= ${source:Version}),
+ mariadb-server-core-10.8 (>= ${source:Version}),
passwd,
perl (>= 5.6),
procps,
@@ -659,6 +678,7 @@ Conflicts: mariadb-server (<< ${source:Version}),
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,
@@ -690,7 +710,8 @@ Replaces: handlersocket-mysql-5.5,
libmariadbclient16,
mariadb-client-10.5,
mariadb-client-10.6,
- mariadb-client-10.7 (<< ${source:Version}),
+ mariadb-client-10.7,
+ mariadb-client-10.8 (<< ${source:Version}),
mariadb-server (<< ${source:Version}),
mariadb-server-10.0,
mariadb-server-10.1,
@@ -699,6 +720,7 @@ Replaces: handlersocket-mysql-5.5,
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,
@@ -732,11 +754,11 @@ Description: MariaDB database server binaries
Package: mariadb-server
Architecture: all
-Depends: mariadb-server-10.7 (>= ${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.7), 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.
@@ -748,11 +770,11 @@ Description: MariaDB database server (metapackage depending on the latest versio
Package: mariadb-client
Architecture: all
-Depends: mariadb-client-10.7 (>= ${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.7), 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.
@@ -764,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.7 (= ${binary:Version}),
+Depends: mariadb-client-core-10.8 (= ${binary:Version}),
${misc:Depends},
${shlibs:Depends}
Description: Backup tool for MariaDB server
@@ -777,7 +799,7 @@ Description: Backup tool for MariaDB server
Package: mariadb-plugin-connect
Architecture: any
Depends: libxml2,
- mariadb-server-10.7 (= ${server:Version}),
+ mariadb-server-10.8 (= ${server:Version}),
unixodbc,
${misc:Depends},
${shlibs:Depends}
@@ -800,7 +822,7 @@ Description: Connect storage engine for MariaDB
Package: mariadb-plugin-s3
Architecture: any
Depends: libcurl4,
- mariadb-server-10.7 (= ${server:Version}),
+ mariadb-server-10.8 (= ${server:Version}),
${misc:Depends},
${shlibs:Depends}
Description: Amazon S3 archival storage engine for MariaDB
@@ -810,7 +832,7 @@ Description: Amazon S3 archival storage engine for MariaDB
Package: mariadb-plugin-rocksdb
Architecture: amd64 arm64 mips64el ppc64el
-Depends: mariadb-server-10.7 (= ${server:Version}),
+Depends: mariadb-server-10.8 (= ${server:Version}),
python3,
rocksdb-tools,
${misc:Depends},
@@ -830,7 +852,7 @@ Description: RocksDB storage engine for MariaDB
Package: mariadb-plugin-oqgraph
Architecture: any
Depends: libjudydebian1,
- mariadb-server-10.7 (= ${server:Version}),
+ mariadb-server-10.8 (= ${server:Version}),
${misc:Depends},
${shlibs:Depends}
Breaks: mariadb-oqgraph-engine-10.0,
@@ -850,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.7 (= ${server:Version}),
+Depends: mariadb-server-10.8 (= ${server:Version}),
${misc:Depends},
${shlibs:Depends}
Breaks: mariadb-server-10.0,
@@ -870,7 +892,7 @@ Description: Mroonga storage engine for MariaDB
Package: mariadb-plugin-spider
Architecture: any
-Depends: mariadb-server-10.7 (= ${server:Version}),
+Depends: mariadb-server-10.8 (= ${server:Version}),
${misc:Depends},
${shlibs:Depends}
Breaks: mariadb-server-10.0,
@@ -892,7 +914,7 @@ Description: Spider storage engine for MariaDB
Package: mariadb-plugin-gssapi-server
Architecture: any
Depends: libgssapi-krb5-2,
- mariadb-server-10.7,
+ mariadb-server-10.8,
${misc:Depends},
${shlibs:Depends}
Breaks: mariadb-gssapi-server-10.1,
@@ -913,7 +935,7 @@ Package: mariadb-plugin-gssapi-client
Architecture: any
Multi-Arch: same
Depends: libgssapi-krb5-2,
- mariadb-client-10.7 (= ${binary:Version}),
+ mariadb-client-10.8 (= ${binary:Version}),
${misc:Depends},
${shlibs:Depends}
Breaks: mariadb-gssapi-client-10.1,
@@ -933,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.7,
+ mariadb-server-10.8,
${misc:Depends},
${shlibs:Depends}
Description: CrackLib Password Validation Plugin for MariaDB
@@ -944,7 +966,7 @@ Description: CrackLib Password Validation Plugin for MariaDB
Package: mariadb-plugin-provider-bzip2
Architecture: any
-Depends: mariadb-server-10.7,
+Depends: mariadb-server-10.8,
${misc:Depends},
${shlibs:Depends}
Description: BZip2 compression support in the server and storage engines
@@ -958,7 +980,7 @@ Description: BZip2 compression support in the server and storage engines
Package: mariadb-plugin-provider-lz4
Architecture: any
-Depends: mariadb-server-10.7,
+Depends: mariadb-server-10.8,
${misc:Depends},
${shlibs:Depends}
Description: LZ4 compression support in the server and storage engines
@@ -972,7 +994,7 @@ Description: LZ4 compression support in the server and storage engines
Package: mariadb-plugin-provider-lzma
Architecture: any
-Depends: mariadb-server-10.7,
+Depends: mariadb-server-10.8,
${misc:Depends},
${shlibs:Depends}
Description: LZMA compression support in the server and storage engines
@@ -986,7 +1008,7 @@ Description: LZMA compression support in the server and storage engines
Package: mariadb-plugin-provider-lzo
Architecture: any
-Depends: mariadb-server-10.7,
+Depends: mariadb-server-10.8,
${misc:Depends},
${shlibs:Depends}
Description: LZO compression support in the server and storage engines
@@ -1000,7 +1022,7 @@ Description: LZO compression support in the server and storage engines
Package: mariadb-plugin-provider-snappy
Architecture: any
-Depends: mariadb-server-10.7,
+Depends: mariadb-server-10.8,
${misc:Depends},
${shlibs:Depends}
Description: Snappy compression support in the server and storage engines
@@ -1014,8 +1036,8 @@ Description: Snappy compression support in the server and storage engines
Package: mariadb-test
Architecture: any
-Depends: mariadb-client-10.7 (= ${binary:Version}),
- mariadb-server-10.7 (= ${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.7.README.Debian b/debian/mariadb-client-10.8.README.Debian
index 64f0f509951..64f0f509951 100644
--- a/debian/mariadb-client-10.7.README.Debian
+++ b/debian/mariadb-client-10.8.README.Debian
diff --git a/debian/mariadb-client-10.7.docs b/debian/mariadb-client-10.8.docs
index c09092629c3..c09092629c3 100644
--- a/debian/mariadb-client-10.7.docs
+++ b/debian/mariadb-client-10.8.docs
diff --git a/debian/mariadb-client-10.7.install b/debian/mariadb-client-10.8.install
index 3a92ded15b6..3a92ded15b6 100644
--- a/debian/mariadb-client-10.7.install
+++ b/debian/mariadb-client-10.8.install
diff --git a/debian/mariadb-client-10.7.links b/debian/mariadb-client-10.8.links
index bc42197629b..bc42197629b 100644
--- a/debian/mariadb-client-10.7.links
+++ b/debian/mariadb-client-10.8.links
diff --git a/debian/mariadb-client-10.7.manpages b/debian/mariadb-client-10.8.manpages
index 8735caeea8b..8735caeea8b 100644
--- a/debian/mariadb-client-10.7.manpages
+++ b/debian/mariadb-client-10.8.manpages
diff --git a/debian/mariadb-client-10.7.menu b/debian/mariadb-client-10.8.menu
index edd489cf316..0667c93e8f3 100644
--- a/debian/mariadb-client-10.7.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.7):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.7.install b/debian/mariadb-client-core-10.8.install
index 421b62d2a1a..421b62d2a1a 100644
--- a/debian/mariadb-client-core-10.7.install
+++ b/debian/mariadb-client-core-10.8.install
diff --git a/debian/mariadb-client-core-10.7.links b/debian/mariadb-client-core-10.8.links
index 5134dd814b5..5134dd814b5 100644
--- a/debian/mariadb-client-core-10.7.links
+++ b/debian/mariadb-client-core-10.8.links
diff --git a/debian/mariadb-server-10.7.README.Debian b/debian/mariadb-server-10.8.README.Debian
index 6042249a706..6042249a706 100644
--- a/debian/mariadb-server-10.7.README.Debian
+++ b/debian/mariadb-server-10.8.README.Debian
diff --git a/debian/mariadb-server-10.7.config b/debian/mariadb-server-10.8.config
index f47b147ee62..448b51584ea 100644
--- a/debian/mariadb-server-10.7.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.7/nis_warning || true
+ db_input high mariadb-server-10.8/nis_warning || true
db_go
fi
diff --git a/debian/mariadb-server-10.7.dirs b/debian/mariadb-server-10.8.dirs
index 5057fe806c3..5057fe806c3 100644
--- a/debian/mariadb-server-10.7.dirs
+++ b/debian/mariadb-server-10.8.dirs
diff --git a/debian/mariadb-server-10.7.install b/debian/mariadb-server-10.8.install
index ea17c087953..71fe6bc77d5 100644
--- a/debian/mariadb-server-10.7.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.7.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
@@ -53,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.7/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
@@ -78,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.7.links b/debian/mariadb-server-10.8.links
index 9cc3a436ba8..9cc3a436ba8 100644
--- a/debian/mariadb-server-10.7.links
+++ b/debian/mariadb-server-10.8.links
diff --git a/debian/mariadb-server-10.7.logcheck.ignore.paranoid b/debian/mariadb-server-10.8.logcheck.ignore.paranoid
index 407d4063270..407d4063270 100644
--- a/debian/mariadb-server-10.7.logcheck.ignore.paranoid
+++ b/debian/mariadb-server-10.8.logcheck.ignore.paranoid
diff --git a/debian/mariadb-server-10.7.logcheck.ignore.server b/debian/mariadb-server-10.8.logcheck.ignore.server
index a64fc54e15c..a64fc54e15c 100644
--- a/debian/mariadb-server-10.7.logcheck.ignore.server
+++ b/debian/mariadb-server-10.8.logcheck.ignore.server
diff --git a/debian/mariadb-server-10.7.logcheck.ignore.workstation b/debian/mariadb-server-10.8.logcheck.ignore.workstation
index a64fc54e15c..a64fc54e15c 100644
--- a/debian/mariadb-server-10.7.logcheck.ignore.workstation
+++ b/debian/mariadb-server-10.8.logcheck.ignore.workstation
diff --git a/debian/mariadb-server-10.7.mariadb.init b/debian/mariadb-server-10.8.mariadb.init
index d2a11d6471e..90a99cca873 100644
--- a/debian/mariadb-server-10.7.mariadb.init
+++ b/debian/mariadb-server-10.8.mariadb.init
@@ -165,7 +165,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.7/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.7.mysql-server.logrotate b/debian/mariadb-server-10.8.mysql-server.logrotate
index 11e4480c427..11e4480c427 100644
--- a/debian/mariadb-server-10.7.mysql-server.logrotate
+++ b/debian/mariadb-server-10.8.mysql-server.logrotate
diff --git a/debian/mariadb-server-10.7.mysql.default b/debian/mariadb-server-10.8.mysql.default
index 36079edecb2..36079edecb2 100644
--- a/debian/mariadb-server-10.7.mysql.default
+++ b/debian/mariadb-server-10.8.mysql.default
diff --git a/debian/mariadb-server-10.7.postinst b/debian/mariadb-server-10.8.postinst
index 93a1e4e8b87..93a1e4e8b87 100644
--- a/debian/mariadb-server-10.7.postinst
+++ b/debian/mariadb-server-10.8.postinst
diff --git a/debian/mariadb-server-10.7.postrm b/debian/mariadb-server-10.8.postrm
index 94ce91db31d..94ce91db31d 100644
--- a/debian/mariadb-server-10.7.postrm
+++ b/debian/mariadb-server-10.8.postrm
diff --git a/debian/mariadb-server-10.7.preinst b/debian/mariadb-server-10.8.preinst
index 79c6ccc8500..79c6ccc8500 100644
--- a/debian/mariadb-server-10.7.preinst
+++ b/debian/mariadb-server-10.8.preinst
diff --git a/debian/mariadb-server-10.7.prerm b/debian/mariadb-server-10.8.prerm
index 8fd172da9d2..8fd172da9d2 100644
--- a/debian/mariadb-server-10.7.prerm
+++ b/debian/mariadb-server-10.8.prerm
diff --git a/debian/mariadb-server-10.7.templates b/debian/mariadb-server-10.8.templates
index 916baf0d483..910ba82f108 100644
--- a/debian/mariadb-server-10.7.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.7/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.7/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.7/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.7.triggers b/debian/mariadb-server-10.8.triggers
index d1f5f5e14f1..d1f5f5e14f1 100644
--- a/debian/mariadb-server-10.7.triggers
+++ b/debian/mariadb-server-10.8.triggers
diff --git a/debian/mariadb-server-core-10.7.install b/debian/mariadb-server-core-10.8.install
index def95268512..def95268512 100644
--- a/debian/mariadb-server-core-10.7.install
+++ b/debian/mariadb-server-core-10.8.install
diff --git a/debian/mariadb-server-core-10.7.links b/debian/mariadb-server-core-10.8.links
index c2be98f38fb..c2be98f38fb 100644
--- a/debian/mariadb-server-core-10.7.links
+++ b/debian/mariadb-server-core-10.8.links
diff --git a/debian/not-installed b/debian/not-installed
index ff05d1827ef..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.7/COPYING
-usr/share/doc/mariadb-server-10.7/COPYING.AGPLv3
-usr/share/doc/mariadb-server-10.7/COPYING.GPLv2
-usr/share/doc/mariadb-server-10.7/COPYING.thirdparty
-usr/share/doc/mariadb-server-10.7/CREDITS
-usr/share/doc/mariadb-server-10.7/EXCEPTIONS-CLIENT
-usr/share/doc/mariadb-server-10.7/INSTALL-BINARY
-usr/share/doc/mariadb-server-10.7/PATENTS
-usr/share/doc/mariadb-server-10.7/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 d96402785cc..dd5f492240d 100644
--- a/debian/po/POTFILES.in
+++ b/debian/po/POTFILES.in
@@ -1 +1 @@
-[type: gettext/rfc822deb] mariadb-server-10.7.templates
+[type: gettext/rfc822deb] mariadb-server-10.8.templates
diff --git a/debian/po/ar.po b/debian/po/ar.po
index b4a2ff0aab3..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.7@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.7.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.7.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.7.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.7.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.7.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "ملاحظة هامة لمستخدمي NIS/YP"
#. Type: note
#. Description
-#: ../mariadb-server-10.7.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.7.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.7.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "إزالة جميع قواعد بيانات MariaDB؟"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.7.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.7.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 8796ca196a8..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.7 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.7\n"
-"Report-Msgid-Bugs-To: mariadb-10.7@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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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 573fc645663..4eefea44b5c 100644
--- a/debian/po/cs.po
+++ b/debian/po/cs.po
@@ -13,8 +13,8 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: mariadb-10.7\n"
-"Report-Msgid-Bugs-To: mariadb-10.7@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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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 aa45b277904..c4b43d2bf38 100644
--- a/debian/po/da.po
+++ b/debian/po/da.po
@@ -1,13 +1,13 @@
-# Danish translation mariadb-10.7.
-# Copyright (C) 2014 mariadb-10.7 og nedenstående oversættere.
-# This file is distributed under the same license as the mariadb-10.7 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.7\n"
-"Report-Msgid-Bugs-To: mariadb-10.7@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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "Fjern alle MariaDB-databaser?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.7.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.7.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 fdbd3f2986a..1d0f80e42e2 100644
--- a/debian/po/de.po
+++ b/debian/po/de.po
@@ -1,4 +1,4 @@
-# German translation of mariadb-10.7 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.7@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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "Alle MariaDB-Datenbanken entfernen?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.7.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.7.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 82f1a8ed576..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.7@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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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 67e07070a3d..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.7@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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "Ezabatu MariaDB datubase guztiak?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.7.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.7.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 b787b265ea3..1e10a5042c7 100644
--- a/debian/po/fi.po
+++ b/debian/po/fi.po
@@ -1,11 +1,11 @@
-# Finnish translations for mariadb-10.7 package
-# This file is distributed under the same license as the mariadb-10.7 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.7\n"
-"Report-Msgid-Bugs-To: mariadb-10.7@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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "Poistetaanko kaikki MariaDB-tietokannat?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.7.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.7.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 ade489bae0f..bb408ebbf18 100644
--- a/debian/po/fr.po
+++ b/debian/po/fr.po
@@ -1,6 +1,6 @@
-# Translation of mariadb-10.7 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.7 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.7@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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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 a18097f76cd..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.7@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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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 eeef6960313..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.7
-# This file is distributed under the same license as the mariadb-10.7 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.7 10.0.13 Italian debconf templates\n"
-"Report-Msgid-Bugs-To: mariadb-10.7@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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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 a2a8583843c..9131a8382f5 100644
--- a/debian/po/ja.po
+++ b/debian/po/ja.po
@@ -15,8 +15,8 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: mariadb-10.7 10.0.32-1\n"
-"Report-Msgid-Bugs-To: mariadb-10.7@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.7.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.7.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.7.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.7.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.7.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "NIS/YP ユーザã¸ã®é‡è¦ãªæ³¨æ„"
#. Type: note
#. Description
-#: ../mariadb-server-10.7.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.7.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.7.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "ã™ã¹ã¦ã® MariaDB データベースを削除ã—ã¾ã™ã‹?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.7.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.7.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 a3a9e069486..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.7@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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.7.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.7.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 00ab55777c6..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.7 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.7@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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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 8c7823c8edf..997dfccd617 100644
--- a/debian/po/pt.po
+++ b/debian/po/pt.po
@@ -6,8 +6,8 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: mariadb-10.7\n"
-"Report-Msgid-Bugs-To: mariadb-10.7@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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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 d0a4c6db8fe..ac94a297e2a 100644
--- a/debian/po/pt_BR.po
+++ b/debian/po/pt_BR.po
@@ -1,12 +1,12 @@
-# Debconf translations for mariadb-10.7.
-# This file is distributed under the same license as the mariadb-10.7 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.7\n"
-"Report-Msgid-Bugs-To: mariadb-10.7@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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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 6fda31dc508..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.7@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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.7.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.7.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 ecdc8e658f7..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.7 10.0.25-1\n"
-"Report-Msgid-Bugs-To: mariadb-10.7@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.7.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.7.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.7.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.7.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.7.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr "Важное замечание Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ NIS/YP"
#. Type: note
#. Description
-#: ../mariadb-server-10.7.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.7.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.7.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr "Удалить вÑе базы данных MariaDB?"
#. Type: boolean
#. Description
-#: ../mariadb-server-10.7.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.7.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 4ac8f477339..85674730c3a 100644
--- a/debian/po/sv.po
+++ b/debian/po/sv.po
@@ -1,13 +1,13 @@
-# Translation of mariadb-10.7 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.7 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.7@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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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 26d3231f0cd..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.7 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.7\n"
-"Report-Msgid-Bugs-To: mariadb-10.7@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.7.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.7.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.7.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.7.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.7.templates:3001
+#: ../mariadb-server-10.8.templates:3001
msgid "Important note for NIS/YP users"
msgstr ""
#. Type: note
#. Description
-#: ../mariadb-server-10.7.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.7.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.7.templates:4001
+#: ../mariadb-server-10.8.templates:4001
msgid "Remove all MariaDB databases?"
msgstr ""
#. Type: boolean
#. Description
-#: ../mariadb-server-10.7.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.7.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 2df83c2b502..cacd305029e 100644
--- a/debian/po/tr.po
+++ b/debian/po/tr.po
@@ -5,8 +5,8 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: mariadb-10.7\n"
-"Report-Msgid-Bugs-To: mariadb-10.7@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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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 6ff1185b81c..c1dd1c22e10 100644
--- a/debian/po/vi.po
+++ b/debian/po/vi.po
@@ -1,12 +1,12 @@
-# Vietnamese translations for mariadb-10.7 package
-# Bản dịch Tiếng Việt dành cho gói mariadb-10.7.
-# This file is distributed under the same license as the mariadb-10.7 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.7\n"
-"Report-Msgid-Bugs-To: mariadb-10.7@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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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 2b30f471ae2..3878457c637 100755
--- a/debian/rules
+++ b/debian/rules
@@ -134,12 +134,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.7.mariadb.service
- cp $(BUILDDIR)/support-files/mariadb.socket debian/mariadb-server-10.7.mariadb.socket
- cp $(BUILDDIR)/support-files/mariadb-extra.socket debian/mariadb-server-10.7.mariadb-extra.socket
- cp $(BUILDDIR)/support-files/mariadb@.service debian/mariadb-server-10.7.mariadb@.service
- cp $(BUILDDIR)/support-files/mariadb@.socket debian/mariadb-server-10.7.mariadb@.socket
- cp $(BUILDDIR)/support-files/mariadb-extra@.socket debian/mariadb-server-10.7.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
@@ -158,7 +158,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.7/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 417bad0f70d..86cb9498dd6 100644
--- a/debian/salsa-ci.yml
+++ b/debian/salsa-ci.yml
@@ -213,7 +213,7 @@ fresh install:
script:
- *test-prepare-container
- *test-install
- - service mariadb status # There is no init.d/mysql in MariaDB 10.7
+ - service mariadb status # There is no init.d/mysql in MariaDB 10.8
- *test-verify-final
variables:
GIT_STRATEGY: none
@@ -221,7 +221,7 @@ fresh install:
variables:
- $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
-mariadb-10.7 Sid upgrade:
+mariadb-10.8 Sid upgrade:
stage: upgrade in Sid
needs:
- job: build
@@ -234,7 +234,7 @@ mariadb-10.7 Sid upgrade:
script:
- *test-prepare-container
- *test-install
- - service mariadb status # There is no init.d/mysql in MariaDB 10.7
+ - service mariadb status # There is no init.d/mysql in MariaDB 10.8
- *test-verify-final
variables:
GIT_STRATEGY: none
@@ -242,7 +242,7 @@ mariadb-10.7 Sid upgrade:
variables:
- $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
-mariadb-10.5 Bullseye to mariadb-10.7 upgrade:
+mariadb-10.5 Bullseye to mariadb-10.8 upgrade:
stage: upgrade from Bullseye/Buster
needs:
- job: build
@@ -268,7 +268,7 @@ mariadb-10.5 Bullseye to mariadb-10.7 upgrade:
variables:
- $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
-mariadb-10.3 Buster to mariadb-10.7 upgrade:
+mariadb-10.3 Buster to mariadb-10.8 upgrade:
stage: upgrade from Bullseye/Buster
needs:
- job: build
@@ -307,7 +307,7 @@ test basic features:
script:
- *test-prepare-container
- *test-install
- - service mariadb status # There is no init.d/mysql in MariaDB 10.7
+ - service mariadb status # There is no init.d/mysql in MariaDB 10.8
- *test-verify-final
- |
# Print info about server
@@ -495,7 +495,7 @@ default-libmysqlclient-dev Buster 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 Sid to mariadb-10.7 upgrade:
+mysql-8.0 Sid to mariadb-10.8 upgrade:
stage: upgrade in Sid
needs:
- job: build
@@ -522,7 +522,7 @@ mysql-8.0 Sid to mariadb-10.7 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.7 upgrade:
+mysql-8.0 Focal to mariadb-10.8 upgrade:
stage: upgrade extras
needs:
- job: build buster-backports
@@ -555,7 +555,47 @@ mysql-8.0 Focal to mariadb-10.7 upgrade:
variables:
- $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
-mariadb.org-10.6 to mariadb-10.7 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
@@ -582,7 +622,7 @@ mariadb.org-10.6 to mariadb-10.7 upgrade:
# 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.7
+ - service mariadb status # There is no init.d/mysql in MariaDB 10.8
- *test-verify-final
variables:
GIT_STRATEGY: none
@@ -590,12 +630,12 @@ mariadb.org-10.6 to mariadb-10.7 upgrade:
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.7
+ # 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.7
+ # Remove this allow_failure once buildbot has built a new 10.8
# release using latest liburing-dev in Debian Sid.
-mariadb.org-10.5 to mariadb-10.7 upgrade:
+mariadb.org-10.5 to mariadb-10.8 upgrade:
stage: upgrade extras
needs:
- job: build
@@ -625,7 +665,7 @@ mariadb.org-10.5 to mariadb-10.7 upgrade:
variables:
- $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
-mariadb.org-10.4 to mariadb-10.7 upgrade:
+mariadb.org-10.4 to mariadb-10.8 upgrade:
stage: upgrade extras
needs:
- job: build
@@ -658,7 +698,7 @@ mariadb.org-10.4 to mariadb-10.7 upgrade:
variables:
- $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
-mariadb.org-10.3 to mariadb-10.7 upgrade:
+mariadb.org-10.3 to mariadb-10.8 upgrade:
stage: upgrade extras
needs:
- job: build
@@ -689,7 +729,7 @@ mariadb.org-10.3 to mariadb-10.7 upgrade:
variables:
- $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
-mariadb.org-10.2 to mariadb-10.7 upgrade:
+mariadb.org-10.2 to mariadb-10.8 upgrade:
stage: upgrade extras
needs:
- job: build
@@ -728,7 +768,7 @@ mariadb.org-10.2 to mariadb-10.7 upgrade:
variables:
- $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
-mysql.com-5.7 to mariadb-10.7 upgrade:
+mysql.com-5.7 to mariadb-10.8 upgrade:
stage: upgrade extras
needs:
- job: build buster-backports
@@ -759,7 +799,7 @@ mysql.com-5.7 to mariadb-10.7 upgrade:
variables:
- $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/
-percona-xtradb-5.7 to mariadb-10.7 upgrade (MDEV-22679):
+percona-xtradb-5.7 to mariadb-10.8 upgrade (MDEV-22679):
stage: upgrade extras
needs:
- job: build buster-backports
diff --git a/debian/source/lintian-overrides b/debian/source/lintian-overrides
index c8793e1aa02..998aa4810b1 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.7 -> mysql-client-5.5
-version-substvar-for-external-package mariadb-server-10.7 -> 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.7 -> mysql-client-5.*
-version-substvar-for-external-package mariadb-server-10.7 -> mysql-client-8.*
-version-substvar-for-external-package mariadb-client-10.7 -> mysql-client-core-5.*
-version-substvar-for-external-package mariadb-client-10.7 -> 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 1aae1ecf5bd..743f6497702 100644
--- a/debian/tests/control
+++ b/debian/tests/control
@@ -3,7 +3,7 @@ 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.7,
+Depends: mariadb-plugin-rocksdb | mariadb-server-10.8,
mariadb-plugin-provider-bzip2,
mariadb-plugin-provider-lz4,
mariadb-plugin-provider-lzma,
diff --git a/debian/tests/smoke b/debian/tests/smoke
index 9838bb90081..07dc3df1948 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.7).
+# mariadb-server-10.8).
#
# This test should be declared in debian/tests/control with the
# following restrictions:
@@ -93,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.7, which happens before that of the plugin.
+ # mariadb-server-10.8, which happens before that of the plugin.
[ -e $LOG ] || mysql -e "INSTALL PLUGIN RocksDB SONAME 'ha_rocksdb';"
# XXX: rocksdb_supported_compression_types variable does not report ZSTD.
diff --git a/extra/innochecksum.cc b/extra/innochecksum.cc
index 82b88f7072d..c0dd80cf02f 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>
@@ -635,7 +634,7 @@ static bool update_checksum(byte* page, uint32_t 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);
diff --git a/extra/mariabackup/CMakeLists.txt b/extra/mariabackup/CMakeLists.txt
index afb172dbbaa..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
diff --git a/extra/mariabackup/backup_copy.cc b/extra/mariabackup/backup_copy.cc
index ce94ef5864d..49dd716f15f 100644
--- a/extra/mariabackup/backup_copy.cc
+++ b/extra/mariabackup/backup_copy.cc
@@ -1842,26 +1842,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/changed_page_bitmap.cc b/extra/mariabackup/changed_page_bitmap.cc
index ac67bb9b924..993288b79e1 100644
--- a/extra/mariabackup/changed_page_bitmap.cc
+++ b/extra/mariabackup/changed_page_bitmap.cc
@@ -589,7 +589,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. */
@@ -599,7 +599,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/xb_plugin.cc b/extra/mariabackup/xb_plugin.cc
index 3384e1c07e5..7470d376eaa 100644
--- a/extra/mariabackup/xb_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
@@ -23,7 +23,7 @@
#include <vector>
#include <common.h>
#include <backup_mysql.h>
-#include <log0crypt.h>
+#include <srv0srv.h>
extern struct st_maria_plugin *mysql_optional_plugins[];
diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc
index 3ef5ce1b40c..a5fca55355a 100644
--- a/extra/mariabackup/xtrabackup.cc
+++ b/extra/mariabackup/xtrabackup.cc
@@ -187,9 +187,6 @@ 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;
static bool log_copying_running;
int xtrabackup_parallel;
@@ -349,7 +346,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 */
@@ -810,9 +806,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;
}
@@ -832,7 +827,7 @@ static void backup_file_op(uint32_t 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:
@@ -871,7 +866,6 @@ static void backup_file_op(uint32_t space_id, int type,
ut_ad(0);
break;
}
- pthread_mutex_unlock(&backup_mutex);
}
@@ -1595,15 +1589,15 @@ 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},
{"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},
@@ -2155,7 +2149,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_file_io_threads = (uint) innobase_file_io_threads;
srv_n_read_io_threads = (uint) innobase_read_io_threads;
@@ -2241,30 +2235,91 @@ 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 (err == DB_SUCCESS)
+ err= srv_start(create_new_db);
- if (err != DB_SUCCESS) {
- die("mariabackup: innodb_init() returned %d (%s).",
- err, ut_strerr(err));
- }
+ if (err != DB_SUCCESS)
+ {
+ msg("mariadb-backup: srv_start() returned %d (%s).", err, ut_strerr(err));
+ return true;
+ }
- return(FALSE);
+ ut_ad(srv_force_recovery <= SRV_FORCE_IGNORE_CORRUPT);
+ ut_ad(recv_no_log_write);
+ buf_flush_sync();
+ 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 ================= */
@@ -2497,10 +2552,10 @@ void xtrabackup_io_throttling()
if (!xtrabackup_backup)
return;
- mysql_mutex_lock(&log_sys.mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
if (xtrabackup_throttle && (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
@@ -2812,9 +2867,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);
@@ -2884,11 +2939,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 */
@@ -2925,169 +2980,231 @@ 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)
+/** Copy redo log until the current end of the log is reached
+@return whether the operation failed */
+static bool xtrabackup_copy_logfile()
{
- 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);
- }
+ mysql_mutex_assert_owner(&recv_sys.mutex);
+ DBUG_EXECUTE_IF("log_checksum_mismatch", return false;);
- recv_sys_justify_left_parsing_buf();
+ 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};
- 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);
- }
+#ifdef HAVE_PMEM
+ if (log_sys.is_pmem())
+ {
+ recv_sys.offset= size_t(log_sys.calc_lsn_offset(recv_sys.lsn));
+ 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 (ds_write(dst_log_file, log_sys.buf, write_size)) {
- msg("Error: write to logfile failed");
- return(0);
- }
- }
+ for (unsigned retry_count{0};;)
+ {
+ recv_sys_t::parse_mtr_result r;
+ size_t start_offset{recv_sys.offset};
- return(scanned_lsn);
-}
+#ifdef HAVE_PMEM
+ if (log_sys.is_pmem())
+ {
+ if ((ut_d(r=) recv_sys.parse_pmem(STORE_NO)) != recv_sys_t::OK)
+ {
+ ut_ad(r == recv_sys_t::GOT_EOF);
+ goto retry;
+ }
-/** 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)
-{
- mysql_mutex_assert_owner(&log_sys.mutex);
+ retry_count= 0;
- ut_a(dst_log_file != NULL);
- ut_ad(recv_sys.is_initialised());
+ do
+ {
+ const byte seq{log_sys.get_sequence_bit(recv_sys.lsn -
+ sequence_offset)};
+ ut_ad(recv_sys.offset >= log_sys.START_OFFSET);
+ ut_ad(recv_sys.offset < recv_sys.len);
+ ut_ad(log_sys.buf[recv_sys.offset
+ >= log_sys.START_OFFSET + sequence_offset
+ ? recv_sys.offset - sequence_offset
+ : recv_sys.len - sequence_offset +
+ recv_sys.offset - log_sys.START_OFFSET] ==
+ seq);
+ static const byte seq_1{1};
+ if (UNIV_UNLIKELY(start_offset > recv_sys.offset))
+ {
+ const ssize_t so(recv_sys.offset - (log_sys.START_OFFSET +
+ sequence_offset));
+ if (so <= 0)
+ {
+ if (ds_write(dst_log_file, log_sys.buf + start_offset,
+ recv_sys.len - start_offset + so) ||
+ ds_write(dst_log_file, &seq_1, 1))
+ goto write_error;
+ if (so < -1 &&
+ ds_write(dst_log_file, log_sys.buf + recv_sys.len + (1 + so),
+ -(1 + so)))
+ goto write_error;
+ if (ds_write(dst_log_file, log_sys.buf + log_sys.START_OFFSET,
+ recv_sys.offset - log_sys.START_OFFSET))
+ goto write_error;
+ }
+ else
+ {
+ if (ds_write(dst_log_file, log_sys.buf + start_offset,
+ recv_sys.len - start_offset))
+ goto write_error;
+ if (ds_write(dst_log_file, log_sys.buf + log_sys.START_OFFSET, so))
+ goto write_error;
+ if (ds_write(dst_log_file, &seq_1, 1))
+ goto write_error;
+ if (so > 1 &&
+ ds_write(dst_log_file, log_sys.buf + recv_sys.offset -
+ (so - 1), so - 1))
+ goto write_error;
+ }
+ }
+ else if (seq == 1)
+ {
+ if (ds_write(dst_log_file, log_sys.buf + start_offset,
+ recv_sys.offset - start_offset))
+ goto write_error;
+ }
+ else if (ds_write(dst_log_file, log_sys.buf + start_offset,
+ recv_sys.offset - start_offset - sequence_offset) ||
+ ds_write(dst_log_file, &seq_1, 1) ||
+ ds_write(dst_log_file, log_sys.buf +
+ recv_sys.offset - sequence_offset + 1,
+ sequence_offset - 1))
+ goto write_error;
+
+ start_offset= recv_sys.offset;
+ }
+ while ((ut_d(r=)recv_sys.parse_pmem(STORE_NO)) == recv_sys_t::OK);
- bool overwritten_block = false;
- lsn_t start_lsn;
- lsn_t end_lsn;
+ ut_ad(r == recv_sys_t::GOT_EOF);
+ pthread_cond_broadcast(&scanned_lsn_cond);
+ break;
+ }
+ else
+#endif
+ {
+ {
+ 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;
+ }
- recv_sys.parse_start_lsn = log_copy_scanned_lsn;
- recv_sys.scanned_lsn = log_copy_scanned_lsn;
+ if (log_sys.buf[recv_sys.offset] <= 1)
+ break;
- start_lsn = ut_uint64_align_down(log_copy_scanned_lsn,
- OS_FILE_LOG_BLOCK_SIZE);
- do {
- end_lsn = start_lsn + RECV_SCAN_SIZE;
+ 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 (xtrabackup_throttle && (io_ticket--) < 0) {
- mysql_cond_wait(&wait_throttle, &log_sys.mutex);
- }
+ if (ds_write(dst_log_file, log_sys.buf + start_offset,
+ recv_sys.offset - start_offset))
+ {
+#ifdef HAVE_PMEM
+ write_error:
+#endif
+ 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;
+ }
- 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);
- }
+ pthread_cond_broadcast(&scanned_lsn_cond);
- 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 (r == recv_sys_t::GOT_EOF)
+ break;
- 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 (recv_sys.offset < log_sys.get_block_size())
+ break;
- die("xtrabackup_copy_logfile() failed: %s", reason);
- return true;
- }
- } while (start_lsn == end_lsn);
+ if (xtrabackup_throttle && io_ticket-- < 0)
+ mysql_cond_wait(&wait_throttle, &recv_sys.mutex);
- ut_ad(start_lsn == log_sys.log.scanned_lsn);
+ retry_count= 0;
+ continue;
+ }
+ else
+ {
+ recv_sys.len= recv_sys.offset & ~block_size_1;
+#ifdef HAVE_PMEM
+ retry:
+#endif
+ if (retry_count == 100)
+ break;
- msg(">> log scanned up to (" LSN_PF ")", start_lsn);
+ 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);
+ }
- /* 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);
+ 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;
@@ -3095,16 +3212,16 @@ 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();
}
@@ -3117,13 +3234,13 @@ static void *io_watching_thread(void*)
/* currently, for --backup only */
ut_a(xtrabackup_backup);
- mysql_mutex_lock(&log_sys.mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
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);
}
@@ -3131,7 +3248,7 @@ static void *io_watching_thread(void*)
/* stop io throttle */
xtrabackup_throttle= 0;
mysql_cond_broadcast(&wait_throttle);
- mysql_mutex_unlock(&log_sys.mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
return nullptr;
}
@@ -3218,7 +3335,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)
@@ -3353,7 +3470,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;
@@ -3388,7 +3504,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) {
@@ -3911,7 +4027,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);
@@ -3925,8 +4040,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);
}
@@ -4406,43 +4520,38 @@ static void stop_backup_threads(bool running)
@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;
mysql_cond_broadcast(&log_copying_stop);
const bool running= log_copying_running;
- mysql_mutex_unlock(&log_sys.mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
stop_backup_threads(running);
- mysql_mutex_lock(&log_sys.mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
}
- 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;
@@ -4458,7 +4567,7 @@ static bool xtrabackup_backup_low()
strcpy(metadata_type, "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.");
@@ -4496,7 +4605,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
@@ -4532,10 +4640,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;
mysql_cond_broadcast(&log_copying_stop);
- mysql_mutex_unlock(&log_sys.mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
stop_backup_threads(true);
}
@@ -4583,8 +4691,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
@@ -4603,45 +4730,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()) {
@@ -4658,44 +4746,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;
/* start io throttle */
if(xtrabackup_throttle) {
@@ -4707,27 +4764,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", {});
@@ -4784,7 +4840,6 @@ fail_before_log_copying_thread_start:
pthread_mutex_destroy(&count_mutex);
free(data_threads);
- }
bool ok = backup_start(corrupted_pages);
@@ -4813,24 +4868,23 @@ 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;
}
innodb_shutdown();
log_file_op = 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);
@@ -4866,9 +4920,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", {});
@@ -5156,7 +5210,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 */
@@ -5169,7 +5223,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;
}
@@ -5986,7 +6040,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();
@@ -5997,7 +6053,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)
@@ -6017,14 +6073,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;
@@ -6047,7 +6103,7 @@ static bool xtrabackup_prepare_func(char** argv)
}
if (innodb_init()) {
- goto error_cleanup;
+ goto error;
}
ut_ad(!fil_system.freeze_space_list);
@@ -6083,11 +6139,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
@@ -6132,7 +6187,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();
}
diff --git a/extra/mariabackup/xtrabackup.h b/extra/mariabackup/xtrabackup.h
index b498d6f5a2e..430a72f2b9f 100644
--- a/extra/mariabackup/xtrabackup.h
+++ b/extra/mariabackup/xtrabackup.h
@@ -80,9 +80,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/json_lib.h b/include/json_lib.h
index ea7f102fd02..2d85a7653f2 100644
--- a/include/json_lib.h
+++ b/include/json_lib.h
@@ -374,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)
+
/*
Converst JSON string constant into ordinary string constant
which can involve unpacking json escapes and changing character set.
@@ -386,10 +389,13 @@ int json_unescape(CHARSET_INFO *json_cs,
uchar *res, uchar *res_end);
/*
- Converst 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);
diff --git a/include/m_ctype.h b/include/m_ctype.h
index 4a231caeda9..442133f3ba7 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, tertiarty) */
diff --git a/include/my_global.h b/include/my_global.h
index 224909116dd..27df0da1454 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 5a6f4a87012..fb0ef0ef5b9 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
guarenteed 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 6a0c92b4a07..b5e8b197664 100644
--- a/include/my_sys.h
+++ b/include/my_sys.h
@@ -178,6 +178,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);
@@ -850,7 +851,6 @@ extern void delete_dynamic(DYNAMIC_ARRAY *array);
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))
@@ -1087,6 +1087,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,
@@ -1098,13 +1101,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/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/libmariadb b/libmariadb
-Subproject ade9bb9c3ef5f28a4f076ed3afa455975a8e5ab
+Subproject 4fc7903cf3b761492243b5562ba4141a1c02651
diff --git a/libmysqld/CMakeLists.txt b/libmysqld/CMakeLists.txt
index afa1edff421..cacaaae9a6d 100644
--- a/libmysqld/CMakeLists.txt
+++ b/libmysqld/CMakeLists.txt
@@ -138,6 +138,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}
)
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 a55c5a652a3..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\&.7" "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 8b2fb5f3a21..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\&.7" "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 b4904898c67..80a7c8cd360 100644
--- a/man/mysql.1
+++ b/man/mysql.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB\FR" "1" "15 May 2020" "MariaDB 10\&.7" "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 4a5c24deda2..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\&.7" "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 e696246337e..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\&.7" "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 5dbe2c2140c..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\&.7" "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 659066df0cd..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\&.7" "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 96f36d46e37..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\&.7" "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 ca42091826e..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\&.7" "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 970701fe2dc..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\&.7" "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 f6588aa9a58..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\&.7" "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 beb701824c7..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\&.7" "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 512f5684fb7..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\&.7" "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 aa11e84280f..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\&.7" "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 3018c656fcc..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\&.7" "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 f26ec2cb42d..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\&.7" "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 7dd4645b73c..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\&.7" "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 d13613e053f..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\&.7" "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 21f09be255f..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\&.7" "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 63667c09a4a..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\&.7" "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 7b6e4e2f544..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\&.7" "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 f06c021b23c..b04271ab4d6 100644
--- a/man/mysqld.8
+++ b/man/mysqld.8
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADBD\FR" "8" "15 May 2020" "MariaDB 10\&.7" "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 8ac13aae4bd..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\&.7" "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 48be990964d..62630b0bfab 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\&.7" "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 aad81bcc2f5..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\&.7" "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 0e544c198d4..0a0b29695df 100644
--- a/man/mysqldump.1
+++ b/man/mysqldump.1
@@ -1,6 +1,6 @@
'\" t
.\"
-.TH "\FBMARIADB-DUMP\FR" "1" "24 October 2020" "MariaDB 10\&.7" "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 530df5809ff..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\&.7" "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 7b08b7207e3..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\&.7" "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 af44d007eab..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\&.7" "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 6a7121863fd..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\&.7" "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 d6c1333e0ea..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\&.7" "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 16b4204e998..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\&.7" "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/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_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/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/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/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/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/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..c3f649cb7d4 100644
--- a/mysql-test/main/charset_client_win.test
+++ b/mysql-test/main/charset_client_win.test
@@ -1,2 +1,3 @@
--source include/windows.inc
+--source include/no_utf8_cli.inc
--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/cte_recursive.result b/mysql-test/main/cte_recursive.result
index 24dff8967a5..bb01d0d69a2 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_ldml.result b/mysql-test/main/ctype_ldml.result
index 05b31a4ea70..d4b24ad9af3 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
@@ -3042,3 +3045,37 @@ SHOW COLLATION LIKE 'latin1_test_replace';
Collation Charset Id Default Compiled Sortlen
SELECT 'foo' = 'foo ' COLLATE latin1_test_replace;
ERROR HY000: Unknown collation: 'latin1_test_replace'
+#
+# 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;
diff --git a/mysql-test/main/ctype_ldml.test b/mysql-test/main/ctype_ldml.test
index 155e584935b..0fda35d278d 100644
--- a/mysql-test/main/ctype_ldml.test
+++ b/mysql-test/main/ctype_ldml.test
@@ -33,6 +33,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';
@@ -615,3 +616,23 @@ SELECT 'a' COLLATE utf8_czech_test_bad_w2;
SHOW COLLATION LIKE 'latin1_test_replace';
--error ER_UNKNOWN_COLLATION
SELECT 'foo' = 'foo ' COLLATE latin1_test_replace;
+
+
+--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;
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..5515701cce4
--- /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
+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..82d1c86423f
--- /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
+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/derived_cond_pushdown.result b/mysql-test/main/derived_cond_pushdown.result
index 5b0cc4a08f5..9bbd32a9c84 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';
diff --git a/mysql-test/main/derived_view.result b/mysql-test/main/derived_view.result
index 50f6d381dd6..c73bc43a2a4 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..d82651c6700
--- /dev/null
+++ b/mysql-test/main/desc_index_range.result
@@ -0,0 +1,219 @@
+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..8f7ef07af49
--- /dev/null
+++ b/mysql-test/main/desc_index_range.test
@@ -0,0 +1,128 @@
+#
+# 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);
+
+select json_detailed(json_extract(trace, '$**.range_access_plan.ranges'))
+from information_schema.optimizer_trace;
+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;
+
+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;
+
+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;
+
+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;
+
+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;
+
+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;
+
+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;
+select json_detailed(json_extract(trace, '$**.potential_group_range_indexes'))
+from information_schema.optimizer_trace;
+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/except.result b/mysql-test/main/except.result
index 96efeb03c5e..c88b91991f2 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 2903ec857c3..f74aeda5ab2 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 6530bbd5893..3a779b2835f 100644
--- a/mysql-test/main/func_group.result
+++ b/mysql-test/main/func_group.result
@@ -318,7 +318,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 2d26861c710..8ff3689f452 100644
--- a/mysql-test/main/func_group.test
+++ b/mysql-test/main/func_group.test
@@ -206,7 +206,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_math.result b/mysql-test/main/func_math.result
index ec2521bcfd7..bebd7cd9655 100644
--- a/mysql-test/main/func_math.result
+++ b/mysql-test/main/func_math.result
@@ -1840,24 +1840,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 572e0fd0f6b..b30eda7eb94 100644
--- a/mysql-test/main/func_math.test
+++ b/mysql-test/main/func_math.test
@@ -849,15 +849,63 @@ SELECT CRC32('01234567'), CRC32('012345678');
SELECT CRC32('~!@$%^*'), CRC32('-0.0001');
SELECT CRC32(99999999999999999999999999999999);
SELECT CRC32(-99999999999999999999999999999999);
+SELECT CRC32C(NULL), CRC32C(''), CRC32C('MariaDB'), CRC32C('mariadb');
+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/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 356bb4b41df..1644a5f3573 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/having_cond_pushdown.result b/mysql-test/main/having_cond_pushdown.result
index ad8befb29d5..63a1bb3681e 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/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 f890a04bfee..c6890e464a8 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 8fe82b89380..4589d226fa3 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/join_cache.result b/mysql-test/main/join_cache.result
index 0fbb73f56fe..359739fecf8 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 fcffeb6d161..522b668e07b 100644
--- a/mysql-test/main/join_outer.result
+++ b/mysql-test/main/join_outer.result
@@ -2795,7 +2795,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:
@@ -2803,7 +2803,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 721989c3368..b579cfc6ac0 100644
--- a/mysql-test/main/join_outer_jcl6.result
+++ b/mysql-test/main/join_outer_jcl6.result
@@ -2802,7 +2802,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:
@@ -2810,7 +2810,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/key.result b/mysql-test/main/key.result
index 5d84068d8af..ff35288a6ea 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 4e3e02c8add..c95fc017a43 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;
@@ -603,3 +600,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/merge.result b/mysql-test/main/merge.result
index d1950d03939..2dcc5a1433b 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/multi_update.result b/mysql-test/main/multi_update.result
index 61e04c3d4a9..674dc79fe12 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 9de3c24301f..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
-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
-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
-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 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 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 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 7c1fe4ec1c8..00000000000
--- a/mysql-test/main/myisam-optimize.test
+++ /dev/null
@@ -1,58 +0,0 @@
---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;
diff --git a/mysql-test/main/myisam.result b/mysql-test/main/myisam.result
index 5c551a25afa..981131889e4 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 2ae4da671e6..c087af7b9a9 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;
#
@@ -1830,3 +1827,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..cf54e52610b 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
+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
+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
+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 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 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 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 5e133aea853..96fbf12f603 100644
--- a/mysql-test/main/myisam_optimize.test
+++ b/mysql-test/main/myisam_optimize.test
@@ -63,3 +63,61 @@ 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;
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/mysqld--help.result b/mysql-test/main/mysqld--help.result
index a8aa461c863..7cbfa52b846 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
@@ -368,7 +371,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=#
@@ -1475,6 +1479,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
diff --git a/mysql-test/main/mysqldump-system.result b/mysql-test/main/mysqldump-system.result
index bf2d60c698c..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');
@@ -94,7 +96,7 @@ 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ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿');
+('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;
@@ -708,7 +710,7 @@ 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ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿');
+('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;
@@ -1299,7 +1301,7 @@ 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ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿ÿ¿');
+('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;
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.test b/mysql-test/main/mysqldump.test
index a4252f087c0..fc6a426d554 100644
--- a/mysql-test/main/mysqldump.test
+++ b/mysql-test/main/mysqldump.test
@@ -964,8 +964,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/opt_trace.result b/mysql-test/main/opt_trace.result
index 6d026bf7502..2bc8432e5ae 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",
"rows": 1,
"cost": 200.0585794,
"chosen": true
@@ -1075,7 +1075,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",
"rows": 1,
"cost": 200.0585794,
"chosen": true
@@ -2080,12 +2080,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
@@ -2164,6 +2164,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,
@@ -2172,6 +2173,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,
@@ -2810,15 +2812,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
}
@@ -2843,6 +2836,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
}
@@ -4026,7 +4028,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",
"rows": 1,
"cost": 3.001757383,
"chosen": true
@@ -4082,7 +4084,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",
"rows": 2,
"cost": 3.003514767,
"chosen": true
@@ -4378,15 +4380,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
}
@@ -4411,6 +4404,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
}
@@ -4827,15 +4829,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
}
@@ -4854,15 +4847,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
}
@@ -4887,6 +4871,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
}
@@ -4895,6 +4888,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
}
@@ -6401,15 +6403,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
}
@@ -6428,15 +6421,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
}
@@ -6461,6 +6445,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
}
@@ -6469,6 +6462,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
}
@@ -7953,17 +7955,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;
@@ -8048,20 +8054,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":
[
@@ -8079,21 +8085,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
}
]
},
@@ -8110,20 +8116,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
}
@@ -8186,7 +8192,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
"access_type": "ref",
"index": "b",
"used_range_estimates": false,
- "cause": "not available",
+ "reason": "not available",
"rows": 1,
"cost": 20.00585794,
"chosen": true
@@ -8194,8 +8200,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
}
],
@@ -8209,8 +8215,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
}
]
},
@@ -8227,20 +8233,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
}
@@ -8410,7 +8416,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
"access_type": "ref",
"index": "a",
"used_range_estimates": false,
- "cause": "not available",
+ "reason": "not available",
"rows": 1,
"cost": 20.00585794,
"chosen": true
@@ -8485,7 +8491,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
"access_type": "ref",
"index": "a",
"used_range_estimates": false,
- "cause": "not available",
+ "reason": "not available",
"rows": 1,
"cost": 200.0585794,
"chosen": true
@@ -8528,7 +8534,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;
@@ -8543,7 +8549,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns'))
[
"1 <= a <= 5"
],
- "selectivity_from_histogram": 0.046875
+ "selectivity_from_histogram": 0.05
},
{
@@ -8552,13 +8558,13 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns'))
[
"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;
@@ -8574,13 +8580,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;
@@ -8595,7 +8601,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns'))
[
"10 <= b < 25"
],
- "selectivity_from_histogram": 0.15625
+ "selectivity_from_histogram": 0.15
}
]
]
@@ -8857,17 +8863,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
}
@@ -9147,7 +9142,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 5de1fc5c3e9..d8ecefddd5e 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 cf1e8cbd0dd..2d001c2f1eb 100644
--- a/mysql-test/main/order_by.test
+++ b/mysql-test/main/order_by.test
@@ -3,11 +3,6 @@
#
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
@@ -15,8 +10,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),
@@ -2697,3 +2690,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 28922ef65f2..830377f35a3 100644
--- a/mysql-test/main/order_by_innodb.result
+++ b/mysql-test/main/order_by_innodb.result
@@ -180,7 +180,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
@@ -198,6 +198,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
#
@@ -221,5 +251,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 af12644c073..19bd1e3007a 100644
--- a/mysql-test/main/order_by_innodb.test
+++ b/mysql-test/main/order_by_innodb.test
@@ -1,7 +1,8 @@
#
# ORDER BY handling (e.g. filesort) tests that require innodb
#
--- source include/have_innodb.inc
+--source include/have_innodb.inc
+--source include/have_sequence.inc
--disable_warnings
drop table if exists t0,t1,t2,t3;
@@ -169,7 +170,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
@@ -185,6 +186,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 #
@@ -206,6 +239,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 58d0464b86f..a5d84072d11 100644
--- a/mysql-test/main/partition.result
+++ b/mysql-test/main/partition.result
@@ -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_error.result b/mysql-test/main/partition_error.result
index 4e12b6ade8e..bda76d5844a 100644
--- a/mysql-test/main/partition_error.result
+++ b/mysql-test/main/partition_error.result
@@ -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_exchange.result b/mysql-test/main/partition_exchange.result
index 09404e44527..ac38b189800 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 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 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 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 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 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
@@ -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
@@ -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 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
@@ -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
@@ -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 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 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
@@ -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 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 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 ROW_FORMAT=REDUNDANT
@@ -1320,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 8e0be49b5ab..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;
@@ -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_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/range.result b/mysql-test/main/range.result
index aca500bf038..11bf47f4500 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 eb4daf7fbc8..6da0fc9bd68 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 376cb63944a..10662f0edfa 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,35 +117,39 @@ 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_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_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
@@ -220,18 +228,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
@@ -248,23 +260,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
@@ -346,42 +362,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
@@ -401,56 +423,62 @@ 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_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_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
@@ -484,34 +512,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
@@ -531,44 +565,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
@@ -604,52 +644,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
@@ -671,70 +717,76 @@ 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_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_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_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_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
@@ -776,36 +828,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
@@ -827,46 +885,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
@@ -906,42 +970,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
@@ -961,56 +1031,62 @@ 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_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_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
@@ -1070,34 +1146,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
@@ -1117,44 +1199,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
@@ -1225,36 +1313,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
@@ -1278,46 +1372,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
@@ -1347,36 +1447,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
@@ -1400,46 +1506,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
@@ -1476,35 +1588,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
@@ -1528,45 +1646,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
@@ -1599,35 +1723,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
@@ -1651,45 +1781,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
@@ -1725,40 +1861,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
@@ -1782,50 +1924,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
@@ -1858,40 +2006,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
@@ -1915,50 +2069,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
@@ -2093,48 +2253,58 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 101,
- "filtered": 100,
- "attached_condition": "t2.a2 <> t2.pk2 and t2.a2 is not null"
- },
- "table": {
- "table_name": "t1",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "b1"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["pk1"],
- "ref": ["test.t2.a2"],
- "rowid_filter": {
- "range": {
- "key": "b1",
- "used_key_parts": ["b1"]
- },
- "rows": 87,
- "selectivity_pct": 87
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 101,
+ "filtered": 100,
+ "attached_condition": "t2.a2 <> t2.pk2 and t2.a2 is not null"
+ }
},
- "rows": 1,
- "filtered": 87,
- "attached_condition": "t1.b1 <= (subquery#2)"
- },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "b1"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["pk1"],
+ "ref": ["test.t2.a2"],
+ "rowid_filter": {
+ "range": {
+ "key": "b1",
+ "used_key_parts": ["b1"]
+ },
+ "rows": 87,
+ "selectivity_pct": 87
+ },
+ "rows": 1,
+ "filtered": 87,
+ "attached_condition": "t1.b1 <= (subquery#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"
+ }
+ }
+ ]
}
}
]
diff --git a/mysql-test/main/rowid_filter_innodb.result b/mysql-test/main/rowid_filter_innodb.result
index 49e74d1ba2d..90a119aa8c8 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,35 +120,39 @@ 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_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_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
@@ -223,18 +231,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
@@ -251,23 +263,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
@@ -349,35 +365,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
@@ -397,45 +419,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
@@ -469,35 +497,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
@@ -517,45 +551,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
@@ -591,44 +631,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
@@ -650,58 +696,64 @@ 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_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_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
@@ -743,36 +795,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
@@ -794,46 +852,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
@@ -873,35 +937,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
@@ -921,45 +991,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
@@ -1019,35 +1095,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
@@ -1067,45 +1149,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
@@ -1176,36 +1264,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
@@ -1229,46 +1323,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
@@ -1298,36 +1398,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
@@ -1351,46 +1457,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
@@ -1427,35 +1539,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
@@ -1479,45 +1597,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
@@ -1550,35 +1674,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
@@ -1602,45 +1732,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
@@ -1676,40 +1812,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
@@ -1733,50 +1875,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
@@ -1809,40 +1957,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
@@ -1866,50 +2020,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
@@ -2044,48 +2204,58 @@ EXPLAIN
{
"query_block": {
"select_id": 1,
- "table": {
- "table_name": "t2",
- "access_type": "ALL",
- "rows": 101,
- "filtered": 100,
- "attached_condition": "t2.a2 <> t2.pk2 and t2.a2 is not null"
- },
- "table": {
- "table_name": "t1",
- "access_type": "eq_ref",
- "possible_keys": ["PRIMARY", "b1"],
- "key": "PRIMARY",
- "key_length": "4",
- "used_key_parts": ["pk1"],
- "ref": ["test.t2.a2"],
- "rowid_filter": {
- "range": {
- "key": "b1",
- "used_key_parts": ["b1"]
- },
- "rows": 87,
- "selectivity_pct": 87
+ "nested_loop": [
+ {
+ "table": {
+ "table_name": "t2",
+ "access_type": "ALL",
+ "rows": 101,
+ "filtered": 100,
+ "attached_condition": "t2.a2 <> t2.pk2 and t2.a2 is not null"
+ }
},
- "rows": 1,
- "filtered": 87,
- "attached_condition": "t1.b1 <= (subquery#2)"
- },
+ {
+ "table": {
+ "table_name": "t1",
+ "access_type": "eq_ref",
+ "possible_keys": ["PRIMARY", "b1"],
+ "key": "PRIMARY",
+ "key_length": "4",
+ "used_key_parts": ["pk1"],
+ "ref": ["test.t2.a2"],
+ "rowid_filter": {
+ "range": {
+ "key": "b1",
+ "used_key_parts": ["b1"]
+ },
+ "rows": 87,
+ "selectivity_pct": 87
+ },
+ "rows": 1,
+ "filtered": 87,
+ "attached_condition": "t1.b1 <= (subquery#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"
+ }
+ }
+ ]
}
}
]
@@ -2200,54 +2370,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')"
+ }
+ }
+ ]
}
}
]
@@ -2878,93 +3056,105 @@ 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"],
- "rowid_filter": {
- "range": {
- "key": "filt_fh",
- "used_key_parts": ["fh"]
+ {
+ "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
},
- "rows": 6,
- "selectivity_pct": 17.14285714,
- "r_rows": 5,
- "r_selectivity_pct": 40,
- "r_buffer_size": "REPLACED",
- "r_filling_time_ms": "REPLACED"
- },
- "r_loops": 1,
- "rows": 1,
- "r_rows": 2,
- "r_table_time_ms": "REPLACED",
- "r_other_time_ms": "REPLACED",
- "filtered": 17.1428566,
- "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": "603",
- "join_type": "BKA",
- "mrr_type": "Rowid-ordered scan",
- "attached_condition": "fi.fh in (6311439873746261694,-397087483897438286,8518228073041491534,-5420422472375069774)",
- "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"],
+ "rowid_filter": {
+ "range": {
+ "key": "filt_fh",
+ "used_key_parts": ["fh"]
+ },
+ "rows": 6,
+ "selectivity_pct": 17.14285714,
+ "r_rows": 5,
+ "r_selectivity_pct": 40,
+ "r_buffer_size": "REPLACED",
+ "r_filling_time_ms": "REPLACED"
+ },
+ "r_loops": 1,
+ "rows": 1,
+ "r_rows": 2,
+ "r_table_time_ms": "REPLACED",
+ "r_other_time_ms": "REPLACED",
+ "filtered": 17.1428566,
+ "r_filtered": 100
+ },
+ "buffer_type": "incremental",
+ "buffer_size": "603",
+ "join_type": "BKA",
+ "mrr_type": "Rowid-ordered scan",
+ "attached_condition": "fi.fh in (6311439873746261694,-397087483897438286,8518228073041491534,-5420422472375069774)",
+ "r_filtered": 100
+ }
+ }
+ ]
}
}
set optimizer_switch=@save_optimizer_switch;
diff --git a/mysql-test/main/selectivity.result b/mysql-test/main/selectivity.result
index 2cd3cbdd8eb..408094e3c1a 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 5.47 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 5.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`.`b` = 2
# Now, the equality is used for ref access, while the range condition
@@ -1895,7 +1895,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;
@@ -1919,7 +1919,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 07cdf15163c..8120f51ca83 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 5.47 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 1000 5.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`.`b` = 2
# Now, the equality is used for ref access, while the range condition
@@ -1907,7 +1907,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;
@@ -1931,7 +1931,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 53574fb4e4f..97cc4f3831a 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/sp-cursor.result b/mysql-test/main/sp-cursor.result
index aa23d808352..83b05264339 100644
--- a/mysql-test/main/sp-cursor.result
+++ b/mysql-test/main/sp-cursor.result
@@ -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-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/statistics.result b/mysql-test/main/statistics.result
index 1ba087dd7a1..43b28f464e1 100644
--- a/mysql-test/main/statistics.result
+++ b/mysql-test/main/statistics.result
@@ -1,9 +1,12 @@
+set @SINGLE_PREC_TYPE='single_prec_hb';
+set @DOUBLE_PREC_TYPE='double_prec_hb';
+set @DEFAULT_HIST_TYPE='double_prec_hb';
drop table if exists t1,t2;
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 +223,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 +243,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 +1481,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 +1498,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 +1510,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 +1578,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 +1592,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 +1604,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 +1646,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 +1667,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 +1765,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
INSERT INTO t1 (a) VALUES (0x0000000000000000000000000101010101010101010202020303030304040404050505050606070707080809090A0A0B0C0D0D0E0E0F10111213131415161718191B1C1E202224292A2E33373B4850575F6A76818C9AA7B9C4CFDADFE5EBF0F4F8FAFCFF);
SELECT b FROM t1;
@@ -1878,6 +1883,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 1f99aaa33e5..1d431237e82 100644
--- a/mysql-test/main/statistics.test
+++ b/mysql-test/main/statistics.test
@@ -1,3 +1,13 @@
+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;
+}
+
--source include/have_stat_tables.inc
--source include/have_innodb.inc
--disable_warnings
@@ -7,8 +17,8 @@ drop table if exists t1,t2;
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
@@ -81,6 +91,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),
@@ -177,30 +188,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;
@@ -650,18 +663,20 @@ 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
---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';
-set histogram_type='single_prec_hb';
+set histogram_type=@SINGLE_PREC_TYPE;
set histogram_size=0;
use test;
@@ -705,11 +720,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;
@@ -724,20 +741,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;
@@ -774,10 +793,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;
@@ -795,10 +815,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;
@@ -908,11 +929,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
@@ -959,6 +983,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;
@@ -969,6 +994,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;
@@ -978,6 +1004,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;
@@ -988,6 +1015,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;
@@ -999,12 +1027,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..a9740056777
--- /dev/null
+++ b/mysql-test/main/statistics_json.result
@@ -0,0 +1,8324 @@
+#
+# 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';
+drop table if exists t1,t2;
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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;
diff --git a/mysql-test/main/statistics_json.test b/mysql-test/main/statistics_json.test
new file mode 100644
index 00000000000..10583620cda
--- /dev/null
+++ b/mysql-test/main/statistics_json.test
@@ -0,0 +1,462 @@
+--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;
+
+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;
+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;
+
diff --git a/mysql-test/main/statistics_upgrade.result b/mysql-test/main/statistics_upgrade.result
new file mode 100644
index 00000000000..6e287115245
--- /dev/null
+++ b/mysql-test/main/statistics_upgrade.result
@@ -0,0 +1,87 @@
+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) 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','JSON_HB') COLLATE utf8mb3_bin 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;
diff --git a/mysql-test/main/statistics_upgrade.test b/mysql-test/main/statistics_upgrade.test
new file mode 100644
index 00000000000..705cf65e053
--- /dev/null
+++ b/mysql-test/main/statistics_upgrade.test
@@ -0,0 +1,67 @@
+-- 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;
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 53fb6073e56..c23352c6767 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 e12facf8b8c..132e870a860 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 5f38d2a5d35..980db9f3ee1 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 98b0719f993..cb3620f4756 100644
--- a/mysql-test/main/subselect_no_semijoin.result
+++ b/mysql-test/main/subselect_no_semijoin.result
@@ -7404,34 +7404,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 695c010692c..97dcf07705c 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 e8063ee736c..9388379af27 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 d0d1e7c1175..dcc71da3677 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') COLLATE utf8mb3_bin DEFAULT NULL,
- `histogram` varbinary(255) DEFAULT NULL,
+ `hist_type` enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB') COLLATE utf8mb3_bin 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 127e2c49642..4ab80425a35 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') COLLATE utf8mb3_bin DEFAULT NULL,
- `histogram` varbinary(255) DEFAULT NULL,
+ `hist_type` enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB') COLLATE utf8mb3_bin 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 fd0074c7f54..4244ab47d50 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') COLLATE utf8mb3_bin DEFAULT NULL,
- `histogram` varbinary(255) DEFAULT NULL,
+ `hist_type` enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB') COLLATE utf8mb3_bin 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 a7d705c4158..59341406315 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') COLLATE utf8mb3_bin DEFAULT NULL,
- `histogram` varbinary(255) DEFAULT NULL,
+ `hist_type` enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB') COLLATE utf8mb3_bin 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/type_timestamp.result b/mysql-test/main/type_timestamp.result
index e6fa9756b1d..52d0be675e2 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 9c5b57b8885..80bc0bd0332 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/win.result b/mysql-test/main/win.result
index 1bd08788cbd..18cec42e236 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/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 656038f42b4..ac19ad7157d 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
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/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/compat/oracle/r/sp-cursor.result b/mysql-test/suite/compat/oracle/r/sp-cursor.result
index d7e88430bc7..aa9c5de8bc9 100644
--- a/mysql-test/suite/compat/oracle/r/sp-cursor.result
+++ b/mysql-test/suite/compat/oracle/r/sp-cursor.result
@@ -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/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/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 bc542a78d2b..30e62f6157d 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/engines/funcs/r/ix_using_order.result b/mysql-test/suite/engines/funcs/r/ix_using_order.result
index 645b3fcfbc4..1e4389ce251 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
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
DROP INDEX i1 ON t1;
DROP TABLE t1;
diff --git a/mysql-test/suite/federated/federatedx_create_handlers.result b/mysql-test/suite/federated/federatedx_create_handlers.result
index 28736515327..6dcd53e77c7 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/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/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/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_3nodes/disabled.def b/mysql-test/suite/galera_3nodes/disabled.def
index d3e8808a4ef..123b9ea5885 100644
--- a/mysql-test/suite/galera_3nodes/disabled.def
+++ b/mysql-test/suite/galera_3nodes/disabled.def
@@ -23,6 +23,8 @@ galera_slave_options_do : MDEV-8798
galera_slave_options_ignore : MDEV-8798
galera_vote_rejoin_mysqldump : MDEV-24481: galera_3nodes.galera_vote_rejoin_mysqldump MTR failed: mysql_shutdown failed
galera_ipv6_mysqldump : MDEV-26499: galera_3nodes.galera_ipv6_mysqldump MTR failed: mysql_shutdown failed
+galera_ipv6_mariabackup : MDEV-24097
+galera_ipv6_mariabackup_section : MDEV-24097, MDEV-22195
galera_wsrep_schema : MDEV-26503 : galera_3nodes.galera_wsrep_schema MTR failed: mysql_shutdown failed
galera_ipv6_mariabackup : MDEV-24097 MTR sporadaically fails: Failed to start mysqld or mysql_shutdown failed
galera_ipv6_mariabackup_section : MDEV-24097 MTR sporadaically fails: Failed to start mysqld or mysql_shutdown failed
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_supported_sql_funcs_innodb.result b/mysql-test/suite/gcol/r/gcol_supported_sql_funcs_innodb.result
index fbdd663d721..8a772fbf34f 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
-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 c92760f75b5..2bf8dce3f1c 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
-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/heap/heap_hash.result b/mysql-test/suite/heap/heap_hash.result
index 6bc9ff0d527..eb73b53dd2f 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
+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/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/autoinc_persist,desc.rdiff b/mysql-test/suite/innodb/r/autoinc_persist,desc.rdiff
new file mode 100644
index 00000000000..c732d2c1a1a
--- /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
+ 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
+ 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
+ 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
+ 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
+ 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
+ # 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
+ # 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
+ # 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
+ 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
+ # 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
+ 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
+ # 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
+ # 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
+ 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
+ # 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
+ 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 ee796160406..91d6d908a82 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/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 e17e7e25cb5..4b2e88e3029 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
+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-wl5522-debug.result b/mysql-test/suite/innodb/r/innodb-wl5522-debug.result
index 08f4bb93899..8a6c49c79c9 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_skip_innodb_is_tables.result b/mysql-test/suite/innodb/r/innodb_skip_innodb_is_tables.result
index 19b426009f2..a504bb4aa39 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 a729dd0a8d4..086e4e1d1e7 100644
--- a/mysql-test/suite/innodb/r/innodb_status_variables.result
+++ b/mysql-test/suite/innodb/r/innodb_status_variables.result
@@ -64,9 +64,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/instant_alter_import.result b/mysql-test/suite/innodb/r/instant_alter_import.result
index 5c6497b5939..3fff0d50b36 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 cb2ee68fc98..00000000000
--- a/mysql-test/suite/innodb/r/log_file_name_debug.result
+++ /dev/null
@@ -1,18 +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,ib_log --innodb-log-file-size=4194304
-SELECT * FROM t1;
-ERROR 42000: Unknown storage engine 'InnoDB'
-FOUND 1 /ib_log: FILE_CHECKPOINT.* written/ in mysqld.1.err
-# 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 caa4b33df6c..922c66a068f 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/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 1cc654f0d7e..b7e514b172b 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_missing_tablespace.test b/mysql-test/suite/innodb/t/alter_missing_tablespace.test
index bf7111509bd..5c7f63eb813 100644
--- a/mysql-test/suite/innodb/t/alter_missing_tablespace.test
+++ b/mysql-test/suite/innodb/t/alter_missing_tablespace.test
@@ -9,7 +9,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 6e094b40e02..c6135b5580c 100644
--- a/mysql-test/suite/innodb/t/autoinc_persist.test
+++ b/mysql-test/suite/innodb/t/autoinc_persist.test
@@ -2,6 +2,19 @@
# Restarting is not supported when testing the embedded server.
--source include/not_embedded.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 #
@@ -20,72 +33,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;
@@ -105,7 +118,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
@@ -439,7 +452,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;
@@ -454,7 +467,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);
@@ -463,8 +476,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);
@@ -480,10 +492,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);
@@ -539,10 +550,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/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 c7aa6250da5..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`;
@@ -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,6 +1182,48 @@ 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.");
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-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_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/instant_alter_import.test b/mysql-test/suite/innodb/t/instant_alter_import.test
index 5504cee4dce..3ffbe01f77e 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 4e9ea9fa698..7d351bf565c 100644
--- a/mysql-test/suite/innodb/t/log_corruption.test
+++ b/mysql-test/suite/innodb/t/log_corruption.test
@@ -7,8 +7,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");
@@ -16,8 +16,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\\? The checkpoint 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!");
--enable_query_log
let bugdir= $MYSQLTEST_VARDIR/tmp/log_corruption;
@@ -134,8 +133,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
@@ -154,7 +151,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
@@ -165,7 +161,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'
@@ -195,7 +191,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'
@@ -204,7 +200,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;
@@ -214,13 +210,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
@@ -245,15 +241,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;
@@ -264,13 +259,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
@@ -286,13 +283,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
@@ -309,7 +305,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
@@ -345,7 +343,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
@@ -356,6 +354,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.
@@ -363,7 +364,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
@@ -380,14 +381,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
@@ -464,7 +465,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
@@ -538,13 +539,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
@@ -577,6 +578,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 e167bc6fb57..0f26622e2b6 100644
--- a/mysql-test/suite/innodb/t/log_file.test
+++ b/mysql-test/suite/innodb/t/log_file.test
@@ -11,7 +11,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");
@@ -61,7 +61,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
@@ -208,8 +208,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 895e945f4e3..b0935c90ca3 100644
--- a/mysql-test/suite/innodb/t/log_file_name.test
+++ b/mysql-test/suite/innodb/t/log_file_name.test
@@ -146,7 +146,7 @@ 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'");
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 d90be6d8916..00000000000
--- a/mysql-test/suite/innodb/t/log_file_name_debug.test
+++ /dev/null
@@ -1,50 +0,0 @@
---source include/have_innodb.inc
-# Embedded server does not support restarting
---source include/not_embedded.inc
---source include/have_debug.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,ib_log $resize
---source include/restart_mysqld.inc
---error ER_UNKNOWN_STORAGE_ENGINE
-SELECT * FROM t1;
---let SEARCH_PATTERN= ib_log: FILE_CHECKPOINT.* written
---source include/search_pattern_in_file.inc
-
---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 8dc325b3356..9f970ca2dd2 100644
--- a/mysql-test/suite/innodb/t/missing_tablespaces.test
+++ b/mysql-test/suite/innodb/t/missing_tablespaces.test
@@ -25,7 +25,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/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 1ca4f51c747..bb3d08a8779 100644
--- a/mysql-test/suite/innodb/t/restart.test
+++ b/mysql-test/suite/innodb/t/restart.test
@@ -93,7 +93,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..9d16bffb1ef 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
+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/t/create.test b/mysql-test/suite/innodb_fts/t/create.test
index 38c93de4982..edecef64589 100644
--- a/mysql-test/suite/innodb_fts/t/create.test
+++ b/mysql-test/suite/innodb_fts/t/create.test
@@ -110,10 +110,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_gis/r/geometry.result b/mysql-test/suite/innodb_gis/r/geometry.result
index 437ff23e334..1f5a8aba00c 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
#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 ROW_FORMAT=DYNAMIC KEY_BLOCK_SIZE=16
#check index with WKB function
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 63369c9b41f..16e78465b03 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_table.result b/mysql-test/suite/json/r/json_table.result
index 19cffb6c94e..d6a02ccddba 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 da7aa70be2b..7b942f9a041 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/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/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/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 e27229c5f33..34198222cea 100644
--- a/mysql-test/suite/mariabackup/innodb_redo_overwrite.test
+++ b/mysql-test/suite/mariabackup/innodb_redo_overwrite.test
@@ -1,26 +1,9 @@
--source include/have_innodb.inc
--source include/have_debug_sync.inc
+--source include/have_debug.inc
+--source include/have_sequence.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
@@ -33,13 +16,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/parts/r/engine_defined_part_attributes.result b/mysql-test/suite/parts/r/engine_defined_part_attributes.result
new file mode 100644
index 00000000000..f31d5e901fb
--- /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 `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 `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 `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 `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 `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 `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
+ 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 `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 `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 `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/t/engine_defined_part_attributes.test b/mysql-test/suite/parts/t/engine_defined_part_attributes.test
new file mode 100644
index 00000000000..22aec9286e9
--- /dev/null
+++ b/mysql-test/suite/parts/t/engine_defined_part_attributes.test
@@ -0,0 +1,216 @@
+--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
+);
+SELECT name, flag FROM information_schema.innodb_sys_tablespaces WHERE name like 'test/t12%';
+
+ALTER TABLE `t12` ADD PARTITION (
+ PARTITION pt2 PAGE_COMPRESSED=1
+);
+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
+);
+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`;
+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`;
+SELECT name, flag FROM information_schema.innodb_sys_tablespaces WHERE name like 'test/t13%';
+
+DROP TABLE `t13`;
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/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/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_start_alter_1.result b/mysql-test/suite/rpl/r/rpl_start_alter_1.result
new file mode 100644
index 00000000000..c968cef89ac
--- /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
+# 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
+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
+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
+# 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
+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
+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 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 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 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..8f2c8c1dbaf
--- /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
+# 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
+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
+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
+# 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
+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
+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 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 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 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..579bd2c221d
--- /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
+# 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
+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
+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
+# 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
+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
+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 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 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 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..d700770fa8e
--- /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
+# 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
+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
+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
+# 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
+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
+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 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 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 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..cea0f2db99e
--- /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
+# 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
+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
+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
+# 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
+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
+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 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 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 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..2e454fb3e97
--- /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
+# 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
+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
+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
+# 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
+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
+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 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 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 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..9c99bb7c52b
--- /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
+# 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
+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
+# 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
+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 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 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
+# 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
+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
+# 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
+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 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 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..4e33921b73f
--- /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
+# 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
+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
+# 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
+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 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 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
+# 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
+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
+# 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
+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 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 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..c79f929cc95
--- /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
+# 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
+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
+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..ad619923201
--- /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
+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..793ef74d6bb
--- /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
+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
+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..4faa25ebd08
--- /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
+# 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
+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
+# 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
+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 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 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..1587d0549d2
--- /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
+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
+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
+# 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
+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
+# 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
+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 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 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
+# 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
+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
+# 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
+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 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 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..97455c6af54
--- /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
+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
+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/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_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..83e82bf9509
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_start_alter_restart_master.test
@@ -0,0 +1,75 @@
+# 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
+
+--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/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/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/keep_files_on_create_basic.result b/mysql-test/suite/sys_vars/r/keep_files_on_create_basic.result
index b7deea88a9c..26ecccab2ad 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 DOUBLE 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 DOUBLE 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 2a7bd72a700..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
diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb.result b/mysql-test/suite/sys_vars/r/sysvars_innodb.result
index 5a52b2e4251..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
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 b1d2a6595b3..fc9d8db4b9f 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 7b811a011ff..35235a17f18 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/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/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/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/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 c9bf609b6d4..aa2f444653f 100644
--- a/mysys/array.c
+++ b/mysys/array.c
@@ -375,29 +375,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 19cad76fdf4..da6180dccba 100644
--- a/mysys/charset.c
+++ b/mysys/charset.c
@@ -1209,30 +1209,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
@@ -1393,8 +1380,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 */
@@ -1517,9 +1504,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)
@@ -1528,3 +1521,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/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_getopt.c b/mysys/my_getopt.c
index 3fe025ba808..653fe844093 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 d201d45a4ee..2f21bcb735f 100644
--- a/mysys/my_init.c
+++ b/mysys/my_init.c
@@ -34,6 +34,7 @@
#endif
static void my_win_init(void);
static my_bool win32_init_tcp_ip();
+static void setup_codepages();
#else
#define my_win_init()
#endif
@@ -67,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
@@ -337,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 0fdc4e17a26..9cc1e19772b 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_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/plugin/type_inet/mysql-test/type_inet/type_inet6.result b/plugin/type_inet/mysql-test/type_inet/type_inet6.result
index 9f3b8a9715e..c9afe27f78f 100644
--- a/plugin/type_inet/mysql-test/type_inet/type_inet6.result
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6.result
@@ -2213,3 +2213,36 @@ SELECT * FROM companies;
id name
DROP TABLE divisions;
DROP TABLE companies;
+#
+# 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 1292 Incorrect inet6 value: '0' for column `test`.`t1`.`c` at row 1
+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;
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 ef8399d981f..29dd915d627 100644
--- a/plugin/type_inet/mysql-test/type_inet/type_inet6.test
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6.test
@@ -1630,3 +1630,24 @@ DELETE FROM companies WHERE id IN (SELECT company_id FROM divisions);
SELECT * FROM companies;
DROP TABLE divisions;
DROP TABLE companies;
+
+--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);
+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;
diff --git a/scripts/mysql_install_db.sh b/scripts/mysql_install_db.sh
index 72600660fff..face88c7e29 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
@@ -184,6 +187,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"
@@ -405,6 +410,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"
@@ -571,6 +583,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 7cecd764ee4..4a29b94e6f5 100644
--- a/scripts/mysql_system_tables_fix.sql
+++ b/scripts/mysql_system_tables_fix.sql
@@ -842,3 +842,11 @@ IF 1 = (SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def
END IF//
DELIMITER ;
+
+--
+-- Upgrade mysql.column_stats table
+--
+
+ALTER TABLE column_stats
+ modify hist_type enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB'),
+ modify histogram longblob;
diff --git a/scripts/wsrep_sst_rsync.sh b/scripts/wsrep_sst_rsync.sh
index 994347d6f73..18a4a15c6bd 100644
--- a/scripts/wsrep_sst_rsync.sh
+++ b/scripts/wsrep_sst_rsync.sh
@@ -589,7 +589,7 @@ FILTER="-f '- /lost+found'
rsync ${STUNNEL:+--rsh="$STUNNEL"} \
--owner --group --perms --links --specials \
--ignore-times --inplace --dirs --delete --quiet \
- $WHOLE_FILE_OPT -f '+ /ib_logfile[0-9]*' -f '+ /aria_log.*' \
+ $WHOLE_FILE_OPT -f '+ /ib_logfile0' -f '+ /aria_log.*' \
-f '+ /aria_log_control' -f '- **' "$ib_log_dir/" \
"rsync://$WSREP_SST_OPT_ADDR-log_dir" >&2 || RC=$?
diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt
index 241b482ab16..8aadc22046e 100644
--- a/sql/CMakeLists.txt
+++ b/sql/CMakeLists.txt
@@ -1,5 +1,5 @@
# Copyright (c) 2006, 2014, Oracle and/or its affiliates.
-# Copyright (c) 2010, 2021, 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
@@ -151,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
@@ -482,13 +483,12 @@ IF(WIN32)
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/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/field.cc b/sql/field.cc
index 348947329f7..530a8c09c59 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -1108,19 +1108,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 +1186,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)
diff --git a/sql/field.h b/sql/field.h
index 81e10307c89..8fe0cc9f8da 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -1522,11 +1522,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); }
@@ -1865,6 +1874,7 @@ public:
{
return (double) 0.5;
}
+ virtual bool pos_through_val_str() { return false;}
/*
Check if comparison between the field and an item unambiguously
@@ -2150,6 +2160,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,
@@ -5905,5 +5917,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/ha_partition.cc b/sql/ha_partition.cc
index 9cefd695c56..0ecbd6b3fc1 100644
--- a/sql/ha_partition.cc
+++ b/sql/ha_partition.cc
@@ -2736,6 +2736,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,
@@ -2773,6 +2774,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);
}
diff --git a/sql/handler.cc b/sql/handler.cc
index 80dc2419b9d..9ba96244557 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -4133,6 +4133,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;
@@ -4154,7 +4157,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
@@ -4169,9 +4173,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
diff --git a/sql/item_create.cc b/sql/item_create.cc
index a2fe1542cb9..fb95a0750e2 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() {}
+ virtual ~Create_func_crc32c() {}
+};
+
+
class Create_func_datediff : public Create_func_arg2
{
public:
@@ -3179,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*
@@ -5616,6 +5675,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)},
diff --git a/sql/item_geofunc.cc b/sql/item_geofunc.cc
index 7a1115425d9..e225a05d490 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_strfunc.cc b/sql/item_strfunc.cc
index 9f36cbe1ed9..b8c01e5af41 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
@@ -503,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",
@@ -533,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
@@ -4379,14 +4387,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
diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h
index c183f1c1ac2..de127445a23 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
@@ -1944,15 +1944,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;
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/log.cc b/sql/log.cc
index 468f171ae2c..115b1301108 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) {
@@ -5754,6 +5879,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.
@@ -6268,6 +6426,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,
diff --git a/sql/log.h b/sql/log.h
index 516fb36adb9..433057f4b93 100644
--- a/sql/log.h
+++ b/sql/log.h
@@ -1265,5 +1265,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 afca79b008a..b3943760720 100644
--- a/sql/log_event.cc
+++ b/sql/log_event.cc
@@ -1375,6 +1375,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;
@@ -1423,7 +1424,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;
@@ -1439,28 +1441,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);
@@ -1607,13 +1609,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\
@@ -2609,7 +2624,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);
@@ -2617,6 +2632,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
@@ -2633,6 +2653,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. */
diff --git a/sql/log_event.h b/sql/log_event.h
index 3adc7a26d93..405b9a15003 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 */
@@ -920,6 +922,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() {
@@ -942,6 +958,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
@@ -2148,6 +2198,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
@@ -2159,6 +2215,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
@@ -2172,8 +2229,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; }
@@ -2199,6 +2258,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
@@ -3606,13 +3668,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.
@@ -3650,14 +3718,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,
@@ -5827,4 +5900,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 7e0bf7d8e4c..e460fc17848 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
@@ -2005,6 +2006,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)
{
@@ -2020,9 +2034,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
{
@@ -2295,6 +2342,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;
@@ -3791,6 +3840,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);
@@ -3854,6 +3905,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_server.cc b/sql/log_event_server.cc
index af5e90d119b..6969c409ef4 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)
@@ -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))
{
@@ -1750,7 +1992,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=
@@ -1888,40 +2130,62 @@ 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();
+ }
+ }
+ 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
{
@@ -1984,7 +2248,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));
@@ -2380,6 +2645,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;
@@ -2397,16 +2695,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);
+ }
}
/*
@@ -3326,7 +3629,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;
}
}
@@ -3399,12 +3709,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);
@@ -3468,6 +3784,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);
}
@@ -3482,6 +3812,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)
@@ -3752,6 +4085,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;
diff --git a/sql/mdl.cc b/sql/mdl.cc
index c2475bb3b91..bb764d04a42 100644
--- a/sql/mdl.cc
+++ b/sql/mdl.cc
@@ -2232,8 +2232,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 &&
@@ -2241,7 +2241,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
}
}
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 089abd0ad48..7840476b878 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 1e79e6444ff..934226685a9 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 ea1bfa1aaf3..aad36d61e15 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -127,6 +127,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>
@@ -910,6 +911,8 @@ PSI_mutex_key key_BINLOG_LOCK_index, key_BINLOG_LOCK_xid_list,
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,
@@ -994,6 +997,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},
@@ -5222,6 +5227,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"),
diff --git a/sql/mysqld.h b/sql/mysqld.h
index 48405a77e87..9c09e993470 100644
--- a/sql/mysqld.h
+++ b/sql/mysqld.h
@@ -332,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,
diff --git a/sql/opt_histogram_json.cc b/sql/opt_histogram_json.cc
new file mode 100644
index 00000000000..6458059e5fe
--- /dev/null
+++ b/sql/opt_histogram_json.cc
@@ -0,0 +1,1181 @@
+/*
+ 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
+*/
+
+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;
+
+ 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 7909f5b35f9..391a04c2a1a 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
@@ -1904,7 +1904,7 @@ inline void SEL_ARG::make_root()
use_count=0; elements=1;
}
-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),
@@ -1919,7 +1919,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)
{
@@ -1967,7 +1968,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)
@@ -2059,7 +2061,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;
@@ -2806,7 +2809,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;
@@ -2828,6 +2830,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;
@@ -3241,6 +3244,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;
@@ -3279,7 +3283,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;
}
@@ -4430,12 +4437,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
@@ -11556,6 +11565,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;
@@ -11807,6 +11817,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
*/
@@ -11820,17 +11870,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 &&
@@ -11840,31 +11893,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);
+ }
}
/*
@@ -11925,8 +11987,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;
@@ -13055,24 +13118,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
}
@@ -13799,6 +13863,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.
@@ -16524,6 +16599,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;
@@ -16601,6 +16677,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 1014176ecc5..f3ccd4d8311 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
@@ -327,11 +356,15 @@ public:
SEL_ARG() {}
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)
{}
@@ -409,13 +442,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);
}
@@ -504,6 +538,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
@@ -516,7 +601,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,
@@ -525,15 +611,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;
}
@@ -541,7 +638,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,
@@ -549,15 +647,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;
}
@@ -661,6 +770,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_subselect.cc b/sql/opt_subselect.cc
index ace55e77485..3e58a2788c8 100644
--- a/sql/opt_subselect.cc
+++ b/sql/opt_subselect.cc
@@ -703,7 +703,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;
@@ -1271,6 +1271,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)
diff --git a/sql/opt_sum.cc b/sql/opt_sum.cc
index b3871254e6e..10491d9b45b 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/partition_element.h b/sql/partition_element.h
index c551baa3092..756cab2b7f2 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
@@ -126,6 +127,9 @@ 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),
@@ -136,7 +140,8 @@ 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),
@@ -155,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() {}
diff --git a/sql/rpl_gtid.cc b/sql/rpl_gtid.cc
index 306ae878060..ae40fd46f4d 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"
@@ -607,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;
@@ -625,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
@@ -734,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;
@@ -1273,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
@@ -1310,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)
{
@@ -1349,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
@@ -2974,3 +3000,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 531d746763b..fa05148a39b 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
};
@@ -381,5 +397,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 4fd36891a4b..2283f91ba02 100644
--- a/sql/rpl_mi.cc
+++ b/sql/rpl_mi.cc
@@ -43,7 +43,8 @@ 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)
+ total_ddl_groups(0), total_non_trans_groups(0), total_trans_groups(0),
+ is_shutdown(false)
{
char *tmp;
host[0] = 0; user[0] = 0; password[0] = 0;
@@ -85,6 +86,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);
@@ -92,6 +101,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));
}
@@ -121,10 +131,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));
}
/**
diff --git a/sql/rpl_mi.h b/sql/rpl_mi.h
index a4a06d42a5c..b8135b8b55f 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;
@@ -352,6 +352,25 @@ class Master_info : public Slave_reporting_capability
ACK from slave, or if delay_master is enabled.
*/
int semi_ack;
+ 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;
+};
+
+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,
diff --git a/sql/rpl_parallel.cc b/sql/rpl_parallel.cc
index 49ec08a9cea..4b305e9a57a 100644
--- a/sql/rpl_parallel.cc
+++ b/sql/rpl_parallel.cc
@@ -151,6 +151,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
@@ -272,6 +275,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);
}
@@ -571,6 +576,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");
/*
@@ -622,9 +628,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)
@@ -1690,6 +1723,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,
@@ -1969,7 +2005,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;
}
@@ -2033,6 +2081,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),
@@ -2042,7 +2094,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, NULL}
{
}
@@ -2175,6 +2227,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.
@@ -2208,25 +2383,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;
@@ -2340,7 +2522,7 @@ 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;
@@ -2366,6 +2548,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);
@@ -2376,7 +2560,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;
}
@@ -2393,7 +2581,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.
@@ -2444,6 +2632,45 @@ rpl_parallel::wait_for_done(THD *thd, Relay_log_info *rli)
};);
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);
@@ -2458,6 +2685,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);
}
@@ -2802,7 +3040,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;
@@ -2814,6 +3052,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 d3c46301ff8..66c7fc9f316 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;
@@ -297,6 +309,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
@@ -328,6 +346,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,
@@ -410,10 +429,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);
};
@@ -425,7 +449,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 42607fbadcf..88a0e346245 100644
--- a/sql/rpl_rli.cc
+++ b/sql/rpl_rli.cc
@@ -2152,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));
@@ -2170,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();
@@ -2195,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/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt
index 1645db097ae..e83f340ea77 100644
--- a/sql/share/errmsg-utf8.txt
+++ b/sql/share/errmsg-utf8.txt
@@ -10066,3 +10066,9 @@ 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 b2281b69a4f..f0b2a015798 100644
--- a/sql/signal_handler.cc
+++ b/sql/signal_handler.cc
@@ -71,7 +71,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);
}
@@ -81,7 +81,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 b9ac71a9842..7994f1a2d6b 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -3930,6 +3930,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);
#ifndef DBUG_OFF
DBUG_PRINT("info", ("update_pos error = %d", error));
@@ -4053,6 +4057,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);
/*
@@ -4064,7 +4073,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;
}
@@ -5580,8 +5633,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)
@@ -6306,12 +6361,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
@@ -6347,26 +6409,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 393f2016a87..ec69730a702 100644
--- a/sql/sp_head.cc
+++ b/sql/sp_head.cc
@@ -2079,7 +2079,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;
}
@@ -2202,6 +2203,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
@@ -2324,50 +2338,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;
}
/*
@@ -2477,31 +2450,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);
}
}
@@ -2532,6 +2483,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.
diff --git a/sql/sp_head.h b/sql/sp_head.h
index 3c3cb093400..97ea4e7b89a 100644
--- a/sql/sp_head.h
+++ b/sql/sp_head.h
@@ -505,6 +505,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.
diff --git a/sql/sql_admin.cc b/sql/sql_admin.cc
index e0b324e6342..71039affd2b 100644
--- a/sql/sql_admin.cc
+++ b/sql/sql_admin.cc
@@ -989,6 +989,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 e28308b4ff6..86c6e9a27f8 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)
diff --git a/sql/sql_binlog.cc b/sql/sql_binlog.cc
index bab2afb957a..c229655e915 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"
@@ -70,7 +72,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:
@@ -167,6 +170,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.
@@ -216,11 +270,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
*/
@@ -373,7 +425,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=
@@ -389,7 +441,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)
{
@@ -397,7 +449,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;
}
}
@@ -413,5 +466,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 40afe0182b7..3eab44c4179 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -5330,6 +5330,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 a6f51d4b28f..6d21e29184f 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -81,6 +81,7 @@ class Wsrep_applier_service;
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;
@@ -290,9 +291,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;
/**
@@ -853,6 +854,7 @@ typedef struct system_variables
vers_asof_timestamp_t vers_asof_timestamp;
ulong vers_alter_history;
+ my_bool binlog_alter_two_phase;
} SV;
/**
@@ -3030,6 +3032,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:
@@ -7838,5 +7845,38 @@ extern THD_list server_threads;
void setup_tmp_table_column_bitmaps(TABLE *table, uchar *bitmaps,
uint field_count);
+/*
+ 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_explain.cc b/sql/sql_explain.cc
index 616a545aa0e..3cee9bbb2c5 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)
{
@@ -1064,14 +1066,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
}
@@ -1093,17 +1094,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);
}
@@ -1687,7 +1697,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)
{
@@ -2083,14 +2093,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 bfd52290374..88fae9d4f1a 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_lex.cc b/sql/sql_lex.cc
index 2fb98f5aa88..7ab1dbe9899 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -7159,6 +7159,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);
diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc
index 80b4cdcd240..5a630d2f9e0 100644
--- a/sql/sql_partition.cc
+++ b/sql/sql_partition.cc
@@ -69,6 +69,7 @@
#include "sql_select.h"
#include "ddl_log.h"
#include "tztime.h" // my_tz_OFFSET0
+#include "create_options.h" // engine_option_value
#include <algorithm>
using std::max;
@@ -2205,7 +2206,7 @@ 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;
@@ -2232,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
@@ -2655,7 +2670,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
{
@@ -2669,7 +2687,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
diff --git a/sql/sql_priv.h b/sql/sql_priv.h
index f7d8ef0da67..b5efe53dfa4 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)
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 2b248ef17c5..325c6dcb43e 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -239,9 +239,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);
@@ -7943,7 +7941,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
@@ -7981,16 +7979,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");
}
}
}
@@ -8228,7 +8224,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;
}
@@ -8271,7 +8267,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,
@@ -8297,9 +8292,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);
}
@@ -29132,6 +29128,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));
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 7ddc7f8ab24..2ebb6222fb4 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -2369,6 +2369,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)
diff --git a/sql/sql_statistics.cc b/sql/sql_statistics.cc
index 1f034f490c8..84d0902193b 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;
}
@@ -2710,7 +2817,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();
}
@@ -2790,7 +2900,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();
@@ -2916,16 +3026,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;
@@ -3021,6 +3132,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;
}
}
@@ -3065,28 +3179,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);
@@ -3775,15 +3889,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);
}
}
@@ -3798,34 +3908,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;
@@ -3835,13 +3952,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).
@@ -3870,9 +3987,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());
@@ -3906,7 +4029,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
@@ -3951,6 +4074,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 929335f973e..8fb3fae97ba 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"
@@ -58,6 +59,10 @@
#include "ddl_log.h"
#include "debug.h" // debug_crash_here()
#include <algorithm>
+#include "rpl_mi.h"
+#include "rpl_rli.h"
+#include "log.h"
+
#ifdef _WIN32
#include <io.h>
@@ -89,6 +94,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
@@ -992,7 +1003,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,
@@ -1004,21 +1024,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;
}
@@ -2283,7 +2322,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);
}
@@ -3330,6 +3369,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);
@@ -6344,6 +6384,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);
@@ -6980,10 +7028,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");
@@ -7008,15 +7054,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. */
@@ -7111,7 +7156,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);
}
}
@@ -7296,6 +7342,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.
@@ -7309,9 +7435,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
@@ -7334,13 +7468,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");
@@ -7420,10 +7557,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);
@@ -7503,14 +7661,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"));
+ });
/* 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))
@@ -7619,7 +7786,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");
@@ -7636,7 +7803,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,
@@ -7681,6 +7848,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);
}
@@ -7874,8 +8043,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
@@ -8416,9 +8586,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;
}
@@ -9403,6 +9574,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
@@ -9460,6 +9778,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.
@@ -9598,6 +9924,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) &&
@@ -10006,6 +10333,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 ...
@@ -10377,7 +10706,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=
@@ -10432,6 +10762,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"));
+ });
// It's now safe to take the table level lock.
if (lock_tables(thd, table_list, alter_ctx.tables_opened,
MYSQL_LOCK_USE_MALLOC))
@@ -10544,6 +10893,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 */
@@ -10587,6 +10943,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 &&
@@ -10825,12 +11184,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;
@@ -10927,6 +11300,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:
diff --git a/sql/sql_table.h b/sql/sql_table.h
index eaa03bfaf8c..e3cfec9ca93 100644
--- a/sql/sql_table.h
+++ b/sql/sql_table.h
@@ -211,7 +211,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_yacc.yy b/sql/sql_yacc.yy
index eb1fee2a00c..f558e6da622 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;
@@ -1738,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
@@ -1792,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
@@ -3063,8 +3065,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:
@@ -3075,20 +3077,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 */
@@ -3096,8 +3084,8 @@ sp_pdparam_list:
;
sp_pdparams:
- sp_pdparams ',' sp_pdparam
- | sp_pdparam
+ sp_pdparams ',' sp_param
+ | sp_param
;
sp_parameter_type:
@@ -5054,7 +5042,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:
@@ -5068,15 +5056,34 @@ 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
{ /* Compatibility with MySQL */ }
| opt_storage ENGINE_SYM opt_equal storage_engines
@@ -5438,42 +5445,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:
@@ -6364,35 +6372,9 @@ asrow_attribute:
serial_attribute:
asrow_attribute
- | 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->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
+ | engine_defined_option
{
- (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
{
@@ -6798,33 +6780,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
- {
- 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
+ | engine_defined_option
{
- (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);
}
;
@@ -6862,10 +6820,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);
}
;
@@ -18072,11 +18032,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
@@ -18096,26 +18051,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;
@@ -18518,46 +18496,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);
@@ -18989,23 +18927,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 f2a498a95d0..789d95be1be 100644
--- a/sql/sys_vars.cc
+++ b/sql/sys_vars.cc
@@ -2409,6 +2409,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)
@@ -4917,7 +4923,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(
@@ -6517,7 +6525,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 f6f293290cd..3bf85449f6c 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -4320,6 +4320,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));
/*
diff --git a/sql/table.h b/sql/table.h
index 1c09f463d9e..3435de8a497 100644
--- a/sql/table.h
+++ b/sql/table.h
@@ -679,16 +679,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(); }
diff --git a/sql/temporary_tables.cc b/sql/temporary_tables.cc
index f3264a4c809..73f1f9f7a99 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)
{
@@ -874,12 +875,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/tztime.cc b/sql/tztime.cc
index 5f828d95e87..ae71a0e91c9 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;
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/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/connect/ha_connect.cc b/storage/connect/ha_connect.cc
index bc3e9b0cbc7..b9d3c4ae9ff 100644
--- a/storage/connect/ha_connect.cc
+++ b/storage/connect/ha_connect.cc
@@ -1812,6 +1812,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);
@@ -6944,6 +6950,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;
diff --git a/storage/connect/mysql-test/connect/r/index.result b/storage/connect/mysql-test/connect/r/index.result
index bffaaecc785..c156e10749e 100644
--- a/storage/connect/mysql-test/connect/r/index.result
+++ b/storage/connect/mysql-test/connect/r/index.result
@@ -139,3 +139,12 @@ DELETE FROM t1;
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
+#
+# 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 5e913582734..b631236832d 100644
--- a/storage/connect/mysql-test/connect/t/index.test
+++ b/storage/connect/mysql-test/connect/t/index.test
@@ -78,6 +78,16 @@ DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
+--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
#
diff --git a/storage/federatedx/ha_federatedx.cc b/storage/federatedx/ha_federatedx.cc
index 20a78b8e3ce..d4ac808add9 100644
--- a/storage/federatedx/ha_federatedx.cc
+++ b/storage/federatedx/ha_federatedx.cc
@@ -1218,7 +1218,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=
@@ -1239,7 +1238,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;
@@ -1262,7 +1260,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)
@@ -1304,16 +1307,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))
@@ -1344,12 +1339,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;
}
@@ -1364,7 +1359,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;
@@ -1374,7 +1369,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;
@@ -1384,7 +1379,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;
@@ -2639,10 +2634,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)))
@@ -2721,9 +2713,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 377af888d79..a382f9367f9 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 bb10160370a..96613ba1b72 100644
--- a/storage/innobase/CMakeLists.txt
+++ b/storage/innobase/CMakeLists.txt
@@ -171,7 +171,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
@@ -201,7 +200,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
@@ -332,7 +330,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 9b761b16983..f83994b4069 100644
--- a/storage/innobase/btr/btr0btr.cc
+++ b/storage/innobase/btr/btr0btr.cc
@@ -2234,7 +2234,8 @@ btr_page_insert_fits(
rec = page_rec_get_next(page_get_infimum_rec(page));
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 = page_rec_get_next(page_get_infimum_rec(page));
end_rec = split_rec;
@@ -2519,7 +2520,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
@@ -2896,7 +2897,8 @@ func_start:
? cursor->index->n_core_fields : 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,
@@ -4346,7 +4348,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);
@@ -4863,7 +4866,7 @@ func_exit:
/* 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 (!dict_index_is_spatial(index)
+ if (index->is_btree()
&& cmp_rec_rec(rec, right_rec,
offsets, offsets2, index) >= 0) {
@@ -4902,9 +4905,7 @@ func_exit:
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 (!dict_index_is_spatial(index)
- && block->page.id().page_no() != dict_index_get_page(index)) {
-
+ if (index->is_btree() && block->page.id().page_no() != index->page) {
/* Check father node pointers */
rec_t* node_ptr;
@@ -4965,7 +4966,7 @@ func_exit:
page_rec_get_next(page_get_infimum_rec(page)),
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)) {
const rec_t* first_rec = page_rec_get_next(
page_get_infimum_rec(page));
diff --git a/storage/innobase/btr/btr0cur.cc b/storage/innobase/btr/btr0cur.cc
index 873bc1fbd78..d97b88cc47d 100644
--- a/storage/innobase/btr/btr0cur.cc
+++ b/storage/innobase/btr/btr0cur.cc
@@ -1396,7 +1396,7 @@ btr_cur_search_to_nth_level_func(
# endif /* PAGE_CUR_LE_OR_EXTENDS */
&& info->last_hash_succ
&& !(tuple->info_bits & REC_INFO_MIN_REC_FLAG)
- && !index->is_spatial() && !index->table->is_temporary()
+ && index->is_btree() && !index->table->is_temporary()
&& btr_search_guess_on_hash(index, info, tuple, mode,
latch_mode, cursor,
ahi_latch, mtr)) {
@@ -1615,7 +1615,6 @@ retry_page_get:
case BTR_INSERT_OP:
case BTR_INSERT_IGNORE_UNIQUE_OP:
ut_ad(buf_mode == BUF_GET_IF_IN_POOL);
- ut_ad(!dict_index_is_spatial(index));
if (ibuf_insert(IBUF_OP_INSERT, tuple, index,
page_id, zip_size, cursor->thr)) {
@@ -1628,7 +1627,6 @@ retry_page_get:
case BTR_DELMARK_OP:
ut_ad(buf_mode == BUF_GET_IF_IN_POOL);
- ut_ad(!dict_index_is_spatial(index));
if (ibuf_insert(IBUF_OP_DELETE_MARK, tuple,
index, page_id, zip_size,
@@ -1643,7 +1641,7 @@ retry_page_get:
case BTR_DELETE_OP:
ut_ad(buf_mode == BUF_GET_IF_IN_POOL_OR_WATCH);
- ut_ad(!dict_index_is_spatial(index));
+ ut_ad(index->is_btree());
auto& chain = buf_pool.page_hash.cell_get(
page_id.fold());
@@ -1927,9 +1925,8 @@ retry_page_get:
DICT_INDEX_SPATIAL_NODEPTR_SIZE + 1;
}
#ifdef BTR_CUR_HASH_ADAPT
- } else if (height == 0 && btr_search_enabled
- && !(tuple->info_bits & REC_INFO_MIN_REC_FLAG)
- && !dict_index_is_spatial(index)) {
+ } else if (height == 0 && index->is_btree() && btr_search_enabled
+ && !(tuple->info_bits & REC_INFO_MIN_REC_FLAG)) {
/* The adaptive hash index is only used when searching
for leaf pages (height==0), but not in r-trees.
We only need the byte prefix comparison for the purpose
diff --git a/storage/innobase/btr/btr0pcur.cc b/storage/innobase/btr/btr0pcur.cc
index c45ce3be89e..5d9e4ecbeb2 100644
--- a/storage/innobase/btr/btr0pcur.cc
+++ b/storage/innobase/btr/btr0pcur.cc
@@ -437,7 +437,7 @@ btr_pcur_t::restore_position(ulint 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 53cc464f18f..9a51f49aaae 100644
--- a/storage/innobase/btr/btr0sea.cc
+++ b/storage/innobase/btr/btr0sea.cc
@@ -796,7 +796,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) {
@@ -851,7 +852,7 @@ btr_search_check_guess(
cursor->index->n_core_fields,
n_unique, &heap);
cmp = cmp_dtuple_rec_with_match(
- tuple, prev_rec, offsets, &match);
+ tuple, prev_rec, cursor->index, offsets, &match);
if (mode == PAGE_CUR_GE) {
success = cmp > 0;
} else {
@@ -875,7 +876,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 9a9b299a2ba..b8c1de88db3 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();
@@ -593,8 +594,8 @@ bool buf_page_is_corrupted(bool check_lsn, const byte *read_buf,
}
});
- 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");
@@ -764,18 +765,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;
@@ -1055,7 +1048,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;
}
@@ -1152,7 +1145,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);
@@ -1294,7 +1291,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);
@@ -1415,8 +1412,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) {
@@ -1499,15 +1496,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.
@@ -1530,8 +1527,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);
}
@@ -1609,11 +1606,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 */
@@ -1708,7 +1709,7 @@ withdraw_retry:
goto withdraw_retry;
}
- buf_resize_status("Latching whole of buffer pool.");
+ buf_resize_status("Latching entire buffer pool.");
#ifndef DBUG_OFF
{
@@ -1732,15 +1733,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()) {
@@ -1781,7 +1782,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;
@@ -1898,18 +1899,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 */
@@ -1917,9 +1918,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;
}
@@ -1931,16 +1931,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());
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 3c59955dbd8..00ded2a93aa 100644
--- a/storage/innobase/buf/buf0dblwr.cc
+++ b/storage/innobase/buf/buf0dblwr.cc
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved.
-Copyright (c) 2013, 2021, MariaDB Corporation.
+Copyright (c) 2013, 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
@@ -229,8 +229,6 @@ fail:
/* Remove doublewrite pages from LRU */
buf_pool_invalidate();
-
- ib::info() << "Doublewrite buffer created";
goto start_again;
}
@@ -342,7 +340,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_initialised())
return;
@@ -360,13 +358,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 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 5027034e23a..afc227169f3 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;
@@ -560,11 +562,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;
}
diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc
index a9b1a359f0e..21524933999 100644
--- a/storage/innobase/buf/buf0flu.cc
+++ b/storage/innobase/buf/buf0flu.cc
@@ -115,6 +115,7 @@ static void buf_flush_validate_skip()
/** Wake up the page cleaner if needed */
void buf_pool_t::page_cleaner_wakeup()
{
+ 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,7 +156,7 @@ void buf_pool_t::page_cleaner_wakeup()
}
}
-inline void buf_pool_t::delete_from_flush_list_low(buf_page_t *bpage)
+inline void buf_pool_t::delete_from_flush_list_low(buf_page_t *bpage) noexcept
{
ut_ad(!fsp_is_system_temporary(bpage->id().space()));
mysql_mutex_assert_owner(&flush_list_mutex);
@@ -163,40 +164,10 @@ inline void buf_pool_t::delete_from_flush_list_low(buf_page_t *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
- stat.flush_list_bytes+= block->physical_size();
- ut_ad(stat.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
@param clear whether to invoke buf_page_t::clear_oldest_modification() */
-void buf_pool_t::delete_from_flush_list(buf_page_t *bpage, bool clear)
+void buf_pool_t::delete_from_flush_list(buf_page_t *bpage, bool clear) noexcept
{
delete_from_flush_list_low(bpage);
stat.flush_list_bytes-= bpage->physical_size();
@@ -418,7 +389,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.
@@ -599,7 +570,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();
@@ -724,7 +695,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));
}
@@ -736,7 +707,7 @@ not_compressed:
}
/** Free a page whose underlying file page has been freed. */
-inline void buf_pool_t::release_freed_page(buf_page_t *bpage)
+inline void buf_pool_t::release_freed_page(buf_page_t *bpage) noexcept
{
mysql_mutex_assert_owner(&mutex);
mysql_mutex_lock(&flush_list_mutex);
@@ -890,8 +861,7 @@ inline bool buf_page_t::flush(bool lru, 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);
}
space->io(IORequest{type, this, slot}, physical_offset(), size,
write_frame, this);
@@ -1691,6 +1661,61 @@ ulint buf_flush_LRU(ulint max_n)
return n_flushed;
}
+#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()));
+
+ 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()
@@ -1698,34 +1723,26 @@ ulint buf_flush_LRU(ulint max_n)
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
@@ -1734,39 +1751,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;
}
@@ -1790,13 +1796,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);
}
@@ -1832,7 +1836,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())
@@ -1880,8 +1883,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);
log_checkpoint();
}
}
@@ -1891,7 +1893,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())
@@ -1950,12 +1951,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() &&
@@ -1968,13 +1967,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;
@@ -2172,6 +2169,12 @@ static ulint page_cleaner_flush_pages_recommendation(ulint last_pages_in,
return(n_pages);
}
+#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()
@@ -2474,7 +2477,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 c01b0e4ee66..33264bc88a1 100644
--- a/storage/innobase/buf/buf0lru.cc
+++ b/storage/innobase/buf/buf0lru.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
@@ -460,9 +460,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/data/data0data.cc b/storage/innobase/data/data0data.cc
index 14a0b3e19fd..e63ba450ea1 100644
--- a/storage/innobase/data/data0data.cc
+++ b/storage/innobase/data/data0data.cc
@@ -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
@@ -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 {
@@ -600,7 +568,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/dict0crea.cc b/storage/innobase/dict/dict0crea.cc
index 586de840cb5..f20e5e60154 100644
--- a/storage/innobase/dict/dict0crea.cc
+++ b/storage/innobase/dict/dict0crea.cc
@@ -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
diff --git a/storage/innobase/dict/dict0dict.cc b/storage/innobase/dict/dict0dict.cc
index ff16204a022..1a74db47bbf 100644
--- a/storage/innobase/dict/dict0dict.cc
+++ b/storage/innobase/dict/dict0dict.cc
@@ -1259,7 +1259,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);
@@ -2311,15 +2311,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;
@@ -2357,6 +2356,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. */
@@ -2388,7 +2389,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);
}
}
@@ -2702,17 +2703,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);
}
}
@@ -4687,7 +4683,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 27dd424dc1c..4e695d53681 100644
--- a/storage/innobase/dict/dict0load.cc
+++ b/storage/innobase/dict/dict0load.cc
@@ -1508,6 +1508,7 @@ dict_load_field_low(
ulint len;
unsigned pos_and_prefix_len;
unsigned prefix_len;
+ bool descending;
bool first_field;
ulint position;
@@ -1560,10 +1561,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;
}
@@ -1612,11 +1615,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;
}
@@ -3056,12 +3060,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 0da0c5acf0f..6e3b0e1fabb 100644
--- a/storage/innobase/dict/dict0mem.cc
+++ b/storage/innobase/dict/dict0mem.cc
@@ -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 31d2a73466e..ed0096445b4 100644
--- a/storage/innobase/dict/dict0stats.cc
+++ b/storage/innobase/dict/dict0stats.cc
@@ -1118,7 +1118,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);
@@ -1501,7 +1501,7 @@ dict_stats_update_transient(
ut_ad(!dict_index_is_ibuf(index));
- if (index->type & (DICT_FTS | DICT_SPATIAL)) {
+ if (!index->is_btree()) {
continue;
}
@@ -2490,8 +2490,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);
}
@@ -2840,9 +2839,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;
}
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 ceed1f3a67d..7b01d994ff3 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));
diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc
index dceaad099ca..a8299b8afc4 100644
--- a/storage/innobase/fil/fil0fil.cc
+++ b/storage/innobase/fil/fil0fil.cc
@@ -887,18 +887,22 @@ bool fil_space_free(uint32_t id, bool x_latched)
}
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);
@@ -1393,46 +1397,6 @@ void fil_set_max_space_id_if_bigger(uint32_t max_id)
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);
-
- uint32_t 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
@@ -1505,7 +1469,7 @@ inline void mtr_t::log_file_op(mfile_type_t type, uint32_t 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));
@@ -1523,6 +1487,15 @@ static void fil_name_write_rename_low(uint32_t space_id, const char *old_name,
mtr->log_file_op(FILE_RENAME, space_id, old_name, new_name);
}
+static void fil_name_commit_durable(mtr_t *mtr)
+{
+ 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);
+}
+
/** Write redo log for renaming a file.
@param[in] space_id tablespace id
@param[in] old_name tablespace file name
@@ -1533,8 +1506,7 @@ static void fil_name_write_rename(uint32_t space_id,
mtr_t mtr;
mtr.start();
fil_name_write_rename_low(space_id, old_name, new_name, &mtr);
- mtr.commit();
- log_write_up_to(mtr.commit_lsn(), true);
+ fil_name_commit_durable(&mtr);
}
/** Write FILE_MODIFY for a file.
@@ -1664,8 +1636,7 @@ pfs_os_file_t fil_delete_tablespace(uint32_t id)
mtr_t mtr;
mtr.start();
mtr.log_file_op(FILE_DELETE, id, space->chain.start->name);
- mtr.commit();
- log_write_up_to(mtr.commit_lsn(), true);
+ fil_name_commit_durable(&mtr);
/* Remove any additional files. */
if (char *cfg_name= fil_make_filepath(space->chain.start->name,
@@ -1692,13 +1663,13 @@ pfs_os_file_t fil_delete_tablespace(uint32_t id)
handle= fil_system.detach(space, true);
mysql_mutex_unlock(&fil_system.mutex);
- mysql_mutex_lock(&log_sys.mutex);
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
if (space->max_lsn)
{
ut_d(space->max_lsn = 0);
fil_system.named_spaces.remove(*space);
}
- mysql_mutex_unlock(&log_sys.mutex);
+ log_sys.latch.wr_unlock();
fil_space_free_low(space);
}
@@ -1899,11 +1870,14 @@ static bool fil_rename_tablespace(uint32_t id, const char *old_path,
ut_ad(strchr(new_file_name, '/'));
if (!recv_recovery_is_on()) {
- mysql_mutex_lock(&log_sys.mutex);
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
}
- /* log_sys.mutex is above fil_system.mutex in the latching order */
- mysql_mutex_assert_owner(&log_sys.mutex);
+ /* log_sys.latch is above fil_system.mutex in the latching order */
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(log_sys.latch.is_write_locked() ||
+ srv_operation == SRV_OPERATION_RESTORE_DELTA);
+#endif
mysql_mutex_lock(&fil_system.mutex);
space->release();
ut_ad(node->name == old_file_name);
@@ -1926,7 +1900,7 @@ skip_second_rename:
}
if (!recv_recovery_is_on()) {
- mysql_mutex_unlock(&log_sys.mutex);
+ log_sys.latch.wr_unlock();
}
mysql_mutex_unlock(&fil_system.mutex);
@@ -1979,8 +1953,7 @@ fil_ibd_create(
mtr.start();
mtr.log_file_op(FILE_CREATE, space_id, path);
- mtr.commit();
- log_write_up_to(mtr.commit_lsn(), true);
+ fil_name_commit_durable(&mtr);
ulint type;
static_assert(((UNIV_ZIP_SIZE_MIN >> 1) << 3) == 4096,
@@ -2779,8 +2752,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);
@@ -3079,19 +3052,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 */
@@ -3099,7 +3059,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);
@@ -3109,56 +3071,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();
@@ -3181,20 +3135,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/fsp/fsp0file.cc b/storage/innobase/fsp/fsp0file.cc
index e85674401ee..c32f9d296c9 100644
--- a/storage/innobase/fsp/fsp0file.cc
+++ b/storage/innobase/fsp/fsp0file.cc
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 2013, 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
@@ -353,7 +353,7 @@ dberr_t Datafile::validate_to_dd(uint32_t space_id, uint32_t 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);
}
@@ -396,7 +396,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:
@@ -443,7 +443,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);
@@ -453,11 +453,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;
@@ -467,14 +466,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) {
@@ -790,7 +781,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 f6b4470c242..8d9b2168ab9 100644
--- a/storage/innobase/fsp/fsp0fsp.cc
+++ b/storage/innobase/fsp/fsp0fsp.cc
@@ -449,8 +449,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))
@@ -460,8 +459,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,
diff --git a/storage/innobase/fsp/fsp0sysspace.cc b/storage/innobase/fsp/fsp0sysspace.cc
index 56ef4959690..9b91b94cd4f 100644
--- a/storage/innobase/fsp/fsp0sysspace.cc
+++ b/storage/innobase/fsp/fsp0sysspace.cc
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 2013, 2016, Oracle and/or its affiliates. All Rights Reserved.
-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 the Free Software
@@ -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";
@@ -525,16 +525,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);
@@ -566,7 +561,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
@@ -593,6 +588,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);
@@ -830,14 +832,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;
@@ -886,10 +886,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 afbb904d5c5..3cb48765791 100644
--- a/storage/innobase/fts/fts0fts.cc
+++ b/storage/innobase/fts/fts0fts.cc
@@ -3931,7 +3931,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 faccc83cef4..d286a034dc1 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -170,6 +170,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;
@@ -239,10 +241,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);
@@ -530,8 +532,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;
@@ -563,11 +563,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),
@@ -593,8 +591,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"
@@ -608,8 +607,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 */
@@ -630,7 +630,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 */
@@ -954,12 +953,12 @@ static SHOW_VAR innodb_status_variables[]= {
{"buffer_pool_reads",
&export_vars.innodb_buffer_pool_reads, 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},
@@ -984,9 +983,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,
@@ -998,11 +997,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},
@@ -1628,54 +1622,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)
-{
- 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)
+static bool innobase_flush_logs(handlerton*)
{
- 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;
}
/************************************************************************//**
@@ -3754,11 +3708,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.",
@@ -3815,17 +3764,26 @@ static ulonglong innodb_prepare_commit_versioned(THD* thd, ulonglong *trx_id)
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;
}
@@ -4053,23 +4011,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) {
@@ -4125,6 +4066,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;
@@ -5543,6 +5492,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
@@ -10943,7 +10897,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(
@@ -11037,7 +10993,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));
@@ -11601,6 +11559,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 != 1
+ || (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)) {
@@ -16875,7 +16835,8 @@ ha_innobase::cmp_ref(
}
if (result) {
-
+ if (key_part->key_part_flag & HA_REVERSE_SORT)
+ result = -result;
return(result);
}
@@ -17424,16 +17385,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 */
@@ -18332,31 +18288,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);
}
/****************************************************************//**
@@ -18503,50 +18450,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.
@@ -18781,7 +18693,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;
@@ -18964,7 +18876,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,
@@ -19099,13 +19011,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,
@@ -19351,23 +19263,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,
@@ -19806,8 +19717,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),
@@ -20911,7 +20824,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);
@@ -21256,12 +21169,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 36db7f17fd4..d794506dc15 100644
--- a/storage/innobase/handler/handler0alter.cc
+++ b/storage/innobase/handler/handler0alter.cc
@@ -3669,6 +3669,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)
@@ -3770,6 +3772,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. */
@@ -3825,6 +3828,8 @@ innobase_fts_check_doc_id_index(
if ((key.flags & HA_NOSAME)
&& key.user_defined_key_parts == 1
+ && !(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)) {
@@ -3854,7 +3859,7 @@ innobase_fts_check_doc_id_index(
}
if (!dict_index_is_unique(index)
- || dict_index_get_n_unique(index) > 1
+ || dict_index_get_n_unique(index) != 1
|| strcmp(index->name, FTS_DOC_ID_INDEX_NAME)) {
return(FTS_INCORRECT_DOC_ID_INDEX);
}
@@ -3865,6 +3870,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
@@ -3906,6 +3912,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 != 1
+ || (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)) {
@@ -4103,6 +4110,7 @@ created_clustered:
index->n_fields = 1;
index->fields->col_no = fts_doc_id_col;
index->fields->prefix_len = 0;
+ index->fields->descending = false;
index->fields->is_v_col = false;
index->ind_type = DICT_UNIQUE;
ut_ad(!rebuild
@@ -4712,7 +4720,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
@@ -4805,10 +4814,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
@@ -8988,7 +9003,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");
@@ -9009,10 +9024,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;
}
}
@@ -9027,8 +9043,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);
@@ -9048,15 +9066,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);
@@ -9078,7 +9097,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;
}
}
diff --git a/storage/innobase/ibuf/ibuf0ibuf.cc b/storage/innobase/ibuf/ibuf0ibuf.cc
index 3bd1deced5c..e1d08a49aef 100644
--- a/storage/innobase/ibuf/ibuf0ibuf.cc
+++ b/storage/innobase/ibuf/ibuf0ibuf.cc
@@ -1632,6 +1632,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
@@ -2621,7 +2622,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)));
@@ -3543,7 +3544,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());
diff --git a/storage/innobase/include/buf0buf.h b/storage/innobase/include/buf0buf.h
index 0c61888e5cc..24a092ed5b5 100644
--- a/storage/innobase/include/buf0buf.h
+++ b/storage/innobase/include/buf0buf.h
@@ -808,7 +808,7 @@ public:
{
ut_ad(fsp_is_system_temporary(id().space()));
ut_ad(in_file());
- ut_ad(!oldest_modification());
+ ut_ad(!oldest_modification() || oldest_modification() == 2);
oldest_modification_= 2;
}
@@ -1743,6 +1743,12 @@ public:
FlushHp flush_hp;
/** modified blocks (a subset of LRU) */
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:
/** whether the page cleaner needs wakeup from indefinite sleep */
bool page_cleaner_is_idle;
@@ -1753,7 +1759,7 @@ public:
pthread_cond_t do_flush_list;
/** @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_is_idle;
@@ -1878,24 +1884,31 @@ public:
private:
/** Remove a block from the flush list. */
- inline void delete_from_flush_list_low(buf_page_t *bpage);
+ inline void delete_from_flush_list_low(buf_page_t *bpage) noexcept;
/** Remove a block from flush_list.
@param bpage buffer pool page
@param clear whether to invoke buf_page_t::clear_oldest_modification() */
- void delete_from_flush_list(buf_page_t *bpage, bool clear);
+ void delete_from_flush_list(buf_page_t *bpage, bool clear) noexcept;
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
{ delete_from_flush_list(bpage, true); }
+ /** 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. */
- inline void release_freed_page(buf_page_t *bpage);
+ inline 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 665fd1115e7..af38f61b13b 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
@@ -103,33 +103,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 if (fsp_is_system_temporary(b->page.id().space()))
- b->page.set_temp_modified();
- 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/data0data.h b/storage/innobase/include/data0data.h
index c2b8c3e00b6..a9b4aeb1ea3 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/dict0dict.h b/storage/innobase/include/dict0dict.h
index 57af86bcf85..f580a0f49b5 100644
--- a/storage/innobase/include/dict0dict.h
+++ b/storage/innobase/include/dict0dict.h
@@ -1092,16 +1092,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/dict0mem.h b/storage/innobase/include/dict0mem.h
index aaf232366e3..5a316f8c734 100644
--- a/storage/innobase/include/dict0mem.h
+++ b/storage/innobase/include/dict0mem.h
@@ -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
@@ -1434,6 +1425,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 */
diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h
index 79583000173..d6c7e07eaf5 100644
--- a/storage/innobase/include/fil0fil.h
+++ b/storage/innobase/include/fil0fil.h
@@ -353,13 +353,10 @@ struct fil_space_t final
/** 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 */
@@ -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;
@@ -649,11 +647,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 */
@@ -674,11 +668,7 @@ public:
/** Clear all freed ranges for undo tablespace when InnoDB
encounters TRIM redo log record */
- void clear_freed_ranges()
- {
- std::lock_guard<std::mutex> freed_lock(freed_range_mutex);
- freed_ranges.clear();
- }
+ 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. */
@@ -951,7 +941,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);
}
@@ -1052,7 +1041,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;
@@ -1444,14 +1433,12 @@ public:
/** 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 tablespaces */
ilist<fil_space_t, space_list_tag_t> space_list;
- /*!< list of all file spaces */
+ /** 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 ENCRYPTED=DEFAULT tablespaces that need
to be converted to the current value of innodb_encrypt_tables */
@@ -1603,15 +1590,6 @@ Sets the max tablespace id counter if the given number is bigger than the
previous value. */
void fil_set_max_space_id_if_bigger(uint32_t max_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));
-
MY_ATTRIBUTE((warn_unused_result))
/** Delete a tablespace and associated .ibd file.
@param id tablespace identifier
@@ -1780,50 +1758,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/fsp0file.h b/storage/innobase/include/fsp0file.h
index 9dfb3cc7561..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
@@ -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.
diff --git a/storage/innobase/include/fsp0sysspace.h b/storage/innobase/include/fsp0sysspace.h
index b6bdadd3501..514f3fdbf25 100644
--- a/storage/innobase/include/fsp0sysspace.h
+++ b/storage/innobase/include/fsp0sysspace.h
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 2013, 2016, Oracle and/or its affiliates. All Rights Reserved.
-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 the Free Software
@@ -151,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. */
diff --git a/storage/innobase/include/ibuf0ibuf.inl b/storage/innobase/include/ibuf0ibuf.inl
index 2c2620511c7..2d8265d2206 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
@@ -130,12 +131,17 @@ ibuf_should_try(
a secondary index when we
decide */
{
- return(innodb_change_buffering
- && ibuf.max_size != 0
- && !dict_index_is_clust(index)
- && !dict_index_is_spatial(index)
- && index->table->quiesce == QUIESCE_NONE
- && (ignore_sec_unique || !dict_index_is_unique(index)));
+ if (!innodb_change_buffering || !ibuf.max_size || index->is_clust() ||
+ index->is_spatial())
+ 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 629ddacdf1b..d1c6e40d946 100644
--- a/storage/innobase/include/log0log.h
+++ b/storage/innobase/include/log0log.h
@@ -2,7 +2,7 @@
Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved.
Copyright (c) 2009, Google Inc.
-Copyright (c) 2017, 2021, MariaDB Corporation.
+Copyright (c) 2017, 2022, MariaDB Corporation.
Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described
@@ -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;
-};
+struct log_t;
-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};
-};
-
-/** 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)} {}
-
- dberr_t open(bool read_only) noexcept;
- bool is_opened() const noexcept;
+ log_file_t()= default;
+ log_file_t(os_file_t file) noexcept : m_file(file) {}
- const std::string &get_path() const noexcept { return m_path; }
+ /** 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; }
- 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,127 +188,77 @@ 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;
- /** 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 */
+ /** 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;
- /** log_buffer, writing data to file from this buffer.
- Before flushing write_buf is swapped with flush_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;
- /** 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 */
- /* @} */
+ /** number of std::swap(buf, flush_buf) and writes from buf to log;
+ protected by latch.wr_lock() */
+ ulint write_to_log;
+ /** 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
@@ -597,12 +276,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) */
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;
@@ -610,32 +289,68 @@ public:
byte *checkpoint_buf;
/* @} */
-private:
- bool m_initialised;
-public:
- /**
- Constructor.
+ bool is_initialised() const noexcept { return max_buf_free != 0; }
- Some members may require late initialisation, thus we just mark object as
- uninitialised. Real initialisation happens in create().
- */
- log_t(): m_initialised(false) {}
+#ifdef HAVE_PMEM
+ bool is_pmem() const noexcept { return !flush_buf; }
+#else
+ static constexpr bool is_pmem() { return false; }
+#endif
- /** @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(); }
+ bool is_opened() const noexcept { return log.is_opened(); }
+
+ 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
+
+ void attach(log_file_t file, os_offset_t size);
+
+ void close_file();
- bool is_initialised() const { return m_initialised; }
+ /** 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
{
@@ -645,96 +360,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 73434737925..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_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 6c47c135526..c661c52905b 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
@@ -228,35 +207,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>,
@@ -284,10 +252,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(); }
@@ -313,17 +281,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);
@@ -343,22 +307,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();
@@ -441,20 +425,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 093b706c1de..ca194f905b5 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 84f62334c5c..f068467f70c 100644
--- a/storage/innobase/include/mtr0mtr.h
+++ b/storage/innobase/include/mtr0mtr.h
@@ -105,10 +105,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 { ut_ad(is_active()); return m_memo.size(); }
@@ -319,12 +320,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 */
@@ -592,6 +590,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
{
@@ -610,6 +611,11 @@ public:
#endif
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
@@ -635,6 +641,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();
@@ -642,7 +655,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 the resources */
inline void release_resources();
@@ -666,7 +679,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 */
@@ -681,6 +694,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;
@@ -688,6 +704,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/mtr0mtr.inl b/storage/innobase/include/mtr0mtr.inl
index 71b476a2f5d..0b45bc1d695 100644
--- a/storage/innobase/include/mtr0mtr.inl
+++ b/storage/innobase/include/mtr0mtr.inl
@@ -49,9 +49,8 @@ mtr_t::memo_push(void* object, mtr_memo_type_t type)
ut_ad(type == MTR_MEMO_PAGE_X_MODIFY || ut_is_2pow(type));
/* If this mtr has x-fixed a clean page then we set
- the made_dirty flag. This tells us if we need to
- grab log_sys.flush_order_mutex at mtr_t::commit() so that we
- can insert the dirtied page into the flush list. */
+ the made_dirty flag. This tells mtr_t::commit()
+ to hold log_sys.latch longer. */
if (!m_made_dirty
&& (type == MTR_MEMO_PAGE_X_FIX || type == MTR_MEMO_PAGE_SX_FIX)) {
@@ -107,9 +106,8 @@ mtr_t::sx_latch_at_savepoint(
mtr_memo_slot_t* slot = m_memo.at<mtr_memo_slot_t*>(savepoint);
ut_ad(slot->object == block);
-
- /* == RW_NO_LATCH */
- ut_a(slot->type == MTR_MEMO_BUF_FIX);
+ ut_ad(slot->type == MTR_MEMO_BUF_FIX); /* == RW_NO_LATCH */
+ slot->type = MTR_MEMO_PAGE_SX_FIX;
block->page.lock.u_lock();
ut_ad(!block->page.is_io_fixed());
@@ -117,8 +115,6 @@ mtr_t::sx_latch_at_savepoint(
if (!m_made_dirty) {
m_made_dirty = is_block_dirtied(block);
}
-
- slot->type = MTR_MEMO_PAGE_SX_FIX;
}
/**
@@ -141,9 +137,8 @@ mtr_t::x_latch_at_savepoint(
mtr_memo_slot_t* slot = m_memo.at<mtr_memo_slot_t*>(savepoint);
ut_ad(slot->object == block);
-
- /* == RW_NO_LATCH */
- ut_a(slot->type == MTR_MEMO_BUF_FIX);
+ ut_ad(slot->type == MTR_MEMO_BUF_FIX); /* == RW_NO_LATCH */
+ slot->type = MTR_MEMO_PAGE_X_FIX;
block->page.lock.x_lock();
ut_ad(!block->page.is_io_fixed());
@@ -151,8 +146,6 @@ mtr_t::x_latch_at_savepoint(
if (!m_made_dirty) {
m_made_dirty = is_block_dirtied(block);
}
-
- slot->type = MTR_MEMO_PAGE_X_FIX;
}
/**
diff --git a/storage/innobase/include/mtr0types.h b/storage/innobase/include/mtr0types.h
index 7acc255da36..1de31126a88 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 fe977c10633..727e9e49ead 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
@@ -456,7 +447,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 6f7c633561f..48ac428f09c 100644
--- a/storage/innobase/include/page0cur.inl
+++ b/storage/innobase/include/page0cur.inl
@@ -272,6 +272,7 @@ page_cur_tuple_insert(
index, rec, *offsets, mtr);
}
- ut_ad(!rec || !cmp_dtuple_rec(tuple, rec, *offsets));
+ ut_ad(!rec || !cmp_dtuple_rec(tuple, rec, index, *offsets));
return(rec);
}
+
diff --git a/storage/innobase/include/page0page.h b/storage/innobase/include/page0page.h
index 4787ce36c7a..ae06d06ad5e 100644
--- a/storage/innobase/include/page0page.h
+++ b/storage/innobase/include/page0page.h
@@ -1130,7 +1130,7 @@ page_find_rec_with_heap_no(
@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(
+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 f29fd98ad30..ec435df17d8 100644
--- a/storage/innobase/include/row0merge.h
+++ b/storage/innobase/include/row0merge.h
@@ -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 */
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 4cd77b08a60..41f61567b53 100644
--- a/storage/innobase/include/srv0srv.h
+++ b/storage/innobase/include/srv0srv.h
@@ -86,28 +86,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 buffer pool reads that led to the reading of
a disk page */
ulint_ctr_1_t buf_pool_reads;
@@ -286,18 +264,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 */
@@ -459,9 +434,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;
@@ -688,7 +667,6 @@ struct export_var_t{
ulint innodb_buffer_pool_pages_old;
ulint innodb_buffer_pool_read_requests; /*!< buf_pool.stat.n_page_gets */
ulint innodb_buffer_pool_reads; /*!< srv_buf_pool_reads */
- ulint innodb_buffer_pool_write_requests;/*!< srv_stats.buf_pool_write_requests */
ulint innodb_buffer_pool_read_ahead_rnd;/*!< srv_read_ahead_rnd */
ulint innodb_buffer_pool_read_ahead; /*!< srv_read_ahead */
ulint innodb_buffer_pool_read_ahead_evicted;/*!< srv_read_ahead evicted*/
@@ -696,8 +674,6 @@ struct export_var_t{
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 */
@@ -706,9 +682,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;
@@ -717,10 +690,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/univ.i b/storage/innobase/include/univ.i
index 567554f34c3..6dc1d8b7341 100644
--- a/storage/innobase/include/univ.i
+++ b/storage/innobase/include/univ.i
@@ -510,8 +510,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;
@@ -538,6 +536,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/ut0ut.h b/storage/innobase/include/ut0ut.h
index 89ff0ca709f..95541ea574e 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 e127507e544..efdd527a28f 100644
--- a/storage/innobase/log/log0log.cc
+++ b/storage/innobase/log/log0log.cc
@@ -52,6 +52,7 @@ Created 12/9/1995 Heikki Tuuri
#include "srv0mon.h"
#include "buf0dump.h"
#include "log0sync.h"
+#include "log.h"
/*
General philosophy of InnoDB redo-logs:
@@ -60,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. */
@@ -171,716 +100,661 @@ 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
-{
- return os_file_read(IORequestRead, m_fd, buf.data(), offset, buf.size());
-}
-
-dberr_t file_os_io::write(const char *path, os_offset_t offset,
- span<const byte> buf) noexcept
+dberr_t log_file_t::read(os_offset_t offset, span<byte> buf) noexcept
{
- return os_file_write(IORequestWrite, path, m_fd, buf.data(), offset,
- buf.size());
+ ut_ad(is_opened());
+ return os_file_read(IORequestRead, m_file, buf.data(), offset, buf.size());
}
-dberr_t file_os_io::flush() noexcept
+void log_file_t::write(os_offset_t offset, span<const byte> buf) 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
-{
- if (!m_area.empty())
- unmap();
-}
-
-dberr_t mapped_file_t::map(const char *path, bool read_only,
- bool nvme) noexcept
+void log_t::attach(log_file_t file, os_offset_t size)
{
- 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};
+ log= file;
+ ut_ad(!size || size >= START_OFFSET + SIZE_OF_FILE_CHECKPOINT);
+ file_size= 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))
+ {
+ 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);
+ 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);
- byte *buf= log_sys.checkpoint_buf;
- memset_aligned<OS_FILE_LOG_BLOCK_SIZE>(buf, 0, OS_FILE_LOG_BLOCK_SIZE);
-
- 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());
- if (flush_to_disk)
+#ifdef HAVE_PMEM
+ if (log_sys.is_pmem())
+ {
+ ut_ad(!callback);
+ if (durable)
+ log_sys.persist(lsn);
+ return;
+ }
+#endif
+
+repeat:
+ if (durable)
{
if (flush_lock.acquire(lsn, callback) != group_commit_lock::ACQUIRED)
return;
flush_lock.set_pending(log_sys.get_lsn());
}
+
+
+ lsn_t pending_write_lsn= 0, pending_flush_lsn= 0;
- if (write_lock.acquire(lsn, flush_to_disk ? nullptr : callback) ==
+ 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);
@@ -888,20 +762,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
}
/********************************************************************
@@ -910,90 +783,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,
- lsn_t{log_sys.last_checkpoint_lsn},
- log_sys.get_flushed_lsn()));
-
- MONITOR_INC(MONITOR_NUM_CHECKPOINT);
-
- mysql_mutex_unlock(&log_sys.mutex);
+ if (log_sys.buf_free > log_sys.max_buf_free)
+ log_buffer_flush_to_disk(false);
}
/****************************************************************//**
@@ -1005,26 +796,27 @@ 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)
{
log_sys.set_check_flush_or_checkpoint(false);
goto func_exit;
}
- 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)));
@@ -1173,24 +965,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) {
ib::info() << "Executing innodb_fast_shutdown=2."
@@ -1215,24 +989,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;
@@ -1247,23 +1022,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());
@@ -1278,10 +1044,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);
@@ -1298,40 +1061,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. */
@@ -1339,21 +1069,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)
@@ -1377,23 +1113,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 ee274765a98..171afa1f23c 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 */
@@ -277,19 +277,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;
@@ -1165,36 +1165,22 @@ 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();
}
/** Process a file name from a FILE_* record.
-@param[in,out] name file name
+@param[in] name file name
@param[in] len length of the file name
@param[in] space_id the tablespace ID
@param[in] deleted whether this is a FILE_DELETE record
@@ -1203,8 +1189,8 @@ inline size_t recv_sys_t::files_size()
stored */
static
void
-fil_name_process(char* name, ulint len, uint32_t space_id,
- bool deleted, lsn_t lsn, store_t *store)
+fil_name_process(const char* name, ulint len, uint32_t space_id,
+ bool deleted, lsn_t lsn, store_t store)
{
if (srv_operation == SRV_OPERATION_BACKUP
|| srv_operation == SRV_OPERATION_BACKUP_NO_DEFER) {
@@ -1250,7 +1236,7 @@ fil_name_process(char* name, ulint len, uint32_t space_id,
the space_id. If not, ignore the file after displaying
a note. Abort if there are multiple files with the
same space_id. */
- switch (fil_ibd_load(space_id, name, space)) {
+ switch (fil_ibd_load(space_id, fname.name.c_str(), space)) {
case FIL_LOAD_OK:
ut_ad(space != NULL);
@@ -1273,12 +1259,14 @@ same_space:
sql_print_error("InnoDB: Tablespace " UINT32PF
" has been found"
" in two places:"
- " '%.*s' and '%s'."
+ " '%.*s' and '%.*s'."
" You must delete"
" one of them.",
space_id,
int(f.name.size()),
- f.name.data(), name);
+ f.name.data(),
+ int(fname.name.size()),
+ fname.name.data());
recv_sys.set_corrupt_fs();
}
break;
@@ -1303,20 +1291,21 @@ same_space:
sql_print_information(
"InnoDB: At LSN: " LSN_PF
- ": unable to open file %s"
+ ": unable to open file %.*s"
" for tablespace " UINT32PF,
- recv_sys.recovered_lsn,
- name, space_id);
+ recv_sys.lsn,
+ int(fname.name.size()),
+ fname.name.data(), space_id);
}
break;
case FIL_LOAD_DEFER:
/** Skip the deferred spaces
when lsn is already processed */
- if (*store != store_t::STORE_IF_EXISTS) {
+ if (store != store_t::STORE_IF_EXISTS) {
deferred_spaces.add(
static_cast<uint32_t>(space_id),
- name, lsn);
+ fname.name.c_str(), lsn);
}
break;
case FIL_LOAD_INVALID:
@@ -1373,12 +1362,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);
@@ -1401,17 +1384,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;
@@ -1452,9 +1430,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);
}
@@ -1538,176 +1513,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))) {
- sql_print_information("InnoDB: Read redo log up to LSN="
- LSN_PF, *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;
-
- sql_print_error("InnoDB: Log file %.*s is of different size " UINT64PF
- " bytes than other log files " UINT64PF " bytes!",
- int(it->size()), it->data(), get_size(*it), size);
- 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. */
@@ -1736,12 +1546,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;
@@ -1754,22 +1560,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))
{
@@ -1783,287 +1588,345 @@ 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 const char NO_UPGRADE_RECOVERY_MSG[]=
- "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 (log_block_calc_checksum_format_0(buf) != log_block_get_checksum(buf) &&
- !log_crypt_101_read_block(buf, lsn))
+ 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) !=
+ mach_read_from_4(my_assume_aligned<4>(buf + 508)) &&
+ !log_crypt_101_read_block(buf, log_sys.next_checkpoint_lsn))
{
- sql_print_error("InnoDB: %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("InnoDB: %s.", NO_UPGRADE_RECOVERY_MSG);
+ sql_print_error("%s%s.", 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
+/** 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_5(lsn_t lsn_offset)
{
- const lsn_t size= capacity() * recv_sys.files_size();
- lsn_t l= lsn - this->lsn;
- if (longlong(l) < 0)
+ byte *buf= const_cast<byte*>(field_ref_zero);
+
+ 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 & ~511, {buf, 512});
+
+ if (!recv_check_log_block(buf))
{
- l= lsn_t(-longlong(l)) % size;
- l= size - l;
+ sql_print_error("InnoDB: Invalid log header checksum");
+ return DB_CORRUPTION;
}
- 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));
+ 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. */
+
+ if (mach_read_from_2(my_assume_aligned<2>(buf + 4)) != (lsn_offset & 511))
+ return DB_ERROR;
+
+ return DB_SUCCESS;
}
-/** Determine if a redo log from MariaDB 10.2.2+, 10.3, or 10.4 is clean.
-@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()
+dberr_t recv_sys_t::find_checkpoint()
{
- 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;
-
- if (!redo_file_sizes_are_correct()) {
- return DB_CORRUPTION;
- }
+ bool wrong_size= false;
+ byte *buf;
- recv_sys.read(source_offset & ~(OS_FILE_LOG_BLOCK_SIZE - 1),
- {buf, OS_FILE_LOG_BLOCK_SIZE});
+ 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;
+ }
- ulint crc = log_block_calc_checksum_crc32(buf);
- ulint cksum = log_block_get_checksum(buf);
+ 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);
+ }
- if (UNIV_UNLIKELY(crc != cksum)) {
- sql_print_error("InnoDB: Invalid log block checksum."
- " block: " ULINTPF " checkpoint no: " ULINTPF
- " expected: " ULINTPF " found: " ULINTPF,
- log_block_get_hdr_no(buf),
- log_block_get_checkpoint_no(buf), crc, cksum);
- return DB_CORRUPTION;
- }
+ 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 (log_sys.log.is_encrypted()
- && !log_crypt(buf, lsn & ~511, 512, LOG_DECRYPT)) {
- return DB_ERROR;
- }
+ if (!recv_check_log_block(buf))
+ {
+ sql_print_error("InnoDB: Invalid log header checksum");
+ return DB_CORRUPTION;
+ }
- /* On a clean shutdown, the redo log will be logically empty
- after the checkpoint lsn. */
+ 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;
- if (log_block_get_data_len(buf)
- != (source_offset & (OS_FILE_LOG_BLOCK_SIZE - 1))) {
- return DB_ERROR;
- }
+ lsn_t lsn_offset= 0;
- /* 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;
-}
+ 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;
+ }
-/** 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)
-{
- 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);
- }
+ 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;
+ }
- 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 (!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;
- 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});
+ 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;
+ }
- const ulint crc32 = log_block_calc_checksum_crc32(buf);
- const ulint cksum = log_block_get_checksum(buf);
+ 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 (crc32 != cksum) {
- DBUG_PRINT("ib_log",
- ("invalid checkpoint,"
- " at " ULINTPF
- ", checksum " ULINTPFx
- " expected " ULINTPFx,
- field, cksum, crc32));
- continue;
- }
+ 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(buf)) {
- sql_print_error("InnoDB: Reading checkpoint"
- " encryption info failed.");
- continue;
- }
+ if (log_sys.is_encrypted() && !log_crypt_read_checkpoint_buf(b))
+ {
+ sql_print_error("InnoDB: Reading checkpoint encryption info failed.");
+ continue;
+ }
- 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;
- }
- }
+ 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 (*max_field == 0) {
- /* Before 10.2.2, we could get here during database
- initialization if we created an ib_logfile0 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);
- }
+ 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;
+ }
- 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
- ? "" : ", and it appears corrupted"));
- return err;
- }
- }
+ if (wrong_size)
+ return DB_CORRUPTION;
- return(DB_SUCCESS);
-}
+ if (dberr_t err= recv_log_recover_10_5(lsn_offset))
+ {
+ sql_print_error("%s The redo log was created with %s%s",
+ srv_operation == SRV_OPERATION_NORMAL
+ ? "InnoDB: Upgrade after a crash is not supported."
+ : "mariadb-backup --prepare is not possible.", creator,
+ (err == DB_ERROR ? "." : ", and it appears corrupted."));
+ return err;
+ }
-/*******************************************************//**
-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);
+ goto upgrade;
}
/** Trim old log records for a page.
@@ -2110,7 +1973,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)
@@ -2159,7 +2022,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.
@@ -2169,8 +2032,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)
@@ -2195,83 +2056,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)
- sql_print_warning("InnoDB: Ignoring unknown log record at LSN " LSN_PF,
- recovered_lsn);
- else
- {
-malformed:
- sql_print_error("InnoDB: 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));
- sql_print_information("InnoDB: Dump from the start of the"
- " mini-transaction (LSN=" LSN_PF ") to %zu"
- " bytes after the record:",
- start_lsn, trailing_bytes);
- 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))
- {
- sql_print_error("InnoDB: 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 */
@@ -2286,58 +2396,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;
+ {
+ 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, recovered_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)
{
sql_print_error("InnoDB: Corrupted page identifier at " LSN_PF
"; set innodb_force_recovery=1 to ignore the record.",
- recovered_lsn);
+ lsn);
goto corrupted;
}
sql_print_warning("InnoDB: Ignoring corrupted page identifier at LSN "
- LSN_PF, recovered_lsn);
+ LSN_PF, lsn);
continue;
}
space_id= mlog_decode_varint(l);
@@ -2353,12 +2488,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. */
@@ -2369,23 +2513,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());
@@ -2404,7 +2550,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))
@@ -2416,7 +2563,7 @@ same_page:
static_assert(UT_ARR_SIZE(truncated_undo_spaces) ==
TRX_SYS_MAX_UNDO_SPACES, "compatibility");
truncated_undo_spaces[space_id - srv_undo_space_id_start]=
- { recovered_lsn, page_no };
+ { lsn, page_no };
#endif
last_offset= 1; /* the next record must not be same_page */
continue;
@@ -2425,7 +2572,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;
@@ -2434,10 +2584,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))
@@ -2445,13 +2597,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;
@@ -2462,15 +2614,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)
{
@@ -2482,30 +2634,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;
@@ -2513,8 +2668,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) {
@@ -2529,7 +2683,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))
{
@@ -2544,10 +2698,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:
@@ -2565,41 +2720,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;
sql_print_warning("InnoDB: Ignoring malformed log record at LSN "
- LSN_PF, recovered_lsn);
+ LSN_PF, lsn);
continue;
case FILE_DELETE:
case FILE_MODIFY:
@@ -2615,7 +2771,7 @@ same_page:
}
sql_print_warning("InnoDB: Ignoring corrupted file-level record"
- " at LSN " LSN_PF, recovered_lsn);
+ " at LSN " LSN_PF, lsn);
continue;
}
/* fall through */
@@ -2624,7 +2780,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)))
@@ -2647,22 +2804,23 @@ same_page:
if (fnend - fn < 4 || memcmp(fnend - 4, DOT_IBD, 4))
goto file_rec_error;
- const char saved_end= fn[rlen];
- const_cast<char&>(fn[rlen])= '\0';
- fil_name_process(const_cast<char*>(fn), fnend - fn, space_id,
+ if (UNIV_UNLIKELY(!recv_needed_recovery && srv_read_only_mode))
+ continue;
+
+ fil_name_process(fn, fnend - fn, space_id,
(b & 0xf0) == FILE_DELETE, start_lsn,
store);
if (fn2)
- fil_name_process(const_cast<char*>(fn2), fn2end - fn2, space_id,
+ fil_name_process(fn2, fn2end - fn2, space_id,
false, 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);
- const_cast<char&>(fn[rlen])= saved_end;
- if (fn2 && apply)
+ if (fn2 && file_checkpoint)
{
const size_t len= fn2end - fn2;
auto r= renamed_spaces.emplace(space_id, std::string{fn2, len});
@@ -2670,21 +2828,43 @@ same_page:
r.first->second= std::string{fn2, len};
}
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
@@ -2707,7 +2887,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();
@@ -2738,7 +2918,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 <= log_sys.get_lsn());
ut_ad(l->start_lsn);
ut_ad(recv_start_lsn <= l->start_lsn);
@@ -2880,19 +3060,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.stat.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
@@ -3072,7 +3256,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);
@@ -3206,30 +3390,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);
}
}
@@ -3243,11 +3423,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 ";
+ ? "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" ULINTPF " 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;
@@ -3336,7 +3516,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
@@ -3350,9 +3529,14 @@ 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;
@@ -3360,7 +3544,6 @@ next_free_block:
if (is_corrupt_fs() && !srv_force_recovery)
sql_print_information("InnoDB: Set innodb_force_recovery=1"
" to ignore corrupted pages.");
- mysql_mutex_unlock(&mutex);
return;
}
}
@@ -3371,10 +3554,9 @@ 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 &&
@@ -3384,392 +3566,227 @@ next_free_block:
{
/* 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;
+ 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 (srv_read_only_mode) {
- sql_print_warning(
- "InnoDB: innodb_read_only"
- " prevents crash recovery");
- return(true);
- }
+ 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;
- sql_print_information("InnoDB: Starting"
- " crash recovery from"
- " checkpoint LSN=" LSN_PF
- "," LSN_PF,
- checkpoint_lsn,
- recv_sys.scanned_lsn);
- }
+ if (source_offset + size > log_sys.file_size)
+ size= static_cast<size_t>(log_sys.file_size - source_offset);
- /* 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;
- );
-
- if (recv_sys.len + 4 * OS_FILE_LOG_BLOCK_SIZE
- >= recv_parsing_buf_size) {
- sql_print_error("InnoDB: Log parsing buffer"
- " overflow."
- " Recovery may have failed!");
-
- recv_sys.set_corrupt_log();
-
- if (!srv_force_recovery) {
- sql_print_information(
- "InnoDB: 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);
+ log_sys.set_recovered_lsn(recv_sys.lsn);
+ 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.
@@ -3985,7 +4002,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;
@@ -4058,19 +4077,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
@@ -4088,148 +4099,65 @@ recv_recovery_from_checkpoint_start(lsn_t flush_lsn)
recv_sys.recovery_on = true;
- mysql_mutex_lock(&log_sys.mutex);
-
- err = recv_find_max_checkpoint(&max_cp_field);
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
- 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 (log_sys.format == log_t::FORMAT_3_23) {
+ goto early_exit;
}
- if (recv_sys.is_corrupt_log() && !srv_force_recovery) {
- mysql_mutex_unlock(&log_sys.mutex);
- sql_print_warning("InnoDB: Log scan aborted at LSN " LSN_PF,
- contiguous_lsn);
- return(DB_ERROR);
- }
-
- 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);
- sql_print_error("InnoDB: Missing FILE_CHECKPOINT"
- " at " LSN_PF
- " between the checkpoint " LSN_PF
- " and the end " LSN_PF ".",
- end_lsn, checkpoint_lsn, 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) {
- sql_print_warning("InnoDB: Are you sure you are using"
- " the right ib_logfile0"
- " to start up the database?"
- " The checkpoint is " LSN_PF
- ", less than the"
- " log sequence number " LSN_PF
- " in the system tablespace.",
- checkpoint_lsn, 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) {
- sql_print_information(
- "InnoDB: The log sequence number " LSN_PF
- " in the system tablespace does not match"
- " the log checkpoint " LSN_PF
- " in ib_logfile0!", flush_lsn, checkpoint_lsn);
-
- if (srv_read_only_mode) {
- sql_print_error("InnoDB: 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;
@@ -4238,8 +4166,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
@@ -4249,34 +4176,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();
@@ -4285,69 +4208,65 @@ 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;
}
}
} 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)) {
+ 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!",
- log_sys.log.scanned_lsn, checkpoint_lsn,
+ 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);
- sql_print_error("InnoDB: Recovered only to lsn: " LSN_PF
- " checkpoint_lsn: " LSN_PF,
- recv_sys.recovered_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;
@@ -4368,7 +4287,7 @@ completed:
err = DB_CORRUPTION;
}
- mysql_mutex_unlock(&log_sys.mutex);
+ log_sys.latch.wr_unlock();
return err;
}
diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc
index b6d520d2e76..98f40bd01e4 100644
--- a/storage/innobase/mtr/mtr0mtr.cc
+++ b/storage/innobase/mtr/mtr0mtr.cc
@@ -24,18 +24,15 @@ Mini-transaction buffer
Created 11/26/1995 Heikki Tuuri
*******************************************************/
-#include "mtr0mtr.h"
-
+#include "mtr0log.h"
#include "buf0buf.h"
#include "buf0flu.h"
-#include "fsp0sysspace.h"
#include "page0types.h"
-#include "mtr0log.h"
-#include "log0recv.h"
-#include "my_cpu.h"
+#include "log0crypt.h"
#ifdef BTR_CUR_HASH_ADAPT
# include "btr0sea.h"
#endif
+#include "log.h"
/** Iterate over a memo block in reverse. */
template <typename Functor>
@@ -228,18 +225,19 @@ static void memo_slot_release(mtr_memo_slot_t *slot)
default:
buf_page_t *bpage= static_cast<buf_page_t*>(object);
bpage->unfix();
- switch (auto latch= slot->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);
}
- ut_ad("invalid type" == 0);
}
}
@@ -355,28 +353,266 @@ struct DebugCheck {
};
#endif
-/** Release page latches held by the mini-transaction. */
-struct ReleaseBlocks
+/** 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;
+ }
+ 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
+ stat.flush_list_bytes+= block->physical_size();
+
+ ut_ad(stat.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);
+}
+
+/** Update modified pages of the mini-transaction. */
+struct ReleaseModified
+{
+ buf_page_t *const prev;
const lsn_t start, end;
- ReleaseBlocks(lsn_t start, lsn_t end) : start(start), end(end) {}
+ mutable size_t modified= 0;
+
+ ReleaseModified(buf_page_t *prev, lsn_t start, lsn_t end) :
+ prev(prev), start(start), end(end)
+ {
+ ut_ad(start > 2);
+ ut_ad(end >= start);
+ }
/** @return true always */
bool operator()(mtr_memo_slot_t *slot) const
{
- if (!slot->object)
+ if (!slot->object || !(slot->type & MTR_MEMO_MODIFY))
return true;
- switch (slot->type) {
- case MTR_MEMO_PAGE_X_MODIFY:
- case MTR_MEMO_PAGE_SX_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) <= 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);
+ buf_pool.insert_into_flush_list(prev, b, start);
+ return true;
+ }
+};
+
+/** Release latches to already dirtied pages.
+This is a bit more than ReleaseAll,
+kind of a combination of ReleaseLatches and a subset of ReleaseModified. */
+struct ReleaseSimple
+{
+ const lsn_t end;
+ mutable size_t modified;
+ ReleaseSimple(lsn_t end) : end(end), modified(0) { ut_ad(end); }
+
+ /** @return true always */
+ bool operator()(mtr_memo_slot_t *slot) const
+ {
+ void *object= slot->object;
+ if (!object)
+ return true;
+ slot->object= nullptr;
+ switch (const auto type= slot->type) {
+ case MTR_MEMO_S_LOCK:
+ static_cast<index_lock*>(object)->s_unlock();
+ break;
+ case MTR_MEMO_SPACE_X_LOCK:
+ static_cast<fil_space_t*>(object)->set_committed_size();
+ static_cast<fil_space_t*>(object)->x_unlock();
+ break;
+ case MTR_MEMO_SPACE_S_LOCK:
+ static_cast<fil_space_t*>(object)->s_unlock();
+ break;
+ case MTR_MEMO_X_LOCK:
+ case MTR_MEMO_SX_LOCK:
+ static_cast<index_lock*>(object)->
+ u_or_x_unlock(type == MTR_MEMO_SX_LOCK);
break;
default:
- ut_ad(!(slot->type & MTR_MEMO_MODIFY));
- return true;
+ buf_page_t *bpage= static_cast<buf_page_t*>(object);
+ if (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() < end);
+ ut_ad(bpage->id() < end_page_id);
+ ut_d(const auto s= bpage->state());
+ 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) <= end);
+ mach_write_to_8(bpage->frame + FIL_PAGE_LSN, end);
+ if (UNIV_LIKELY_NULL(bpage->zip.data))
+ memcpy_aligned<8>(FIL_PAGE_LSN + bpage->zip.data,
+ FIL_PAGE_LSN + bpage->frame, 8);
+ modified++;
+ }
+ bpage->unfix();
+ switch (auto latch= type & ~MTR_MEMO_MODIFY) {
+ case MTR_MEMO_PAGE_S_FIX:
+ bpage->lock.s_unlock();
+ return true;
+ 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 */
+ case MTR_MEMO_BUF_FIX:
+ return true;
+ }
+ ut_ad("invalid type" == 0);
}
+ return true;
+ }
+};
- buf_block_t *block= static_cast<buf_block_t*>(slot->object);
- buf_flush_note_modification(block, start, end);
+ATTRIBUTE_COLD __attribute__((noinline))
+/** Insert a modified block into buf_pool.flush_list on IMPORT TABLESPACE. */
+static void insert_imported(buf_block_t *block)
+{
+ ut_d(const auto s= block->page.state());
+ ut_ad(s > buf_page_t::FREED);
+ ut_ad(s < buf_page_t::READ_FIX);
+ 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 latches to already pages when no log was written.
+This is like ReleaseSimple, but it cover pages of the temporary tablespace
+as well as pages modified during IMPORT TABLESPACE. */
+struct ReleaseUnlogged
+{
+ /** @return true always */
+ bool operator()(mtr_memo_slot_t *slot) const
+ {
+ void *object= slot->object;
+ if (!object)
+ return true;
+ slot->object= nullptr;
+ switch (const auto type= slot->type) {
+ case MTR_MEMO_S_LOCK:
+ static_cast<index_lock*>(object)->s_unlock();
+ break;
+ case MTR_MEMO_SPACE_X_LOCK:
+ static_cast<fil_space_t*>(object)->set_committed_size();
+ static_cast<fil_space_t*>(object)->x_unlock();
+ break;
+ case MTR_MEMO_SPACE_S_LOCK:
+ static_cast<fil_space_t*>(object)->s_unlock();
+ break;
+ case MTR_MEMO_X_LOCK:
+ case MTR_MEMO_SX_LOCK:
+ static_cast<index_lock*>(object)->
+ u_or_x_unlock(type == MTR_MEMO_SX_LOCK);
+ break;
+ default:
+ buf_block_t *block= static_cast<buf_block_t*>(object);
+ block->page.unfix();
+
+ if (type & MTR_MEMO_MODIFY)
+ {
+ ut_ad(type == MTR_MEMO_PAGE_X_MODIFY ||
+ type == MTR_MEMO_PAGE_SX_MODIFY);
+ if (UNIV_LIKELY(block->page.id() >= end_page_id))
+ block->page.set_temp_modified();
+ else
+ insert_imported(block);
+ }
+
+ switch (type) {
+ case MTR_MEMO_PAGE_S_FIX:
+ block->page.lock.s_unlock();
+ break;
+ case MTR_MEMO_BUF_FIX:
+ 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);
+ block->page.lock.u_or_x_unlock(type & MTR_MEMO_PAGE_SX_FIX);
+ }
+ }
return true;
}
};
@@ -401,6 +637,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;
@@ -420,6 +657,44 @@ 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);
+}
+
+/** 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();
+ m_memo.for_each_block_in_reverse(CIterate<ReleaseUnlogged>());
+}
+
/** Commit a mini-transaction. */
void mtr_t::commit()
{
@@ -429,73 +704,66 @@ 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();
+ mysql_mutex_lock(&buf_pool.flush_list_mutex);
+ {
+ CIterate<ReleaseModified> rm
+ {ReleaseModified{buf_pool.prepare_insert_into_flush_list(lsns.first),
+ lsns.first, m_commit_lsn}};
+ m_memo.for_each_block_in_reverse(rm);
+ ut_ad(rm.functor.modified);
+ buf_pool.flush_list_requests+= rm.functor.modified;
+ }
- if (m_made_dirty)
- mysql_mutex_lock(&log_sys.flush_order_mutex);
+ buf_pool.page_cleaner_wakeup();
+ mysql_mutex_unlock(&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);
+ if (m_latch_ex)
+ {
+ log_sys.latch.wr_unlock();
+ m_latch_ex= false;
+ }
+ else
+ log_sys.latch.rd_unlock();
+
+ m_memo.for_each_block_in_reverse(CIterate<ReleaseLatches>());
}
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);
- }
-
- 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);
+ 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();
+ Iterate<ReleaseSimple> rs{ReleaseSimple{m_commit_lsn}};
+ m_memo.for_each_block_in_reverse(rs);
+ buf_pool.add_flush_list_requests(rs.functor.modified);
}
- else
- ut_ad(!m_freed_space);
-
- m_memo.for_each_block_in_reverse
- (CIterate<const ReleaseBlocks>(ReleaseBlocks(lsns.first, m_commit_lsn)));
- if (m_made_dirty)
- mysql_mutex_unlock(&log_sys.flush_order_mutex);
-
- m_memo.for_each_block_in_reverse(CIterate<ReleaseLatches>());
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
m_memo.for_each_block_in_reverse(CIterate<ReleaseAll>());
+func_exit:
release_resources();
}
@@ -575,43 +843,38 @@ 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);
- if (m_freed_pages)
- {
- ut_ad(!m_freed_pages->empty());
- ut_ad(m_freed_space == &space);
- ut_ad(memo_contains(*m_freed_space));
- ut_ad(is_named_space(m_freed_space));
- 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);
- 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 */
- }
- else
- ut_ad(!m_freed_space);
+ ut_ad(!m_freed_pages || m_freed_space == &space);
+ process_freed_pages();
m_memo.for_each_block_in_reverse(CIterate<Shrink>{space});
-
- m_memo.for_each_block_in_reverse(CIterate<const ReleaseBlocks>
- (ReleaseBlocks(start_lsn, m_commit_lsn)));
- mysql_mutex_unlock(&log_sys.flush_order_mutex);
+ mysql_mutex_lock(&buf_pool.flush_list_mutex);
+ {
+ CIterate<ReleaseModified> rm
+ {ReleaseModified{buf_pool.prepare_insert_into_flush_list(start_lsn),
+ start_lsn, m_commit_lsn}};
+ m_memo.for_each_block_in_reverse(rm);
+ ut_ad(rm.functor.modified);
+ buf_pool.flush_list_requests+= rm.functor.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);
@@ -621,7 +884,6 @@ void mtr_t::commit_shrink(fil_space_t &space)
mysql_mutex_unlock(&fil_system.mutex);
m_memo.for_each_block_in_reverse(CIterate<ReleaseLatches>());
- srv_stats.log_write_requests.inc();
release_resources();
}
@@ -631,39 +893,58 @@ 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.
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(m_memo.size() == 0);
- 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.size() == 0);
+ 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
@@ -774,183 +1055,111 @@ mtr_t::release_page(const void* ptr, mtr_memo_type_t type)
ut_ad(0);
}
-static bool log_margin_warned;
-static time_t log_margin_warn_time;
static bool log_close_warned;
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 age, lsn_t capacity)
{
- 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);
+ if (!log_close_warned || difftime(t, log_close_warn_time) > 15)
{
- 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;
+ log_close_warned= true;
+ log_close_warn_time= t;
- ib::error() << "innodb_log_file_size is too small "
- "for mini-transaction size " << len;
- }
+ sql_print_error("InnoDB: The age of the last checkpoint is " LSN_PF
+ ", which exceeds the log capacity " LSN_PF ".",
+ age, capacity);
}
- else if (UNIV_LIKELY(lsn + margin <= log_sys.last_checkpoint_lsn +
- log_sys.log_capacity))
- return;
-
- log_sys.set_check_flush_or_checkpoint();
}
-
-/** 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_close_warned || difftime(t, log_close_warn_time) > 15)
- {
- log_close_warned= true;
- log_close_warn_time= t;
-
- ib::error() << "The age of the last checkpoint is " << checkpoint_age
- << ", which exceeds the log capacity "
- << log_sys.log_capacity << ".";
- }
- }
+ log_overwrite_warning(checkpoint_age, log_sys.log_capacity);
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))
@@ -1022,97 +1231,143 @@ struct WriteOPT_PAGE_CHECKSUM
}
};
-/** 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());
+ ut_ad(!recv_no_log_write);
+ ut_ad(is_logged());
+#ifndef SUX_LOCK_GENERIC
+ ut_ad(!m_latch_ex || log_sys.latch.is_write_locked());
+#endif
- ulint len = m_log.size();
- ut_ad(len > 0);
+ size_t len= m_log.size() + 5;
+ ut_ad(len > 5);
#ifdef UNIV_DEBUG
- if (m_log_mode == MTR_LOG_ALL) {
- m_memo.for_each_block(CIterate<WriteOPT_PAGE_CHECKSUM>(*this));
- len = m_log.size();
- }
+ if (m_log_mode == MTR_LOG_ALL)
+ {
+ m_memo.for_each_block(CIterate<WriteOPT_PAGE_CHECKSUM>(*this));
+ len= m_log.size() + 5;
+ }
#endif
- if (len > srv_log_buffer_size / 2) {
- log_buffer_extend(ulong((len + 1) * 2));
- }
-
- fil_space_t* space = m_user_space;
-
- if (space != NULL && is_predefined_tablespace(space->id)) {
- /* Omit FILE_MODIFY for predefined tablespaces. */
- space = NULL;
- }
-
- mysql_mutex_lock(&log_sys.mutex);
-
- if (fil_names_write_if_was_clean(space)) {
- len = m_log.size();
- } 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++;
+ if (log_sys.is_encrypted())
+ {
+ len+= 8;
+ encrypt();
+ }
+ else
+ {
+ 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);
- return finish_write(len);
+ 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
+
+ const size_t size{m_commit_lsn ? 5U + 8U : 5U};
+ std::pair<lsn_t, byte*> start;
+
+ 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; });
- lsn_t 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_log.is_small()) {
- const mtr_buf_t::block_t* front = m_log.front();
- ut_ad(len <= front->used());
+ byte tail[5 + 8];
+ tail[0]= log_sys.get_sequence_bit(start.first + len - size);
- m_commit_lsn = log_reserve_and_write_fast(front->begin(), len,
- &start_lsn);
+ 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);
- 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;);
+ ::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)};
}
/** Find out whether a block was not X-latched by the mini-transaction */
@@ -1460,7 +1715,8 @@ void mtr_t::modify(const buf_block_t &block)
}
Iterate<FindModified> iteration((FindModified(block)));
- if (UNIV_UNLIKELY(m_memo.for_each_block(iteration)))
+ m_memo.for_each_block(iteration);
+ if (UNIV_UNLIKELY(!iteration.functor.found))
{
ut_ad("modifying an unlatched page" == 0);
return;
diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc
index 39994fdb42f..01af15befd3 100644
--- a/storage/innobase/os/os0file.cc
+++ b/storage/innobase/os/os0file.cc
@@ -33,13 +33,14 @@ 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"
-#ifdef UNIV_LINUX
+#ifdef __linux__
# include <sys/types.h>
# include <sys/stat.h>
+# include <sys/sysmacros.h>
#endif
#include "srv0mon.h"
@@ -63,13 +64,6 @@ Created 10/21/1995 Heikki Tuuri
# include <linux/falloc.h>
#endif /* HAVE_FALLOC_PUNCH_HOLE_AND_KEEP_SIZE */
-#if defined(UNIV_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 +162,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
@@ -772,18 +765,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"
@@ -1064,7 +1054,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;
+ }
}
#ifdef USE_FILE_LOCK
@@ -1237,22 +1235,86 @@ 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(UNIV_SOLARIS) && 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
+
#ifdef USE_FILE_LOCK
if (!read_only
- && *success
- && create_mode != OS_FILE_OPEN_RAW
- && os_file_lock(file, name)) {
-
+ && create_mode != OS_FILE_OPEN_RAW && os_file_lock(file, name)) {
if (create_mode == OS_FILE_OPEN_RETRY) {
-
ib::info()
<< "Retrying to lock the first data file";
@@ -1770,29 +1832,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."
@@ -1800,29 +1859,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;
}
}
@@ -2006,32 +2059,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.
@@ -2121,83 +2162,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) {
@@ -2212,19 +2199,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;
}
@@ -2381,16 +2371,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);
}
@@ -2520,18 +2509,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.
@@ -3041,9 +3024,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));
@@ -3090,15 +3078,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(UNIV_SOLARIS) && defined(DIRECTIO_ON)
if (directio(fd, DIRECTIO_ON) == -1) {
@@ -3771,8 +3750,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());
@@ -3824,11 +3804,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()
@@ -3851,10 +3826,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),
@@ -4233,5 +4206,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 e608abaa361..f295f7e764b 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;
}
@@ -94,7 +95,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;
}
@@ -398,7 +399,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:
@@ -452,7 +453,7 @@ up_slot_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_rec_match:
diff --git a/storage/innobase/page/page0page.cc b/storage/innobase/page/page0page.cc
index 22d3983072b..de92c539444 100644
--- a/storage/innobase/page/page0page.cc
+++ b/storage/innobase/page/page0page.cc
@@ -2410,7 +2410,7 @@ page_find_rec_with_heap_no(
@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(
+page_find_rec_last_not_deleted(
const page_t* page)
{
const rec_t* rec = page_get_infimum_rec(page);
diff --git a/storage/innobase/page/page0zip.cc b/storage/innobase/page/page0zip.cc
index 7b603bb876b..8be0b17b5a8 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"
@@ -4602,11 +4601,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..a77ddafd568 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);
+ return !ret || UNIV_LIKELY(!index->fields[cur_field].descending)
+ ? ret : -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));
-}
-
-/**************************************************************//**
-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,
@@ -868,16 +831,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 +879,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 +895,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 86e9662439a..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*>(
diff --git a/storage/innobase/row/row0import.cc b/storage/innobase/row/row0import.cc
index 8824be11917..f3ed3998aa7 100644
--- a/storage/innobase/row/row0import.cc
+++ b/storage/innobase/row/row0import.cc
@@ -4020,7 +4020,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));
}
}
diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc
index c491030070c..e6e4a056e91 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) {
@@ -2118,7 +2118,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,
@@ -2155,18 +2155,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;
@@ -2174,11 +2176,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. */
@@ -2187,7 +2189,7 @@ row_ins_duplicate_online(
ulint trx_id_len;
- if (fields == n_uniq + 2
+ if (fields == n_uniq
&& memcmp(rec_get_nth_field(rec, offsets, n_uniq, &trx_id_len),
reset_trx_id, DATA_TRX_ID_LEN + DATA_ROLL_PTR_LEN)) {
ut_ad(trx_id_len == DATA_TRX_ID_LEN);
@@ -2223,7 +2225,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);
}
@@ -2235,7 +2238,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);
diff --git a/storage/innobase/row/row0log.cc b/storage/innobase/row/row0log.cc
index f2e2511a116..3e391f4bce4 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,
@@ -2604,7 +2604,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)) {
@@ -2957,7 +2957,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)));
@@ -3523,7 +3523,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 bfc3e2fb382..b4d11053623 100644
--- a/storage/innobase/row/row0merge.cc
+++ b/storage/innobase/row/row0merge.cc
@@ -934,6 +934,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 */
@@ -945,6 +946,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);
@@ -953,7 +955,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) {
@@ -978,7 +980,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);
}
@@ -998,7 +1000,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
@@ -1006,7 +1008,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. */
@@ -1014,6 +1016,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
@@ -1041,12 +1044,9 @@ 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));
-
- 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);
+ 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);
}
/** Write the blob field data to temporary file and fill the offset,
@@ -1264,7 +1264,7 @@ row_merge_read(
IORequestRead, fd, buf, ofs, srv_sort_buf_size, 0);
/* If encryption is enabled decrypt buffer */
- if (success && log_tmp_is_encrypted()) {
+ if (success && srv_encrypt_log) {
if (!log_tmp_block_decrypt(buf, srv_sort_buf_size,
crypt_buf, ofs)) {
return (FALSE);
@@ -1309,7 +1309,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),
@@ -1728,11 +1728,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.
@@ -4568,7 +4567,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) {
@@ -4698,7 +4698,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));
diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc
index 84f2b54f517..3540882d49e 100644
--- a/storage/innobase/row/row0mysql.cc
+++ b/storage/innobase/row/row0mysql.cc
@@ -3045,7 +3045,8 @@ func_exit:
if (prev_entry != NULL) {
matched_fields = 0;
- cmp = cmp_dtuple_rec_with_match(prev_entry, rec, offsets,
+ cmp = cmp_dtuple_rec_with_match(prev_entry,
+ rec, index, offsets,
&matched_fields);
contains_null = FALSE;
diff --git a/storage/innobase/row/row0purge.cc b/storage/innobase/row/row0purge.cc
index 8a81a45ca12..5b330e4e6a7 100644
--- a/storage/innobase/row/row0purge.cc
+++ b/storage/innobase/row/row0purge.cc
@@ -1220,7 +1220,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 ebd4ddce130..d11b29d995f 100644
--- a/storage/innobase/row/row0sel.cc
+++ b/storage/innobase/row/row0sel.cc
@@ -149,7 +149,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
@@ -396,9 +396,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;
}
}
@@ -3291,7 +3290,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
@@ -5041,7 +5040,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)) {
@@ -5076,7 +5075,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)) {
@@ -5197,7 +5197,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;
}
@@ -6122,26 +6122,38 @@ row_search_get_max_rec(
{
btr_pcur_t pcur;
const rec_t* rec;
- /* Open at the high/right end (false), and init cursor */
- if (btr_pcur_open_at_index_side(false, index, BTR_SEARCH_LEAF, &pcur,
+ const bool desc = index->fields[0].descending;
+
+ if (btr_pcur_open_at_index_side(desc, index, BTR_SEARCH_LEAF, &pcur,
true, 0, 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 04cf9640f05..acba98ceb05 100644
--- a/storage/innobase/row/row0vers.cc
+++ b/storage/innobase/row/row0vers.cc
@@ -325,7 +325,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 */
@@ -343,7 +343,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;
}
@@ -730,7 +730,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);
}
@@ -833,6 +833,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 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
@@ -933,7 +948,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 {
@@ -988,7 +1003,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);
@@ -1086,7 +1101,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/srv/srv0mon.cc b/storage/innobase/srv/srv0mon.cc
index 8f6c40c2412..b2069b11f0f 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(
/*=============================*/
@@ -1426,7 +1389,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 */
@@ -1543,43 +1506,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 */
@@ -1737,26 +1679,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 dcef270caf3..3612da6a438 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"
@@ -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 */
@@ -163,8 +160,6 @@ uint srv_flush_log_at_timeout;
ulong srv_page_size;
/** log2 of innodb_page_size; @see innodb_init_params() */
uint32_t srv_page_size_shift;
-/** innodb_log_write_ahead_size */
-ulong srv_log_write_ahead_size;
/** 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 */
@@ -716,8 +710,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;
@@ -1008,12 +1000,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;
@@ -1035,9 +1021,6 @@ srv_export_innodb_status(void)
export_vars.innodb_buffer_pool_read_requests
= buf_pool.stat.n_page_gets;
- export_vars.innodb_buffer_pool_write_requests =
- srv_stats.buf_pool_write_requests;
-
export_vars.innodb_buffer_pool_reads = srv_stats.buf_pool_reads;
export_vars.innodb_buffer_pool_read_ahead_rnd =
@@ -1087,22 +1070,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();
- 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();
@@ -1190,13 +1157,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
@@ -1274,7 +1243,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);
@@ -1839,10 +1808,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);
}
diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc
index 3872b1fab26..406aa316e11 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. */
@@ -121,14 +121,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;
@@ -170,160 +171,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) {
@@ -332,7 +241,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();
@@ -340,42 +249,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();
+ std::string old_name{get_log_file_path("ib_logfile101")};
+ std::string new_name{get_log_file_path()};
- ib::info() << "Renaming log file " << logfile0 << " to " << 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_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));
-
- 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)
{
@@ -413,7 +309,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...";
@@ -443,8 +340,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;
@@ -452,11 +349,11 @@ 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;
}
@@ -471,8 +368,8 @@ static uint32_t 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 static_cast<uint32_t>(space_ids.size());
}
@@ -559,7 +456,7 @@ 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, NULL);
+ FIL_TYPE_TABLESPACE, NULL);
ut_a(fil_validate());
ut_a(space);
@@ -592,7 +489,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 */
@@ -600,8 +497,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,
@@ -611,7 +508,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"
@@ -625,14 +522,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."
@@ -645,7 +542,7 @@ srv_check_undo_redo_logs_exists()
}
static dberr_t srv_all_undo_tablespaces_open(bool create_new_db,
- uint32_t n_undo)
+ 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
@@ -662,7 +559,7 @@ static dberr_t srv_all_undo_tablespaces_open(bool create_new_db,
if (!space_id)
{
if (!create_new_db)
- break;
+ break;
ib::error() << "Unable to open create tablespace '" << name << "'.";
return DB_ERROR;
}
@@ -723,8 +620,8 @@ dberr_t 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;
}
}
}
@@ -736,7 +633,7 @@ dberr_t srv_undo_tablespaces_init(bool create_new_db)
srv_undo_tablespaces_active= srv_undo_tablespaces;
uint32_t n_undo= (create_new_db || srv_operation == SRV_OPERATION_BACKUP ||
- srv_operation == SRV_OPERATION_RESTORE_DELTA)
+ 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))
@@ -779,8 +676,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);
@@ -795,7 +690,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)) {
@@ -872,7 +767,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 << "]"
@@ -887,9 +782,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");
@@ -900,33 +794,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: ";
@@ -941,19 +835,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());
@@ -961,88 +852,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
@@ -1201,8 +1021,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";
@@ -1219,8 +1039,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 */
@@ -1250,7 +1070,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:
@@ -1272,87 +1092,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)
@@ -1417,16 +1176,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
@@ -1437,9 +1188,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();
@@ -1484,7 +1233,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()) {
@@ -1587,29 +1338,9 @@ file_checked:
recv_sys.debug_free();
- if (srv_operation == SRV_OPERATION_RESTORE
- || srv_operation == SRV_OPERATION_RESTORE_EXPORT) {
- /* 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);
}
@@ -1621,19 +1352,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)););
@@ -1643,37 +1372,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, flushed_lsn, logfile0);
+ err = create_log_file(false, lsn);
- 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) {
@@ -1861,10 +1570,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) {
diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc
index b1837167a1e..af46150e64a 100644
--- a/storage/innobase/trx/trx0trx.cc
+++ b/storage/innobase/trx/trx0trx.cc
@@ -1147,29 +1147,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= innodb_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 = innodb_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);
}
/**********************************************************************//**
diff --git a/storage/innobase/ut/ut0ut.cc b/storage/innobase/ut/ut0ut.cc
index 545c54fde66..7b69042c0a5 100644
--- a/storage/innobase/ut/ut0ut.cc
+++ b/storage/innobase/ut/ut0ut.cc
@@ -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/ha_maria.cc b/storage/maria/ha_maria.cc
index 1e6680d30de..abe7834f36d 100644
--- a/storage/maria/ha_maria.cc
+++ b/storage/maria/ha_maria.cc
@@ -3349,6 +3349,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
@@ -3362,13 +3363,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_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/mroonga/ha_mroonga.cpp b/storage/mroonga/ha_mroonga.cpp
index 83c2d15a36c..8e1c6f7f336 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;
}
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/ha_myisam.cc b/storage/myisam/ha_myisam.cc
index 2a49971f6db..f1174c97751 100644
--- a/storage/myisam/ha_myisam.cc
+++ b/storage/myisam/ha_myisam.cc
@@ -554,7 +554,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));
@@ -2304,6 +2305,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
@@ -2317,13 +2319,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/rocksdb/ha_rocksdb.cc b/storage/rocksdb/ha_rocksdb.cc
index 82a85a0be7d..09635272747 100644
--- a/storage/rocksdb/ha_rocksdb.cc
+++ b/storage/rocksdb/ha_rocksdb.cc
@@ -7580,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,
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 1b3b43c0304..45c87cc7313 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/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/rdb_datadic.cc b/storage/rocksdb/rdb_datadic.cc
index 164f6ba8205..929a70635ee 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;
}
/*
diff --git a/storage/rocksdb/rdb_datadic.h b/storage/rocksdb/rdb_datadic.h
index fb368a17fba..899c6f70071 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/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 7b9173837c9..f0ac3af7d6d 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;
@@ -1492,13 +1337,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
@@ -1506,10 +1344,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;
@@ -1704,12 +1538,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);
@@ -1818,10 +1646,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);
@@ -1909,18 +1733,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);
@@ -1981,10 +1793,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)
{
@@ -1992,15 +1800,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))
@@ -2247,19 +2046,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))))
{
@@ -2333,14 +2120,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))
)
@@ -2353,10 +2133,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);
@@ -2492,10 +2268,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)
{
@@ -2503,15 +2275,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))
@@ -2825,9 +2588,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)
) {
@@ -2977,10 +2737,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)
{
@@ -2988,15 +2744,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))
@@ -3228,9 +2975,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)
) {
@@ -3380,10 +3124,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)
{
@@ -3391,15 +3131,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))
@@ -3703,10 +3434,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);
@@ -3843,10 +3570,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)
{
@@ -3854,15 +3577,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))
@@ -4102,26 +3816,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;
}
@@ -4129,10 +3828,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)
@@ -4140,19 +3835,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);
}
@@ -4384,10 +4066,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;
@@ -4549,10 +4227,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)
{
@@ -4560,15 +4234,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))
@@ -4919,9 +4584,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
@@ -5374,10 +5036,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)
{
@@ -5385,15 +5043,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))
@@ -5714,10 +5363,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;
@@ -6051,10 +5696,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)
{
@@ -6062,15 +5703,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))
@@ -6392,10 +6024,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;
@@ -6432,9 +6060,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
@@ -6871,10 +6496,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)
{
@@ -6882,15 +6503,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))
@@ -7205,12 +6817,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;
@@ -7325,13 +6931,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;
}
}
@@ -7403,10 +7002,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);
@@ -9447,11 +9042,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 |
@@ -9690,6 +9280,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;
@@ -9709,7 +9302,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)
@@ -9984,32 +9579,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
@@ -10211,9 +9783,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;
@@ -10255,11 +9824,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;
@@ -10311,41 +9876,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);
@@ -10843,9 +10381,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;
@@ -10880,11 +10415,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;
@@ -10933,21 +10464,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);
@@ -12283,9 +11802,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 &&
@@ -12312,144 +11828,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"));
@@ -13268,22 +12646,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);
@@ -13297,16 +12660,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;
}
@@ -13316,16 +12670,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;
}
@@ -13373,96 +12718,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);
}
@@ -13500,31 +12755,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 (
@@ -13550,18 +12782,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)
@@ -13623,15 +12844,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 (
@@ -13737,9 +12950,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;
@@ -13955,10 +13165,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;
@@ -13969,18 +13175,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;
@@ -13997,10 +13193,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;
@@ -14019,20 +13211,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",
@@ -14093,21 +13271,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;
}
@@ -14138,17 +13301,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;
}
@@ -14178,110 +13330,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
) {
@@ -14404,30 +13452,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;
@@ -14468,28 +13492,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
@@ -14920,32 +13922,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
) {
@@ -15221,31 +14197,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,
@@ -15311,29 +14262,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
) {
@@ -15377,10 +14305,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];
@@ -15392,23 +14316,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);
}
@@ -16119,22 +15026,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;
@@ -16252,10 +15143,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,
@@ -16374,9 +15261,6 @@ int ha_spider::lock_tables()
}
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- }
-#endif
DBUG_RETURN(0);
}
@@ -16397,10 +15281,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,
@@ -16491,91 +15371,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)
{
@@ -16628,14 +15423,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 6894716e469..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() { }
- 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 93d78cc7dc0..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() { }
- private:
- noncopyable(const noncopyable&);
- noncopyable& operator =(const noncopyable&);
-};
-
-};
-
-#endif
-
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/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/include/init_spider.inc b/storage/spider/mysql-test/spider/include/init_spider.inc
index b3fb4df239b..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',
diff --git a/storage/spider/spd_conn.cc b/storage/spider/spd_conn.cc
index 2f1711ad59e..9b040384cd6 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)
{
@@ -752,113 +602,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)))
@@ -986,33 +736,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
#ifndef DBUG_OFF
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];
-#ifndef DBUG_OFF
- spider_print_keys(conn_key, share->hs_read_conn_keys_lengths[link_idx]);
-#endif
- } else {
- conn_key = share->hs_write_conn_keys[link_idx];
-#ifndef DBUG_OFF
- 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,
@@ -1023,79 +751,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(
@@ -1147,94 +821,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 */
@@ -1244,19 +830,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;
}
@@ -1264,10 +838,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;
@@ -1312,67 +882,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;
}
@@ -1389,19 +901,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);
@@ -2409,14 +1914,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
}
@@ -2767,19 +2264,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)
@@ -3238,21 +2725,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))
{
@@ -3602,27 +3080,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) +
@@ -3630,7 +3093,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);
@@ -3651,12 +3113,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())))
@@ -3699,10 +3155,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);
@@ -3970,27 +3422,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) +
@@ -3998,7 +3435,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);
@@ -4019,12 +3455,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())))
@@ -4071,10 +3501,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);
@@ -4783,51 +4209,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)
@@ -4885,173 +4274,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 3692bb6f6d6..e412c2f3da4 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);
@@ -1948,14 +1833,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)
@@ -2018,17 +1895,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)
@@ -2036,11 +1902,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))
@@ -2065,7 +1931,10 @@ 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 (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,
share->access_charset))
@@ -2098,17 +1967,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;
@@ -2117,11 +1975,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))
@@ -2146,7 +2004,10 @@ 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 (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,
share->access_charset))
@@ -2179,17 +2040,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
@@ -2207,7 +2057,10 @@ 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 (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,
share->access_charset))
@@ -2224,8 +2077,10 @@ 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 (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,
share->access_charset))
@@ -2238,8 +2093,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,
@@ -2250,8 +2104,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,
share->access_charset))
@@ -2260,18 +2113,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))
@@ -2370,7 +2211,10 @@ 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 (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,
share->access_charset))
@@ -2387,8 +2231,10 @@ 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 (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,
share->access_charset))
@@ -2401,8 +2247,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,
@@ -2413,8 +2258,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,
share->access_charset))
@@ -2423,18 +2267,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;
}
}
@@ -2462,10 +2294,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)
@@ -2543,11 +2371,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))
@@ -2571,7 +2399,10 @@ 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 (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,
share->access_charset))
@@ -2613,7 +2444,10 @@ 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 (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,
share->access_charset))
@@ -2629,8 +2463,10 @@ 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 (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,
share->access_charset))
@@ -2643,8 +2479,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,
@@ -2655,8 +2490,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,
share->access_charset))
@@ -2692,9 +2526,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)))
@@ -2738,15 +2569,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);
}
@@ -3139,10 +2961,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;
@@ -3225,21 +3043,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;
@@ -3267,68 +3071,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);
}
@@ -3581,10 +3323,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)
@@ -3613,24 +3351,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;
}
@@ -3739,28 +3459,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
@@ -3949,10 +3647,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));
@@ -4436,66 +4130,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);
}
@@ -4509,9 +4143,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));
@@ -5041,9 +4672,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",
@@ -6560,9 +6188,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,
@@ -6575,67 +6200,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);
}
@@ -6646,19 +6219,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)))
{
@@ -6666,16 +6232,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))
@@ -6705,10 +6261,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];
@@ -6735,16 +6287,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);
@@ -6840,43 +6382,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)
@@ -6977,16 +6482,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);
@@ -7003,44 +6499,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)
@@ -7111,16 +6569,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;
@@ -7662,27 +7111,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
@@ -7703,17 +7133,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)
{
@@ -7732,19 +7151,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;
@@ -7774,22 +7182,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,
@@ -7801,20 +7193,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))
@@ -7922,10 +7303,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();
@@ -7934,48 +7311,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;
@@ -7987,11 +7322,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
@@ -8246,18 +7576,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);
@@ -8270,10 +7590,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();
@@ -8282,48 +7598,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;
@@ -8497,22 +7771,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,
@@ -8524,20 +7782,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))
@@ -8643,50 +7890,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
@@ -8699,15 +7908,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
@@ -10791,36 +9991,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
}
/*
@@ -10857,10 +10037,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);
@@ -10878,9 +10054,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);
}
@@ -10990,26 +10163,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,
@@ -11278,9 +10431,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);
@@ -11326,10 +10476,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 ||
@@ -11353,9 +10499,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);
}
@@ -12423,15 +11566,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");
@@ -12446,182 +11581,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)))
@@ -12655,74 +11640,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
@@ -12747,10 +11668,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)))
@@ -12777,14 +11694,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--;
@@ -12808,23 +11717,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 0dfe9b16fad..f0821454f48 100644
--- a/storage/spider/spd_db_conn.h
+++ b/storage/spider/spd_db_conn.h
@@ -1220,12 +1220,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 886ffed3b4b..bf5312be4c8 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
@@ -114,26 +114,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)
@@ -225,16 +205,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)
@@ -740,71 +713,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;
@@ -1221,54 +1129,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,
@@ -1402,11 +1262,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;
@@ -1645,23 +1500,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;
@@ -2025,19 +1863,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 0f37707c6ed..e4ca28548d6 100644
--- a/storage/spider/spd_db_mysql.cc
+++ b/storage/spider/spd_db_mysql.cc
@@ -3729,97 +3729,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,
@@ -9031,9 +8940,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);
}
@@ -9956,67 +9862,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;
@@ -10098,13 +9943,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 &&
@@ -10120,61 +9958,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);
}
@@ -14169,54 +13953,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 af7b860f3f5..3a6a4d8cc0a 100644
--- a/storage/spider/spd_db_mysql.h
+++ b/storage/spider/spd_db_mysql.h
@@ -579,54 +579,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,
@@ -814,9 +766,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:
@@ -923,14 +872,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
@@ -1461,23 +1402,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 6db37de78ab..41f7bf6d6a4 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 00389a71b09..ecfcefa36b0 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;
@@ -805,12 +776,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;
@@ -846,30 +811,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;
@@ -885,10 +826,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;
@@ -896,9 +833,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;
@@ -1115,9 +1049,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
@@ -1136,10 +1067,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;
@@ -1163,12 +1090,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;
@@ -1184,13 +1105,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;
@@ -1221,16 +1135,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;
@@ -1254,12 +1159,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;
@@ -1283,12 +1182,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;
@@ -1304,13 +1197,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;
@@ -1328,11 +1214,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;
@@ -1391,9 +1272,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 0dcbcd50230..1cf987134f6 100644
--- a/storage/spider/spd_init_query.h
+++ b/storage/spider/spd_init_query.h
@@ -543,7 +543,7 @@ static LEX_STRING spider_init_queries[] = {
" @server_major_version > 10 or"
" ("
" @server_major_version = 10 and"
- " @server_minor_version >= 8"
+ " @server_minor_version >= 999"
" )"
" )"
" then"
@@ -803,7 +803,7 @@ static LEX_STRING spider_init_queries[] = {
" @server_major_version > 10 or"
" ("
" @server_major_version = 10 and"
- " @server_minor_version >= 8"
+ " @server_minor_version >= 999"
" )"
" )"
" then"
diff --git a/storage/spider/spd_param.cc b/storage/spider/spd_param.cc
index 80db478f2d3..e160bcc24b2 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}
};
@@ -641,33 +621,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
@@ -1915,31 +1868,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
@@ -2539,154 +2467,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
@@ -3514,9 +3294,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),
@@ -3577,9 +3354,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),
@@ -3602,14 +3376,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 8a0c264bb12..7af89342371 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,9 +1776,16 @@ 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) \
+ 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( \
@@ -2071,6 +2020,31 @@ int st_spider_param_string_parse::print_param_error()
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,
@@ -2087,6 +2061,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;
@@ -2109,7 +2084,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
@@ -2181,9 +2163,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
@@ -2366,17 +2345,6 @@ 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_INT_WITH_MAX("idl", internal_delayed, 0, 1);
@@ -2443,7 +2411,9 @@ 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
@@ -2453,16 +2423,12 @@ int spider_parse_connect_info(
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();
@@ -2474,12 +2440,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);
@@ -2496,7 +2466,9 @@ 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);
@@ -2545,9 +2517,6 @@ int spider_parse_connect_info(
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);
@@ -2558,20 +2527,10 @@ 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;
@@ -2581,10 +2540,6 @@ int spider_parse_connect_info(
#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);
@@ -2606,10 +2561,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",
@@ -2635,10 +2586,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
@@ -2687,9 +2634,6 @@ int spider_parse_connect_info(
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_LONG_LIST_WITH_MAX("bka_table_name_type",
bka_table_name_types, 0, 1);
SPIDER_PARAM_INT_WITH_MAX(
@@ -2758,6 +2702,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)
@@ -2826,22 +2774,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)
@@ -3062,47 +2994,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,
@@ -4050,42 +3941,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)
@@ -4232,10 +4087,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;
@@ -4410,23 +4261,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)
{
@@ -4435,26 +4275,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,
@@ -4474,35 +4299,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)
@@ -4535,24 +4337,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,
@@ -4564,26 +4348,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);
@@ -4593,15 +4358,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);
@@ -4743,82 +4499,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++;
@@ -4875,9 +4563,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);
@@ -5070,12 +4755,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;
@@ -5400,16 +5079,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,
@@ -5418,26 +5087,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,
@@ -5449,14 +5098,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,
@@ -5470,12 +5111,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++)
@@ -5483,18 +5118,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();
@@ -5942,16 +5565,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,
@@ -5960,26 +5573,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,
@@ -5991,14 +5584,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,
@@ -6009,12 +5594,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++)
@@ -6022,18 +5601,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();
@@ -7220,32 +6787,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)))
{
@@ -7275,18 +6816,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 *
@@ -7334,10 +6863,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
@@ -7432,6 +6957,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))
{
@@ -7561,24 +7087,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
@@ -7658,26 +7166,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;
@@ -7791,12 +7279,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;
@@ -7872,20 +7354,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 *
@@ -7924,12 +7392,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);
@@ -8006,6 +7468,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,
@@ -8555,113 +8023,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,
@@ -8693,10 +8054,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];
@@ -8707,13 +8064,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;
@@ -8750,10 +8100,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;
@@ -8790,15 +8136,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;
@@ -8821,9 +8158,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;
}
@@ -9006,26 +8340,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
);
@@ -10114,10 +9439,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");
@@ -10138,21 +9459,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),
- &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),
- &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),
@@ -10164,7 +9470,6 @@ int spider_create_spider_object_for_share(
&wide_handler, (uint) sizeof(SPIDER_WIDE_HANDLER),
NullS))
)
-#endif
{
error_num = HA_ERR_OUT_OF_MEM;
goto error_need_mons_alloc;
@@ -10180,10 +9485,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 dc351e73c61..39d1e0fdbe7 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 c5095e7ff55..e3216739065 100644
--- a/storage/spider/spd_trx.cc
+++ b/storage/spider/spd_trx.cc
@@ -130,91 +130,6 @@ int spider_free_trx_conn(
roop_count++;
}
}
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- roop_count = 0;
- if (
- trx_free ||
- spider_param_hs_r_conn_recycle_mode(trx->thd) != 2
- ) {
- while ((conn = (SPIDER_CONN*) my_hash_element(&trx->trx_hs_r_conn_hash,
- roop_count)))
- {
- if (conn->table_lock)
- {
- DBUG_ASSERT(!trx_free);
- roop_count++;
- } else
- spider_free_conn_from_trx(trx, conn, FALSE, trx_free, &roop_count);
- }
- trx->trx_hs_r_conn_adjustment++;
- } else {
- while ((conn = (SPIDER_CONN*) my_hash_element(&trx->trx_hs_r_conn_hash,
- roop_count)))
- {
- if (conn->table_lock)
- {
- DBUG_ASSERT(!trx_free);
- } else
- conn->error_mode = 1;
- roop_count++;
- }
- }
- roop_count = 0;
- if (
- trx_free ||
- spider_param_hs_w_conn_recycle_mode(trx->thd) != 2
- ) {
- while ((conn = (SPIDER_CONN*) my_hash_element(&trx->trx_hs_w_conn_hash,
- roop_count)))
- {
- if (conn->table_lock)
- {
- DBUG_ASSERT(!trx_free);
- roop_count++;
- } else
- spider_free_conn_from_trx(trx, conn, FALSE, trx_free, &roop_count);
- }
- trx->trx_hs_w_conn_adjustment++;
- } else {
- while ((conn = (SPIDER_CONN*) my_hash_element(&trx->trx_hs_w_conn_hash,
- roop_count)))
- {
- if (conn->table_lock)
- {
- DBUG_ASSERT(!trx_free);
- } else
- conn->error_mode = 1;
- roop_count++;
- }
- }
-#endif
-#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if (trx_free)
- {
- while ((conn = (SPIDER_CONN*) my_hash_element(
- &trx->trx_direct_hs_r_conn_hash, 0)))
- {
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- my_hash_delete_with_hash_value(&trx->trx_direct_hs_r_conn_hash,
- conn->conn_key_hash_value, (uchar*) conn);
-#else
- my_hash_delete(&trx->trx_direct_hs_r_conn_hash, (uchar*) conn);
-#endif
- spider_free_conn(conn);
- }
- while ((conn = (SPIDER_CONN*) my_hash_element(
- &trx->trx_direct_hs_w_conn_hash, 0)))
- {
-#ifdef HASH_UPDATE_WITH_HASH_VALUE
- my_hash_delete_with_hash_value(&trx->trx_direct_hs_w_conn_hash,
- conn->conn_key_hash_value, (uchar*) conn);
-#else
- my_hash_delete(&trx->trx_direct_hs_w_conn_hash, (uchar*) conn);
-#endif
- spider_free_conn(conn);
- }
- }
-#endif
DBUG_RETURN(0);
}
@@ -1241,30 +1156,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 *
@@ -1351,58 +1242,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)
@@ -1442,10 +1281,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)
{
@@ -1599,38 +1434,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,
@@ -3808,28 +3611,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);
@@ -3845,14 +3626,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
@@ -3862,13 +3635,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
@@ -3913,12 +3679,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 (
@@ -3935,18 +3695,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 (
@@ -3986,51 +3736,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)
{
@@ -4069,21 +3774,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)
{
@@ -4123,53 +3815,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)
{
@@ -4425,20 +4070,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/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 de59cfea264..094c02618d0 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/json_lib.c b/strings/json_lib.c
index 65058587a93..b5b6dd6516d 100644
--- a/strings/json_lib.c
+++ b/strings/json_lib.c
@@ -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/support-files/CMakeLists.txt b/support-files/CMakeLists.txt
index e0ea78e282e..9623440f110 100644
--- a/support-files/CMakeLists.txt
+++ b/support-files/CMakeLists.txt
@@ -51,8 +51,8 @@ ENDIF()
IF(UNIX AND NOT WITHOUT_SERVER)
SET(prefix ${CMAKE_INSTALL_PREFIX})
- FOREACH(script mysqld_multi.server mysql-log-rotate binary-configure wsrep_notify)
- CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${script}.sh
+ FOREACH(script mysqld_multi.server mysql-log-rotate binary-configure wsrep_notify mini-benchmark)
+ 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..d5dd194bc3f
--- /dev/null
+++ b/support-files/mini-benchmark.sh
@@ -0,0 +1,229 @@
+#!/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)
+
+ 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 --"
+
+elif [ -e /usr/bin/perf ]
+then
+ # If flamegraphs were not requested, log normal perf counters if possible
+ echo "Using 'perf' to log basic performance counters for benchmark"
+fi
+ PERF="perf stat -p $MARIADB_SERVER_PID --"
+
+# 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 "Set CPU affinity 0 for MariaDB Server process ID $MARIADB_SERVER_PID"
+taskset -cp 0 "$MARIADB_SERVER_PID"
+
+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 9b384c9c6ee..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.7 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.7]
+[mariadb-10.8]
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
}