From c7a09069bf361da5ca9ce1a9fbe7823f21305bf3 Mon Sep 17 00:00:00 2001 From: "shimengchu.smc" Date: Tue, 1 Jul 2025 14:16:08 +0800 Subject: [PATCH 01/21] Support vector index --- README.md | 4 +- config.h.cmake | 1 + configure.cmake | 1 + include/m_ctype.h | 10 + include/my_base.h | 4 +- include/my_bit.h | 39 + include/my_byteorder.h | 5 + include/my_sys.h | 2 + include/vidx/SIMD.h | 55 + include/vidx/bloom_filters.h | 417 +++++ include/vidx/hash.h | 121 ++ include/vidx/my_atomic_wrapper.h | 100 ++ include/vidx/my_cmp.h | 38 + include/vidx/sql_hset.h | 142 ++ include/vidx/sql_queue.h | 87 + include/vidx/vidx_common.h | 71 + include/vidx/vidx_field.h | 77 + include/vidx/vidx_func.h | 132 ++ include/vidx/vidx_hnsw.h | 56 + include/vidx/vidx_index.h | 145 ++ mysql-test/r/comments.result | 13 +- .../r/derived_condition_pushdown.result | 2 +- .../r/information_schema_keywords.result | 5 + .../r/no_binlog_gtid_empty_statement.result | 8 +- mysql-test/r/sp.result | 14 +- .../suite/binlog/r/binlog_rewrite.result | 2 +- mysql-test/suite/binlog/t/binlog_rewrite.test | 2 +- .../component_keyring_file/r/database.result | 2 +- mysql-test/suite/encryption/r/database.result | 2 +- mysql-test/suite/encryption/t/database.test | 2 +- .../r/i_s_schema_definition_debug.result | 4 +- mysql-test/suite/rds/r/vidx_column.result | 188 ++ mysql-test/suite/rds/r/vidx_ddl.result | 310 ++++ mysql-test/suite/rds/r/vidx_debug.result | 218 +++ mysql-test/suite/rds/r/vidx_dml.result | 115 ++ .../suite/rds/r/vidx_fix_71283799.result | 24 + .../suite/rds/r/vidx_fix_71294192.result | 16 + .../suite/rds/r/vidx_fix_MDEV_37068.result | 15 + mysql-test/suite/rds/r/vidx_func.result | 137 ++ mysql-test/suite/rds/r/vidx_rpl.result | 160 ++ .../suite/rds/r/vidx_support_nullable.result | 43 + mysql-test/suite/rds/r/vidx_trx.result | 60 + mysql-test/suite/rds/t/vidx_column.test | 157 ++ mysql-test/suite/rds/t/vidx_ddl.test | 276 +++ mysql-test/suite/rds/t/vidx_debug-master.opt | 2 + mysql-test/suite/rds/t/vidx_debug.test | 272 +++ mysql-test/suite/rds/t/vidx_dml.test | 122 ++ mysql-test/suite/rds/t/vidx_fix_71283799.test | 41 + mysql-test/suite/rds/t/vidx_fix_71294192.test | 31 + .../suite/rds/t/vidx_fix_MDEV_37068.test | 19 + mysql-test/suite/rds/t/vidx_func.test | 82 + mysql-test/suite/rds/t/vidx_rpl.test | 133 ++ .../suite/rds/t/vidx_support_nullable.test | 35 + mysql-test/suite/rds/t/vidx_trx.test | 61 + .../rpl/r/rpl_conditional_comments.result | 20 +- .../suite/rpl/t/rpl_conditional_comments.test | 10 +- .../rpl_nogtid/r/rpl_loaddatalocal.result | 2 +- .../suite/rpl_nogtid/t/rpl_loaddatalocal.test | 2 +- mysql-test/t/comments.test | 11 +- .../t/no_binlog_gtid_empty_statement.test | 8 +- mysql-test/t/sp.test | 14 +- mysys/CMakeLists.txt | 1 + mysys/array.cc | 18 + mysys/hash.cc | 826 +++++++++ router/src/routing/src/sql_lexer.cc | 2 +- share/messages_to_clients.txt | 21 + sql/CMakeLists.txt | 12 + sql/create_field.cc | 10 +- sql/create_field.h | 4 +- sql/dd/dd_routine.cc | 7 + sql/dd/dd_table.cc | 16 + sql/dd/impl/cache/dictionary_client.cc | 3 + sql/dd/impl/system_views/columns.cc | 7 +- sql/dd/impl/types/abstract_table_impl.cc | 6 +- sql/dd/impl/types/column_impl.cc | 8 +- sql/dd/impl/types/parameter_impl.cc | 3 +- sql/dd/types/abstract_table.h | 4 + sql/dd/upgrade_57/table.cc | 5 + sql/dd_sp.cc | 15 +- sql/dd_table_share.cc | 99 +- sql/field.cc | 27 +- sql/field.h | 16 +- sql/filesort.cc | 4 +- sql/gen_lex_token.cc | 2 +- sql/handler.cc | 75 +- sql/handler.h | 5 +- sql/item.h | 10 + sql/item_create.cc | 11 + sql/item_func.h | 1 + sql/item_strfunc.h | 2 + sql/iterators/basic_row_iterators.cc | 28 +- sql/iterators/basic_row_iterators.h | 4 +- sql/join_optimizer/access_path.cc | 6 +- sql/join_optimizer/access_path.h | 5 +- sql/key.h | 4 + sql/key_spec.h | 5 +- sql/lex.h | 5 + sql/mysqld.cc | 2 + sql/mysqld.h | 1 + sql/parse_tree_column_attrs.h | 22 + sql/parse_tree_nodes.cc | 8 +- sql/parse_tree_nodes.h | 4 + sql/psi_memory_key.cc | 2 + sql/psi_memory_key.h | 2 +- sql/server_component/table_access_service.cc | 2 +- sql/sql_alter.h | 3 +- sql/sql_base.cc | 15 + sql/sql_builtin.cc.in | 4 +- sql/sql_class.cc | 2 + sql/sql_class.h | 4 + sql/sql_executor.cc | 2 +- sql/sql_lex.cc | 3 +- sql/sql_opt_exec_shared.h | 7 + sql/sql_optimizer.cc | 35 +- sql/sql_parse.cc | 5 +- sql/sql_select.cc | 8 +- sql/sql_show.cc | 24 +- sql/sql_table.cc | 138 +- sql/sql_table.h | 3 + sql/sql_tmp_table.cc | 17 +- sql/sql_truncate.cc | 4 + sql/sql_union.cc | 2 +- sql/sql_yacc.yy | 87 +- sql/sys_vars.cc | 1 + sql/sys_vars_ext.cc | 5 +- sql/system_variables.h | 1 + sql/table.cc | 80 +- sql/table.h | 53 +- sql/table_cache.h | 9 + sql/vidx/vidx_field.cc | 146 ++ sql/vidx/vidx_func.cc | 358 ++++ sql/vidx/vidx_hnsw.cc | 1551 +++++++++++++++++ sql/vidx/vidx_index.cc | 1162 ++++++++++++ storage/innobase/dict/dict0dd.cc | 20 +- storage/innobase/handler/ha_innodb.cc | 3 + storage/innobase/row/row0mysql.cc | 5 + storage/ndb/plugin/ndb_dd_upgrade_table.cc | 8 +- strings/ctype-bin.cc | 5 +- wiki/vidx/pic/hnsw.png | Bin 0 -> 353523 bytes wiki/vidx/pic/vidx_architecture.png | Bin 0 -> 5549670 bytes wiki/vidx/pic/vidx_core_features.png | Bin 0 -> 5667988 bytes wiki/vidx/pic/vidx_core_features_zh.png | Bin 0 -> 6035310 bytes wiki/vidx/vidx_readme.md | 153 ++ wiki/vidx/vidx_readme_zh.md | 154 ++ 144 files changed, 9294 insertions(+), 250 deletions(-) create mode 100644 include/vidx/SIMD.h create mode 100644 include/vidx/bloom_filters.h create mode 100644 include/vidx/hash.h create mode 100644 include/vidx/my_atomic_wrapper.h create mode 100644 include/vidx/my_cmp.h create mode 100644 include/vidx/sql_hset.h create mode 100644 include/vidx/sql_queue.h create mode 100644 include/vidx/vidx_common.h create mode 100644 include/vidx/vidx_field.h create mode 100644 include/vidx/vidx_func.h create mode 100644 include/vidx/vidx_hnsw.h create mode 100644 include/vidx/vidx_index.h create mode 100644 mysql-test/suite/rds/r/vidx_column.result create mode 100644 mysql-test/suite/rds/r/vidx_ddl.result create mode 100644 mysql-test/suite/rds/r/vidx_debug.result create mode 100644 mysql-test/suite/rds/r/vidx_dml.result create mode 100644 mysql-test/suite/rds/r/vidx_fix_71283799.result create mode 100644 mysql-test/suite/rds/r/vidx_fix_71294192.result create mode 100644 mysql-test/suite/rds/r/vidx_fix_MDEV_37068.result create mode 100644 mysql-test/suite/rds/r/vidx_func.result create mode 100644 mysql-test/suite/rds/r/vidx_rpl.result create mode 100644 mysql-test/suite/rds/r/vidx_support_nullable.result create mode 100644 mysql-test/suite/rds/r/vidx_trx.result create mode 100644 mysql-test/suite/rds/t/vidx_column.test create mode 100644 mysql-test/suite/rds/t/vidx_ddl.test create mode 100644 mysql-test/suite/rds/t/vidx_debug-master.opt create mode 100644 mysql-test/suite/rds/t/vidx_debug.test create mode 100644 mysql-test/suite/rds/t/vidx_dml.test create mode 100644 mysql-test/suite/rds/t/vidx_fix_71283799.test create mode 100644 mysql-test/suite/rds/t/vidx_fix_71294192.test create mode 100644 mysql-test/suite/rds/t/vidx_fix_MDEV_37068.test create mode 100644 mysql-test/suite/rds/t/vidx_func.test create mode 100644 mysql-test/suite/rds/t/vidx_rpl.test create mode 100644 mysql-test/suite/rds/t/vidx_support_nullable.test create mode 100644 mysql-test/suite/rds/t/vidx_trx.test create mode 100644 mysys/hash.cc create mode 100644 sql/vidx/vidx_field.cc create mode 100644 sql/vidx/vidx_func.cc create mode 100644 sql/vidx/vidx_hnsw.cc create mode 100644 sql/vidx/vidx_index.cc create mode 100644 wiki/vidx/pic/hnsw.png create mode 100644 wiki/vidx/pic/vidx_architecture.png create mode 100644 wiki/vidx/pic/vidx_core_features.png create mode 100644 wiki/vidx/pic/vidx_core_features_zh.png create mode 100644 wiki/vidx/vidx_readme.md create mode 100644 wiki/vidx/vidx_readme_zh.md diff --git a/README.md b/README.md index bb1e316aa44..031e208a56f 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,9 @@ AliSQL is Alibaba's MySQL branch, forked from official MySQL and used extensivel - **[DuckDB Storage Engine](./wiki/duckdb/duckdb.md)**:AliSQL integrates DuckDB as a native storage engine, allowing users to operate DuckDB with the same experience as MySQL. By leveraging AliSQL for rapid deployment of DuckDB service nodes, users can easily achieve lightweight analytical capabilities. +- **[Vector Storage](https://www.alibabacloud.com/help/en/rds/apsaradb-rds-for-mysql/vector-storage-1?spm=a2c63.p38356.help-menu-26090.d_3_3_0.6bb8d111D06xOW)**:AliSQL natively supports enterprise-grade vector processing for up to 16,383 dimensions. By integrating a highly optimized HNSW algorithm for high-performance Approximate Nearest Neighbor (ANN) search, AliSQL empowers users to build AI-driven applications—such as semantic search and recommendation systems—seamlessly using standard SQL interfaces. + ## Roadmap -- **[Vector Storage](https://www.alibabacloud.com/help/en/rds/apsaradb-rds-for-mysql/vector-storage-1?spm=a2c63.p38356.help-menu-26090.d_3_3_0.6bb8d111D06xOW)** *(planned)*:AliSQL natively supports enterprise-grade vector processing for up to 16,383 dimensions. By integrating a highly optimized HNSW algorithm for high-performance Approximate Nearest Neighbor (ANN) search, AliSQL empowers users to build AI-driven applications—such as semantic search and recommendation systems—seamlessly using standard SQL interfaces. - **[DDL Optimization](https://www.alibabacloud.com/help/en/rds/apsaradb-rds-for-mysql/alisql-ddl-best-practices?spm=a2c63.p38356.help-menu-26090.d_2_8_0.1f7a28a5F1ZVeK)** *(planned)*:AliSQL delivers a faster, safer, and lighter DDL experience through innovations such as enhanced Instant DDL, parallel B+tree construction, a non-blocking lock mechanism, and real-time DDL apply—significantly improving schema change efficiency and virtually eliminating replication lag. @@ -88,6 +89,7 @@ AliSQL is based on MySQL, which is licensed under GPL-2.0. The DuckDB integratio ## See Also - [AliSQL Release Notes](./wiki/changes-in-alisql-8.0.44.md) - [DuckDB Storage Engine in AliSQL](./wiki/duckdb/duckdb.md) +- [Vector Index in AliSQL](./wiki/vidx/vidx_readme.md) - [MySQL 8.0 Documentation](https://dev.mysql.com/doc/refman/8.0/en/) - [MySQL 8.0 Github Repository](https://github.com/mysql/mysql-server) - [DuckDB Official Documentation](https://duckdb.org/docs/stable/) diff --git a/config.h.cmake b/config.h.cmake index 4069116ebbb..4ab276cde45 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -44,6 +44,7 @@ #cmakedefine HAVE_EXECINFO_H 1 #cmakedefine HAVE_FPU_CONTROL_H 1 #cmakedefine HAVE_GRP_H 1 +#cmakedefine HAVE_IMMINTRIN_H 1 #cmakedefine HAVE_LANGINFO_H 1 #cmakedefine HAVE_MALLOC_H 1 #cmakedefine HAVE_NETINET_IN_H 1 diff --git a/configure.cmake b/configure.cmake index 3ac3f4d5fe6..46da4811bef 100644 --- a/configure.cmake +++ b/configure.cmake @@ -195,6 +195,7 @@ CHECK_INCLUDE_FILES (endian.h HAVE_ENDIAN_H) CHECK_INCLUDE_FILES (execinfo.h HAVE_EXECINFO_H) CHECK_INCLUDE_FILES (fpu_control.h HAVE_FPU_CONTROL_H) CHECK_INCLUDE_FILES (grp.h HAVE_GRP_H) +CHECK_INCLUDE_FILES (immintrin.h HAVE_IMMINTRIN_H) # vidx CHECK_INCLUDE_FILES (langinfo.h HAVE_LANGINFO_H) CHECK_INCLUDE_FILES (malloc.h HAVE_MALLOC_H) CHECK_INCLUDE_FILES (netinet/in.h HAVE_NETINET_IN_H) diff --git a/include/m_ctype.h b/include/m_ctype.h index 31f7e5ad68e..182c5700b6b 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -782,4 +782,14 @@ static inline bool is_supported_parser_charset(const CHARSET_INFO *cs) { return (cs->mbminlen == 1); } +static inline void my_ci_hash_sort(CHARSET_INFO *ci, const uchar *key, + size_t len, ulong *nr1, ulong *nr2) { + (ci->coll->hash_sort)(ci, key, len, nr1, nr2); +} + +extern "C" { +void my_hash_sort_bin(const CHARSET_INFO *cs [[maybe_unused]], const uchar *key, + size_t len, uint64 *nr1, uint64 *nr2); +} // extern "C" + #endif // M_CTYPE_INCLUDED diff --git a/include/my_base.h b/include/my_base.h index b98b1acfefd..6642cf71144 100644 --- a/include/my_base.h +++ b/include/my_base.h @@ -520,7 +520,8 @@ enum ha_base_keytype { /* The combination of the above can be used for key type comparison. */ #define HA_KEYFLAG_MASK \ (HA_NOSAME | HA_PACK_KEY | HA_AUTO_KEY | HA_BINARY_PACK_KEY | HA_FULLTEXT | \ - HA_UNIQUE_CHECK | HA_SPATIAL | HA_NULL_ARE_EQUAL | HA_GENERATED_KEY) + HA_UNIQUE_CHECK | HA_SPATIAL | HA_NULL_ARE_EQUAL | HA_GENERATED_KEY | \ + HA_VECTOR) /** Fulltext index uses [pre]parser */ #define HA_USES_PARSER (1 << 14) @@ -555,6 +556,7 @@ enum ha_base_keytype { constexpr const ulong HA_INDEX_USES_ENGINE_ATTRIBUTE{1UL << 20}; constexpr const ulong HA_INDEX_USES_SECONDARY_ENGINE_ATTRIBUTE{1UL << 21}; +constexpr const ulong HA_VECTOR{1UL << 22}; /* These flags can be added to key-seg-flag */ diff --git a/include/my_bit.h b/include/my_bit.h index 231c10bd1a7..6ac588a9533 100644 --- a/include/my_bit.h +++ b/include/my_bit.h @@ -51,6 +51,45 @@ static inline uint my_bit_log2(ulong value) { return bit; } +/* + my_bit_log2_xxx() + + In the given value, find the highest bit set, + which is the smallest X that satisfies the condition: (2^X >= value). + Can be used as a reverse operation for (1<> 4)) + 4 + : my_bit_log2_hex_digit(value); +} +static inline constexpr uint my_bit_log2_uint16(uint16 value) { + return value & 0xFF00 ? my_bit_log2_uint8((uint8)(value >> 8)) + 8 + : my_bit_log2_uint8((uint8)value); +} +static inline constexpr uint my_bit_log2_uint32(uint32 value) { + return value & 0xFFFF0000UL ? my_bit_log2_uint16((uint16)(value >> 16)) + 16 + : my_bit_log2_uint16((uint16)value); +} +static inline constexpr uint my_bit_log2_uint64(ulonglong value) { + return value & 0xFFFFFFFF00000000ULL + ? my_bit_log2_uint32((uint32)(value >> 32)) + 32 + : my_bit_log2_uint32((uint32)value); +} + static inline uint my_count_bits(ulonglong v) { #if SIZEOF_LONG_LONG > 4 /* The following code is a bit faster on 16 bit machines than if we would diff --git a/include/my_byteorder.h b/include/my_byteorder.h index 12112975e53..cd42b83d351 100644 --- a/include/my_byteorder.h +++ b/include/my_byteorder.h @@ -322,6 +322,11 @@ inline uchar *store32be(uchar *ptr, uint32 val) { return pointer_cast(store32be(pointer_cast(ptr), val)); } +/* convenience helpers */ +static inline float get_float(const void *from) { + return float4get(((const uchar *)from)); +} + #endif /* __cplusplus */ #endif /* MY_BYTEORDER_INCLUDED */ diff --git a/include/my_sys.h b/include/my_sys.h index 081ce35ca3e..8b9f6251307 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -789,11 +789,13 @@ extern bool my_init_dynamic_array(DYNAMIC_ARRAY *array, PSI_memory_key key, #define dynamic_element(array, array_index, type) \ ((type)((array)->buffer) + (array_index)) +#define reset_dynamic(array) ((array)->elements = 0) /* Some functions are still in use in C++, because HASH uses DYNAMIC_ARRAY */ extern bool insert_dynamic(DYNAMIC_ARRAY *array, const void *element); extern void *alloc_dynamic(DYNAMIC_ARRAY *array); extern void delete_dynamic(DYNAMIC_ARRAY *array); +extern void *pop_dynamic(DYNAMIC_ARRAY *); extern bool init_dynamic_string(DYNAMIC_STRING *str, const char *init_str, size_t init_alloc); diff --git a/include/vidx/SIMD.h b/include/vidx/SIMD.h new file mode 100644 index 00000000000..d13f668a2f3 --- /dev/null +++ b/include/vidx/SIMD.h @@ -0,0 +1,55 @@ +#ifndef SIMD_INCLUDED +#define SIMD_INCLUDED + +/* +MIT License + +Copyright (c) 2023 Sasha Krassovsky + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +// https://save-buffer.github.io/bloom_filter.html + +/* + Use gcc function multiversioning to optimize for a specific CPU with run-time + detection. Works only for x86, for other architectures we provide only one + implementation for now. +*/ +#define DEFAULT_IMPLEMENTATION +#if __GNUC__ > 7 +#ifdef __x86_64__ +#ifdef HAVE_IMMINTRIN_H +#include +#undef DEFAULT_IMPLEMENTATION +#define DEFAULT_IMPLEMENTATION __attribute__((target("default"))) +#define AVX2_IMPLEMENTATION __attribute__((target("avx2,avx,fma"))) +#if __GNUC__ > 9 +#define AVX512_IMPLEMENTATION __attribute__((target("avx512f,avx512bw"))) +#endif +#endif +#endif +#ifdef __aarch64__ +#include +#undef DEFAULT_IMPLEMENTATION +#define NEON_IMPLEMENTATION +#endif +#endif + +#endif /* SIMD_INCLUDED */ diff --git a/include/vidx/bloom_filters.h b/include/vidx/bloom_filters.h new file mode 100644 index 00000000000..53381dab57f --- /dev/null +++ b/include/vidx/bloom_filters.h @@ -0,0 +1,417 @@ +#ifndef BLOOM_FILTERS_INCLUDED +#define BLOOM_FILTERS_INCLUDED + +/* +MIT License + +Copyright (c) 2023 Sasha Krassovsky + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +// https://save-buffer.github.io/bloom_filter.html + +#pragma once +#include +#include +#include + +#include "my_bit.h" +#include "my_inttypes.h" // rds uintxx_t +#include "vidx/SIMD.h" + +template +struct PatternedSimdBloomFilter { + PatternedSimdBloomFilter(int n, float eps) : n(n), epsilon(eps) { + m = ComputeNumBits(); + int log_num_blocks = my_bit_log2_uint32(m) + 1 - rotate_bits; + num_blocks = (1ULL << log_num_blocks); + bv.resize(num_blocks); + } + + uint32_t ComputeNumBits() { + double bits_per_val = -1.44 * std::log2(epsilon); + return std::max(512, + static_cast(bits_per_val * n + 0.5)); + } + +#ifdef AVX2_IMPLEMENTATION + AVX2_IMPLEMENTATION + __m256i CalcHash(__m256i vecData) { + // (almost) xxHash parallel version, 64bit input, 64bit output, seed=0 + static constexpr __m256i rotl48 = { + 0x0504030201000706ULL, 0x0D0C0B0A09080F0EULL, 0x1514131211101716ULL, + 0x1D1C1B1A19181F1EULL}; + static constexpr __m256i rotl24 = { + 0x0201000706050403ULL, + 0x0A09080F0E0D0C0BULL, + 0x1211101716151413ULL, + 0x1A19181F1E1D1C1BULL, + }; + static constexpr uint64_t prime_mx2 = 0x9FB21C651E98DF25ULL; + static constexpr uint64_t bitflip = 0xC73AB174C5ECD5A2ULL; + __m256i step1 = _mm256_xor_si256(vecData, _mm256_set1_epi64x(bitflip)); + __m256i step2 = _mm256_shuffle_epi8(step1, rotl48); + __m256i step3 = _mm256_shuffle_epi8(step1, rotl24); + __m256i step4 = _mm256_xor_si256(step1, _mm256_xor_si256(step2, step3)); + __m256i step5 = _mm256_mul_epi32(step4, _mm256_set1_epi64x(prime_mx2)); + __m256i step6 = _mm256_srli_epi64(step5, 35); + __m256i step7 = _mm256_add_epi64(step6, _mm256_set1_epi64x(8)); + __m256i step8 = _mm256_xor_si256(step5, step7); + __m256i step9 = _mm256_mul_epi32(step8, _mm256_set1_epi64x(prime_mx2)); + return _mm256_xor_si256(step9, _mm256_srli_epi64(step9, 28)); + } + + AVX2_IMPLEMENTATION + __m256i GetBlockIdx(__m256i vecHash) { + __m256i vecNumBlocksMask = _mm256_set1_epi64x(num_blocks - 1); + __m256i vecBlockIdx = + _mm256_srli_epi64(vecHash, mask_idx_bits + rotate_bits); + return _mm256_and_si256(vecBlockIdx, vecNumBlocksMask); + } + + AVX2_IMPLEMENTATION + __m256i ConstructMask(__m256i vecHash) { + __m256i vecMaskIdxMask = _mm256_set1_epi64x((1 << mask_idx_bits) - 1); + __m256i vecMaskMask = _mm256_set1_epi64x((1ull << bits_per_mask) - 1); + __m256i vec64 = _mm256_set1_epi64x(64); + + __m256i vecMaskIdx = _mm256_and_si256(vecHash, vecMaskIdxMask); + __m256i vecMaskByteIdx = _mm256_srli_epi64(vecMaskIdx, 3); + __m256i vecMaskBitIdx = + _mm256_and_si256(vecMaskIdx, _mm256_set1_epi64x(0x7)); + __m256i vecRawMasks = + _mm256_i64gather_epi64((const longlong *)masks, vecMaskByteIdx, 1); + __m256i vecUnrotated = _mm256_and_si256( + _mm256_srlv_epi64(vecRawMasks, vecMaskBitIdx), vecMaskMask); + + __m256i vecRotation = + _mm256_and_si256(_mm256_srli_epi64(vecHash, mask_idx_bits), + _mm256_set1_epi64x((1 << rotate_bits) - 1)); + __m256i vecShiftUp = _mm256_sllv_epi64(vecUnrotated, vecRotation); + __m256i vecShiftDown = + _mm256_srlv_epi64(vecUnrotated, _mm256_sub_epi64(vec64, vecRotation)); + return _mm256_or_si256(vecShiftDown, vecShiftUp); + } + + AVX2_IMPLEMENTATION + void Insert(const T **data) { + __m256i vecDataA = + _mm256_loadu_si256(reinterpret_cast<__m256i *>(data + 0)); + __m256i vecDataB = + _mm256_loadu_si256(reinterpret_cast<__m256i *>(data + 4)); + + __m256i vecHashA = CalcHash(vecDataA); + __m256i vecHashB = CalcHash(vecDataB); + + __m256i vecMaskA = ConstructMask(vecHashA); + __m256i vecMaskB = ConstructMask(vecHashB); + + __m256i vecBlockIdxA = GetBlockIdx(vecHashA); + __m256i vecBlockIdxB = GetBlockIdx(vecHashB); + + uint64_t block0 = _mm256_extract_epi64(vecBlockIdxA, 0); + uint64_t block1 = _mm256_extract_epi64(vecBlockIdxA, 1); + uint64_t block2 = _mm256_extract_epi64(vecBlockIdxA, 2); + uint64_t block3 = _mm256_extract_epi64(vecBlockIdxA, 3); + uint64_t block4 = _mm256_extract_epi64(vecBlockIdxB, 0); + uint64_t block5 = _mm256_extract_epi64(vecBlockIdxB, 1); + uint64_t block6 = _mm256_extract_epi64(vecBlockIdxB, 2); + uint64_t block7 = _mm256_extract_epi64(vecBlockIdxB, 3); + + bv[block0] |= _mm256_extract_epi64(vecMaskA, 0); + bv[block1] |= _mm256_extract_epi64(vecMaskA, 1); + bv[block2] |= _mm256_extract_epi64(vecMaskA, 2); + bv[block3] |= _mm256_extract_epi64(vecMaskA, 3); + bv[block4] |= _mm256_extract_epi64(vecMaskB, 0); + bv[block5] |= _mm256_extract_epi64(vecMaskB, 1); + bv[block6] |= _mm256_extract_epi64(vecMaskB, 2); + bv[block7] |= _mm256_extract_epi64(vecMaskB, 3); + } + + AVX2_IMPLEMENTATION + uint8_t Query(T **data) { + __m256i vecDataA = + _mm256_loadu_si256(reinterpret_cast<__m256i *>(data + 0)); + __m256i vecDataB = + _mm256_loadu_si256(reinterpret_cast<__m256i *>(data + 4)); + + __m256i vecHashA = CalcHash(vecDataA); + __m256i vecHashB = CalcHash(vecDataB); + + __m256i vecMaskA = ConstructMask(vecHashA); + __m256i vecMaskB = ConstructMask(vecHashB); + + __m256i vecBlockIdxA = GetBlockIdx(vecHashA); + __m256i vecBlockIdxB = GetBlockIdx(vecHashB); + + __m256i vecBloomA = + _mm256_i64gather_epi64(bv.data(), vecBlockIdxA, sizeof(longlong)); + __m256i vecBloomB = + _mm256_i64gather_epi64(bv.data(), vecBlockIdxB, sizeof(longlong)); + __m256i vecCmpA = + _mm256_cmpeq_epi64(_mm256_and_si256(vecMaskA, vecBloomA), vecMaskA); + __m256i vecCmpB = + _mm256_cmpeq_epi64(_mm256_and_si256(vecMaskB, vecBloomB), vecMaskB); + uint32_t res_a = static_cast(_mm256_movemask_epi8(vecCmpA)); + uint32_t res_b = static_cast(_mm256_movemask_epi8(vecCmpB)); + uint64_t res_bytes = res_a | (static_cast(res_b) << 32); + uint8_t res_bits = static_cast( + _mm256_movemask_epi8(_mm256_set1_epi64x(res_bytes)) & 0xff); + return res_bits; + } + + /* AVX-512 version can be (and was) implemented, but the speedup is, + basically, unnoticeable, well below the noise level */ +#endif + +#ifdef NEON_IMPLEMENTATION + uint64x2_t CalcHash(uint64x2_t vecData) { + static constexpr uint64_t prime_mx2 = 0x9FB21C651E98DF25ULL; + static constexpr uint64_t bitflip = 0xC73AB174C5ECD5A2ULL; + uint64x2_t step1 = veorq_u64(vecData, vdupq_n_u64(bitflip)); + uint64x2_t step2 = + veorq_u64(vshrq_n_u64(step1, 48), vshlq_n_u64(step1, 16)); + uint64x2_t step3 = + veorq_u64(vshrq_n_u64(step1, 24), vshlq_n_u64(step1, 40)); + uint64x2_t step4 = veorq_u64(step1, veorq_u64(step2, step3)); + uint64x2_t step5; + step5 = vsetq_lane_u64(vgetq_lane_u64(step4, 0) * prime_mx2, step4, 0); + step5 = vsetq_lane_u64(vgetq_lane_u64(step4, 1) * prime_mx2, step5, 1); + uint64x2_t step6 = vshrq_n_u64(step5, 35); + uint64x2_t step7 = vaddq_u64(step6, vdupq_n_u64(8)); + uint64x2_t step8 = veorq_u64(step5, step7); + uint64x2_t step9; + step9 = vsetq_lane_u64(vgetq_lane_u64(step8, 0) * prime_mx2, step8, 0); + step9 = vsetq_lane_u64(vgetq_lane_u64(step8, 1) * prime_mx2, step9, 1); + return veorq_u64(step9, vshrq_n_u64(step9, 28)); + } + + uint64x2_t GetBlockIdx(uint64x2_t vecHash) { + uint64x2_t vecNumBlocksMask = vdupq_n_u64(num_blocks - 1); + uint64x2_t vecBlockIdx = vshrq_n_u64(vecHash, mask_idx_bits + rotate_bits); + return vandq_u64(vecBlockIdx, vecNumBlocksMask); + } + + uint64x2_t ConstructMask(uint64x2_t vecHash) { + uint64x2_t vecMaskIdxMask = vdupq_n_u64((1 << mask_idx_bits) - 1); + uint64x2_t vecMaskMask = vdupq_n_u64((1ull << bits_per_mask) - 1); + + uint64x2_t vecMaskIdx = vandq_u64(vecHash, vecMaskIdxMask); + uint64x2_t vecMaskByteIdx = vshrq_n_u64(vecMaskIdx, 3); + /* + Shift right in NEON is implemented as shift left by a negative value. + Do the negation here. + */ + int64x2_t vecMaskBitIdx = vsubq_s64( + vdupq_n_s64(0), + vreinterpretq_s64_u64(vandq_u64(vecMaskIdx, vdupq_n_u64(0x7)))); + uint64x2_t vecRawMasks = vdupq_n_u64(*reinterpret_cast( + masks + vgetq_lane_u64(vecMaskByteIdx, 0))); + vecRawMasks = vsetq_lane_u64(*reinterpret_cast( + masks + vgetq_lane_u64(vecMaskByteIdx, 1)), + vecRawMasks, 1); + uint64x2_t vecUnrotated = + vandq_u64(vshlq_u64(vecRawMasks, vecMaskBitIdx), vecMaskMask); + + int64x2_t vecRotation = + vreinterpretq_s64_u64(vandq_u64(vshrq_n_u64(vecHash, mask_idx_bits), + vdupq_n_u64((1 << rotate_bits) - 1))); + uint64x2_t vecShiftUp = vshlq_u64(vecUnrotated, vecRotation); + uint64x2_t vecShiftDown = + vshlq_u64(vecUnrotated, vsubq_s64(vecRotation, vdupq_n_s64(64))); + return vorrq_u64(vecShiftDown, vecShiftUp); + } + + void Insert(const T **data) { + uint64x2_t vecDataA = vld1q_u64(reinterpret_cast(data + 0)); + uint64x2_t vecDataB = vld1q_u64(reinterpret_cast(data + 2)); + uint64x2_t vecDataC = vld1q_u64(reinterpret_cast(data + 4)); + uint64x2_t vecDataD = vld1q_u64(reinterpret_cast(data + 6)); + + uint64x2_t vecHashA = CalcHash(vecDataA); + uint64x2_t vecHashB = CalcHash(vecDataB); + uint64x2_t vecHashC = CalcHash(vecDataC); + uint64x2_t vecHashD = CalcHash(vecDataD); + + uint64x2_t vecMaskA = ConstructMask(vecHashA); + uint64x2_t vecMaskB = ConstructMask(vecHashB); + uint64x2_t vecMaskC = ConstructMask(vecHashC); + uint64x2_t vecMaskD = ConstructMask(vecHashD); + + uint64x2_t vecBlockIdxA = GetBlockIdx(vecHashA); + uint64x2_t vecBlockIdxB = GetBlockIdx(vecHashB); + uint64x2_t vecBlockIdxC = GetBlockIdx(vecHashC); + uint64x2_t vecBlockIdxD = GetBlockIdx(vecHashD); + + uint64_t block0 = vgetq_lane_u64(vecBlockIdxA, 0); + uint64_t block1 = vgetq_lane_u64(vecBlockIdxA, 1); + uint64_t block2 = vgetq_lane_u64(vecBlockIdxB, 0); + uint64_t block3 = vgetq_lane_u64(vecBlockIdxB, 1); + uint64_t block4 = vgetq_lane_u64(vecBlockIdxC, 0); + uint64_t block5 = vgetq_lane_u64(vecBlockIdxC, 1); + uint64_t block6 = vgetq_lane_u64(vecBlockIdxD, 0); + uint64_t block7 = vgetq_lane_u64(vecBlockIdxD, 1); + + bv[block0] |= vgetq_lane_u64(vecMaskA, 0); + bv[block1] |= vgetq_lane_u64(vecMaskA, 1); + bv[block2] |= vgetq_lane_u64(vecMaskB, 0); + bv[block3] |= vgetq_lane_u64(vecMaskB, 1); + bv[block4] |= vgetq_lane_u64(vecMaskC, 0); + bv[block5] |= vgetq_lane_u64(vecMaskC, 1); + bv[block6] |= vgetq_lane_u64(vecMaskD, 0); + bv[block7] |= vgetq_lane_u64(vecMaskD, 1); + } + + uint8_t Query(T **data) { + uint64x2_t vecDataA = vld1q_u64(reinterpret_cast(data + 0)); + uint64x2_t vecDataB = vld1q_u64(reinterpret_cast(data + 2)); + uint64x2_t vecDataC = vld1q_u64(reinterpret_cast(data + 4)); + uint64x2_t vecDataD = vld1q_u64(reinterpret_cast(data + 6)); + + uint64x2_t vecHashA = CalcHash(vecDataA); + uint64x2_t vecHashB = CalcHash(vecDataB); + uint64x2_t vecHashC = CalcHash(vecDataC); + uint64x2_t vecHashD = CalcHash(vecDataD); + + uint64x2_t vecMaskA = ConstructMask(vecHashA); + uint64x2_t vecMaskB = ConstructMask(vecHashB); + uint64x2_t vecMaskC = ConstructMask(vecHashC); + uint64x2_t vecMaskD = ConstructMask(vecHashD); + + uint64x2_t vecBlockIdxA = GetBlockIdx(vecHashA); + uint64x2_t vecBlockIdxB = GetBlockIdx(vecHashB); + uint64x2_t vecBlockIdxC = GetBlockIdx(vecHashC); + uint64x2_t vecBlockIdxD = GetBlockIdx(vecHashD); + + uint64x2_t vecBloomA = vdupq_n_u64(bv[vgetq_lane_u64(vecBlockIdxA, 0)]); + vecBloomA = + vsetq_lane_u64(bv[vgetq_lane_u64(vecBlockIdxA, 1)], vecBloomA, 1); + uint64x2_t vecBloomB = vdupq_n_u64(bv[vgetq_lane_u64(vecBlockIdxB, 0)]); + vecBloomB = + vsetq_lane_u64(bv[vgetq_lane_u64(vecBlockIdxB, 1)], vecBloomB, 1); + uint64x2_t vecBloomC = vdupq_n_u64(bv[vgetq_lane_u64(vecBlockIdxC, 0)]); + vecBloomC = + vsetq_lane_u64(bv[vgetq_lane_u64(vecBlockIdxC, 1)], vecBloomC, 1); + uint64x2_t vecBloomD = vdupq_n_u64(bv[vgetq_lane_u64(vecBlockIdxD, 0)]); + vecBloomD = + vsetq_lane_u64(bv[vgetq_lane_u64(vecBlockIdxD, 1)], vecBloomD, 1); + + uint64x2_t vecCmpA = vceqq_u64(vandq_u64(vecMaskA, vecBloomA), vecMaskA); + uint64x2_t vecCmpB = vceqq_u64(vandq_u64(vecMaskB, vecBloomB), vecMaskB); + uint64x2_t vecCmpC = vceqq_u64(vandq_u64(vecMaskC, vecBloomC), vecMaskC); + uint64x2_t vecCmpD = vceqq_u64(vandq_u64(vecMaskD, vecBloomD), vecMaskD); + + return (vgetq_lane_u64(vecCmpA, 0) & 0x01) | + (vgetq_lane_u64(vecCmpA, 1) & 0x02) | + (vgetq_lane_u64(vecCmpB, 0) & 0x04) | + (vgetq_lane_u64(vecCmpB, 1) & 0x08) | + (vgetq_lane_u64(vecCmpC, 0) & 0x10) | + (vgetq_lane_u64(vecCmpC, 1) & 0x20) | + (vgetq_lane_u64(vecCmpD, 0) & 0x40) | + (vgetq_lane_u64(vecCmpD, 1) & 0x80); + } +#endif + + /******************************************************** + ********* non-SIMD fallback version ********************/ + +#ifdef DEFAULT_IMPLEMENTATION + uint64_t CalcHash_1(const T *data) { + static constexpr uint64_t prime_mx2 = 0x9FB21C651E98DF25ULL; + static constexpr uint64_t bitflip = 0xC73AB174C5ECD5A2ULL; + uint64_t step1 = ((intptr)data) ^ bitflip; + uint64_t step2 = (step1 >> 48) ^ (step1 << 16); + uint64_t step3 = (step1 >> 24) ^ (step1 << 40); + uint64_t step4 = step1 ^ step2 ^ step3; + uint64_t step5 = step4 * prime_mx2; + uint64_t step6 = step5 >> 35; + uint64_t step7 = step6 + 8; + uint64_t step8 = step5 ^ step7; + uint64_t step9 = step8 * prime_mx2; + return step9 ^ (step9 >> 28); + } + + uint64_t GetBlockIdx_1(uint64_t hash) { + uint64_t blockIdx = hash >> (mask_idx_bits + rotate_bits); + return blockIdx & (num_blocks - 1); + } + + uint64_t ConstructMask_1(uint64_t hash) { + uint64_t maskIdxMask = (1 << mask_idx_bits) - 1; + uint64_t maskMask = (1ULL << bits_per_mask) - 1; + uint64_t maskIdx = hash & maskIdxMask; + uint64_t maskByteIdx = maskIdx >> 3; + uint64_t maskBitIdx = maskIdx & 7; + uint64_t rawMask = *(uint64_t *)(masks + maskByteIdx); + uint64_t unrotated = (rawMask >> maskBitIdx) & maskMask; + uint64_t rotation = (hash >> mask_idx_bits) & ((1 << rotate_bits) - 1); + return rotation ? (unrotated << rotation) | (unrotated >> (64 - rotation)) + : unrotated; + } + + DEFAULT_IMPLEMENTATION + void Insert(const T **data) { + for (size_t i = 0; i < 8; i++) { + uint64_t hash = CalcHash_1(data[i]); + uint64_t mask = ConstructMask_1(hash); + bv[GetBlockIdx_1(hash)] |= mask; + } + } + + DEFAULT_IMPLEMENTATION + uint8_t Query(T **data) { + uint8_t res_bits = 0; + for (size_t i = 0; i < 8; i++) { + uint64_t hash = CalcHash_1(data[i]); + uint64_t mask = ConstructMask_1(hash); + if ((bv[GetBlockIdx_1(hash)] & mask) == mask) res_bits |= 1 << i; + } + return res_bits; + } +#endif + + int n; + float epsilon; + + uint64_t num_blocks; + uint32_t m; + // calculated from the upstream MaskTable and hard-coded + static constexpr int log_num_masks = 10; + static constexpr int bits_per_mask = 57; + const uint8_t masks[136] = { + 0x00, 0x04, 0x01, 0x04, 0x00, 0x20, 0x01, 0x00, 0x00, 0x02, 0x08, 0x00, + 0x02, 0x42, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x80, 0x00, 0x04, 0x00, + 0x02, 0x00, 0x00, 0x21, 0x00, 0x08, 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, + 0x10, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x40, 0x01, 0x00, + 0x40, 0x00, 0x00, 0x08, 0x01, 0x02, 0x80, 0x00, 0x00, 0x01, 0x00, 0x06, + 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0c, 0x10, 0x00, 0x10, 0x00, 0x00, + 0x10, 0x08, 0x01, 0x10, 0x00, 0x00, 0x10, 0x20, 0x00, 0x01, 0x20, 0x00, + 0x02, 0x40, 0x00, 0x00, 0x02, 0x40, 0x01, 0x00, 0x40, 0x00, 0x00, 0x0a, + 0x00, 0x02, 0x01, 0x80, 0x00, 0x00, 0x10, 0x08, 0x00, 0x06, 0x00, 0x04, + 0x00, 0x00, 0x50, 0x00, 0x08, 0x10, 0x20, 0x00, 0x00, 0x80, 0x00, 0x10, + 0x10, 0x04, 0x04, 0x00, 0x00, 0x00, 0x20, 0x20, 0x08, 0x08, 0x02, 0x00, + 0x00, 0x00, 0x40, 0x00}; + std::vector bv; + + static constexpr int mask_idx_bits = log_num_masks; + static constexpr int rotate_bits = 6; +}; + +#endif /* BLOOM_FILTERS_INCLUDED */ diff --git a/include/vidx/hash.h b/include/vidx/hash.h new file mode 100644 index 00000000000..93aad190af5 --- /dev/null +++ b/include/vidx/hash.h @@ -0,0 +1,121 @@ +/* Copyright (c) 2000, 2023, Oracle and/or its affiliates. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License, version 2.0, + as published by the Free Software Foundation. + + This program is also distributed with certain software (including + but not limited to OpenSSL) that is licensed under separate terms, + as designated in a particular file or component or in included license + documentation. The authors of MySQL hereby grant you an additional + permission to link the program and your derivative works with the + separately licensed software that they have included with MySQL. + + 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, version 2.0, for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +/* Dynamic hashing of record with different key-length */ + +#ifndef _hash_h +#define _hash_h + +#include "my_sys.h" /* DYNAMIC_ARRAY */ + +/* + This forward declaration is used from C files where the real + definition is included before. Since C does not allow repeated + typedef declarations, even when identical, the definition may not be + repeated. +*/ +#ifdef __cplusplus +extern "C" { +#endif + +/* + Overhead to store an element in hash + Can be used to approximate memory consumption for a hash + */ +#define HASH_OVERHEAD (sizeof(char *) * 2) + +/* flags for hash_init */ +#define HASH_UNIQUE 1 /* hash_insert fails on duplicate key */ +#define HASH_THREAD_SPECIFIC 2 /* Mark allocated memory THREAD_SPECIFIC */ + +typedef char my_bool; + +/* Define some general constants */ +#ifndef TRUE +#define TRUE (1) /* Logical true */ +#define FALSE (0) /* Logical false */ +#endif + +typedef uint32 my_hash_value_type; +typedef const uchar *(*my_hash_get_key)(const void *, size_t *, my_bool); +typedef my_hash_value_type (*my_hash_function)(CHARSET_INFO *, const uchar *, + size_t); +typedef void (*my_hash_free_key)(void *); +typedef my_bool (*my_hash_walk_action)(void *, void *); + +typedef struct st_hash { + size_t key_offset, key_length; /* Length of key if const length */ + size_t blength; + ulong records; + uint flags; + DYNAMIC_ARRAY array; /* Place for hash_keys */ + my_hash_get_key get_key; + my_hash_function hash_function; + void (*free)(void *); + CHARSET_INFO *charset; +} HASH; + +/* A search iterator state */ +typedef uint HASH_SEARCH_STATE; + +#define my_hash_init(A, B, C, D, E, F, G, H, I) \ + my_hash_init2(A, B, 0, C, D, E, F, G, 0, H, I) +my_bool my_hash_init2(PSI_memory_key psi_key, HASH *hash, size_t growth_size, + CHARSET_INFO *charset, size_t default_array_elements, + size_t key_offset, size_t key_length, + my_hash_get_key get_key, my_hash_function hash_function, + void (*free_element)(void *), uint flags); +void my_hash_free(HASH *tree); +void my_hash_reset(HASH *hash); +uchar *my_hash_element(const HASH *hash, size_t idx); +uchar *my_hash_search(const HASH *info, const uchar *key, size_t length); +uchar *my_hash_search_using_hash_value(const HASH *info, + my_hash_value_type hash_value, + const uchar *key, size_t length); +my_hash_value_type my_hash_sort(CHARSET_INFO *cs, const uchar *key, + size_t length); +#define my_calc_hash(A, B, C) my_hash_sort((A)->charset, B, C) +uchar *my_hash_first(const HASH *info, const uchar *key, size_t length, + HASH_SEARCH_STATE *state); +uchar *my_hash_first_from_hash_value(const HASH *info, + my_hash_value_type hash_value, + const uchar *key, size_t length, + HASH_SEARCH_STATE *state); +uchar *my_hash_next(const HASH *info, const uchar *key, size_t length, + HASH_SEARCH_STATE *state); +my_bool my_hash_insert(HASH *info, const uchar *data); +my_bool my_hash_delete(HASH *hash, uchar *record); +my_bool my_hash_update(HASH *hash, uchar *record, uchar *old_key, + size_t old_key_length); +void my_hash_replace(HASH *hash, HASH_SEARCH_STATE *state, uchar *new_row); +my_bool my_hash_check(HASH *hash); /* Only in debug library */ +my_bool my_hash_iterate(HASH *hash, my_hash_walk_action action, void *argument); + +#define my_hash_clear(H) bzero((char *)(H), sizeof(*(H))) +#define my_hash_inited(H) ((H)->blength != 0) +#define my_hash_init_opt(A, B, C, D, E, F, G, H, I) \ + (!my_hash_inited(B) && my_hash_init(A, B, C, D, E, F, G, H, I)) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/include/vidx/my_atomic_wrapper.h b/include/vidx/my_atomic_wrapper.h new file mode 100644 index 00000000000..fa815de7aa0 --- /dev/null +++ b/include/vidx/my_atomic_wrapper.h @@ -0,0 +1,100 @@ +/* + Copyright (c) 2001, 2023, Oracle and/or its affiliates. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License, version 2.0, + as published by the Free Software Foundation. + + This program is also distributed with certain software (including + but not limited to OpenSSL) that is licensed under separate terms, + as designated in a particular file or component or in included license + documentation. The authors of MySQL hereby grant you an additional + permission to link the program and your derivative works with the + separately licensed software that they have included with MySQL. + + Without limiting anything contained in the foregoing, this file, + which is part of C Driver for MySQL (Connector/C), is also subject to the + Universal FOSS Exception, version 1.0, a copy of which can be found at + http://oss.oracle.com/licenses/universal-foss-exception. + + 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, version 2.0, for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +#pragma once +#ifdef __cplusplus +#include +/** + A wrapper for std::atomic, defaulting to std::memory_order_relaxed. + + When it comes to atomic loads or stores at std::memory_order_relaxed + on IA-32 or AMD64, this wrapper is only introducing some constraints + to the C++ compiler, to prevent some optimizations of loads or + stores. + + On POWER and ARM, atomic loads and stores involve different instructions + from normal loads and stores and will thus incur some overhead. + + Because atomic read-modify-write operations will always incur + overhead, we intentionally do not define + operator++(), operator--(), operator+=(), operator-=(), or similar, + to make the overhead stand out in the users of this code. +*/ +template +class Atomic_relaxed { + std::atomic m; + + public: + Atomic_relaxed(const Atomic_relaxed &rhs) { + m.store(rhs, std::memory_order_relaxed); + } + Atomic_relaxed(Type val) : m(val) {} + Atomic_relaxed() = default; + + Type load(std::memory_order o = std::memory_order_relaxed) const { + return m.load(o); + } + void store(Type i, std::memory_order o = std::memory_order_relaxed) { + m.store(i, o); + } + operator Type() const { return m.load(); } + Type operator=(const Type i) { + store(i); + return i; + } + Type operator=(const Atomic_relaxed &rhs) { return *this = Type{rhs}; } + Type operator+=(const Type i) { return fetch_add(i); } + Type fetch_add(const Type i, + std::memory_order o = std::memory_order_relaxed) { + return m.fetch_add(i, o); + } + Type fetch_sub(const Type i, + std::memory_order o = std::memory_order_relaxed) { + return m.fetch_sub(i, o); + } + Type fetch_xor(const Type i, + std::memory_order o = std::memory_order_relaxed) { + return m.fetch_xor(i, o); + } + Type fetch_and(const Type i, + std::memory_order o = std::memory_order_relaxed) { + return m.fetch_and(i, o); + } + Type fetch_or(const Type i, std::memory_order o = std::memory_order_relaxed) { + return m.fetch_or(i, o); + } + bool compare_exchange_strong( + Type &i1, const Type i2, std::memory_order o1 = std::memory_order_relaxed, + std::memory_order o2 = std::memory_order_relaxed) { + return m.compare_exchange_strong(i1, i2, o1, o2); + } + Type exchange(const Type i, std::memory_order o = std::memory_order_relaxed) { + return m.exchange(i, o); + } +}; +#endif /* __cplusplus */ diff --git a/include/vidx/my_cmp.h b/include/vidx/my_cmp.h new file mode 100644 index 00000000000..fc8895e25e6 --- /dev/null +++ b/include/vidx/my_cmp.h @@ -0,0 +1,38 @@ +/* + Copyright (c) 2001, 2023, Oracle and/or its affiliates. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License, version 2.0, + as published by the Free Software Foundation. + + This program is also distributed with certain software (including + but not limited to OpenSSL) that is licensed under separate terms, + as designated in a particular file or component or in included license + documentation. The authors of MySQL hereby grant you an additional + permission to link the program and your derivative works with the + separately licensed software that they have included with MySQL. + + Without limiting anything contained in the foregoing, this file, + which is part of C Driver for MySQL (Connector/C), is also subject to the + Universal FOSS Exception, version 1.0, a copy of which can be found at + http://oss.oracle.com/licenses/universal-foss-exception. + + 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, version 2.0, for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif +typedef int (*qsort_cmp)(const void *, const void *); +typedef int (*qsort_cmp2)(void *param, const void *a, const void *b); +#ifdef __cplusplus +} +#endif diff --git a/include/vidx/sql_hset.h b/include/vidx/sql_hset.h new file mode 100644 index 00000000000..2575aaf408a --- /dev/null +++ b/include/vidx/sql_hset.h @@ -0,0 +1,142 @@ +#ifndef SQL_HSET_INCLUDED +#define SQL_HSET_INCLUDED +/* Copyright (c) 2010, 2023, Oracle and/or its affiliates. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License, version 2.0, + as published by the Free Software Foundation. + + This program is also distributed with certain software (including + but not limited to OpenSSL) that is licensed under separate terms, + as designated in a particular file or component or in included license + documentation. The authors of MySQL hereby grant you an additional + permission to link the program and your derivative works with the + separately licensed software that they have included with MySQL. + + 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, version 2.0, 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-1301, USA + */ + +#include "vidx/hash.h" + +/** + A type-safe wrapper around mysys HASH. +*/ + +template +class Hash_set { + public: + enum { START_SIZE = 8 }; + /** + Constructs an empty unique hash. + */ + Hash_set(PSI_memory_key psi_key, + const uchar *(*K)(const void *, size_t *, my_bool), + CHARSET_INFO *cs = &my_charset_bin) { + my_hash_init(psi_key, &m_hash, cs, START_SIZE, 0, 0, K, 0, HASH_UNIQUE); + } + + Hash_set(PSI_memory_key psi_key, CHARSET_INFO *charset, + ulong default_array_elements, size_t key_offset, size_t key_length, + my_hash_get_key get_key, void (*free_element)(void *), uint flags) { + my_hash_init(psi_key, &m_hash, charset, default_array_elements, key_offset, + key_length, get_key, free_element, flags); + } + /** + Destroy the hash by freeing the buckets table. Does + not call destructors for the elements. + */ + ~Hash_set() { my_hash_free(&m_hash); } + /** + Insert a single value into a hash. Does not tell whether + the value was inserted -- if an identical value existed, + it is not replaced. + + @retval TRUE Out of memory. + @retval FALSE OK. The value either was inserted or existed + in the hash. + */ + bool insert(const T *value) { + return my_hash_insert(&m_hash, reinterpret_cast(value)); + } + bool remove(const T *value) { + return my_hash_delete(&m_hash, + reinterpret_cast(const_cast(value))); + } + T *find(const void *key, size_t klen) const { + return (T *)my_hash_search(&m_hash, reinterpret_cast(key), + klen); + } + + T *find(const T *other) const { + size_t klen; + const uchar *key = + m_hash.get_key(reinterpret_cast(other), &klen, false); + return find(key, klen); + } + /** Is this hash set empty? */ + bool is_empty() const { return m_hash.records == 0; } + /** Returns the number of unique elements. */ + size_t size() const { return static_cast(m_hash.records); } + /** Erases all elements from the container */ + void clear() { my_hash_reset(&m_hash); } + const T *at(size_t i) const { + return reinterpret_cast( + my_hash_element(const_cast(&m_hash), i)); + } + /** An iterator over hash elements. Is not insert-stable. */ + class Iterator; + using value_type = T; + using iterator = Iterator; + using const_iterator = const Iterator; + + Iterator begin() const { return Iterator(*this, 0); } + Iterator end() const { return Iterator(*this, m_hash.records); } + + class Iterator { + public: + using iterator_category = std::forward_iterator_tag; + using value_type = T; + using difference_type = std::ptrdiff_t; + using pointer = T *; + using reference = T &; + + Iterator(const Hash_set &hash_set, uint idx = 0) + : m_hash(&hash_set.m_hash), m_idx(idx) {} + + Iterator &operator++() { + m_idx++; + return *this; + } + + T &operator*() { + return *reinterpret_cast(my_hash_element(m_hash, m_idx)); + } + + T *operator->() { + return reinterpret_cast(my_hash_element(m_hash, m_idx)); + } + + bool operator==(const typename Hash_set::iterator &rhs) { + return m_idx == rhs.m_idx && m_hash == rhs.m_hash; + } + bool operator!=(const typename Hash_set::iterator &rhs) { + return m_idx != rhs.m_idx || m_hash != rhs.m_hash; + } + + private: + const HASH *m_hash; + uint m_idx; + }; + + private: + HASH m_hash; +}; + +#endif // SQL_HSET_INCLUDED diff --git a/include/vidx/sql_queue.h b/include/vidx/sql_queue.h new file mode 100644 index 00000000000..c980235da5a --- /dev/null +++ b/include/vidx/sql_queue.h @@ -0,0 +1,87 @@ +/* + Copyright (c) 2011, 2021, Oracle and/or its affiliates. All rights + reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License, version 2.0, + as published by the Free Software Foundation. + + This program is also distributed with certain software (including + but not limited to OpenSSL) that is licensed under separate terms, + as designated in a particular file or component or in included license + documentation. The authors of MySQL hereby grant you an additional + permission to link the program and your derivative works with the + separately licensed software that they have included with MySQL. + + 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, version 2.0, for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + 02110-1301 USA + */ + +#ifndef QUEUE_INCLUDED +#define QUEUE_INCLUDED + +#include "sql/psi_memory_key.h" // key_memory_vidx_mem +#include "storage/myisam/queues.h" + +#define set_if_bigger(a, b) \ + do { \ + if ((a) < (b)) (a) = (b); \ + } while (0) +#define set_if_smaller(a, b) \ + do { \ + if ((a) > (b)) (a) = (b); \ + } while (0) + +/* Attention, the QUEUE's elements in storage/myisam/queues.cc is started from +0 */ +#define queue_first_element(queue) 0 +#define queue_remove_top(queue_arg) \ + queue_remove((queue_arg), queue_first_element(queue_arg)) + +/** + A typesafe wrapper of QUEUE, a priority heap +*/ +template +class Queue { + public: + Queue() { m_queue.root = 0; } + ~Queue() { delete_queue(&m_queue); } + int init(uint max_elements, bool max_at_top, queue_compare compare, + Param *param = 0) { + return init_queue(&m_queue, key_memory_vidx_mem, max_elements, 0, + max_at_top, compare, (void *)param); + } + + size_t elements() const { return m_queue.elements; } + bool is_inited() const { return is_queue_inited(&m_queue); } + bool is_full() const { return queue_is_full((QUEUE *)(&m_queue)); } + bool is_empty() const { return elements() == 0; } + Element *top() const { return (Element *)queue_top(&m_queue); } + + void push(const Element *element) { + queue_insert(&m_queue, (uchar *)element); + } + void safe_push(const Element *element) { + if (is_full()) m_queue.elements--; // remove one of the furthest elements + queue_insert(&m_queue, (uchar *)element); + } + Element *pop() { return (Element *)queue_remove_top(&m_queue); } + void clear() { queue_remove_all(&m_queue); } + void propagate_top() { queue_replaced(&m_queue); } + void replace_top(const Element *element) { + queue_top(&m_queue) = (uchar *)element; + propagate_top(); + } + + private: + QUEUE m_queue; +}; + +#endif diff --git a/include/vidx/vidx_common.h b/include/vidx/vidx_common.h new file mode 100644 index 00000000000..5855c403d85 --- /dev/null +++ b/include/vidx/vidx_common.h @@ -0,0 +1,71 @@ +#ifndef VIDX_COMMON_INCLUDED +#define VIDX_COMMON_INCLUDED + +/* Copyright (c) 2025, 2025, Alibaba and/or its affiliates. All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License, version 2.0, + as published by the Free Software Foundation. + + This program is also distributed with certain software (including + but not limited to OpenSSL) that is licensed under separate terms, + as designated in a particular file or component or in included license + documentation. The authors of MySQL hereby grant you an additional + permission to link the program and your derivative works with the + separately licensed software that they have included with MySQL. + + 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, version 2.0, for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include +#include +#include + +#include "my_inttypes.h" + +/* RDS comment version. The comment having version bigger than it should not be +treated as comment. */ +#define RDS_COMMENT_VERSION 99999 + +#define RDS_COMMENT_VIDX_START "/*!99999 " +#define RDS_COMMENT_VIDX_END " */" + +namespace vidx { +static constexpr uint32_t MAX_DIMENSIONS = 16383; +static constexpr uint32_t VECTOR_PRECISION = sizeof(float); + +static const char *distance_names[] = {"EUCLIDEAN", "COSINE", nullptr}; +static constexpr uint METRIC_DEF = 0; +static constexpr uint METRIC_MAX = + sizeof(distance_names) / sizeof(distance_names[0]) - 1; + +namespace hnsw { +static constexpr uint M_DEF = 6; +static constexpr uint M_MAX = 200; +static constexpr uint M_MIN = 3; + +static inline bool validate_index_option_m(const uint option) { + return option <= M_MAX && option >= M_MIN; +} +} // namespace hnsw + +static inline bool validate_index_option_distance(const uint option) { + return option <= METRIC_MAX; +} + +static inline uint32_t get_dimensions_low(const uint32_t length, + const uint32_t precision) { + if (length % precision > 0) { + return UINT_MAX32; + } + return length / precision; +} +} // namespace vidx + +#endif /* VIDX_COMMON_INCLUDED */ diff --git a/include/vidx/vidx_field.h b/include/vidx/vidx_field.h new file mode 100644 index 00000000000..78530bc2f0c --- /dev/null +++ b/include/vidx/vidx_field.h @@ -0,0 +1,77 @@ +#ifndef VIDX_FIELD_INCLUDED +#define VIDX_FIELD_INCLUDED + +/* Copyright (c) 2025, 2025, Alibaba and/or its affiliates. All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License, version 2.0, + as published by the Free Software Foundation. + + This program is also distributed with certain software (including + but not limited to OpenSSL) that is licensed under separate terms, + as designated in a particular file or component or in included license + documentation. The authors of MySQL hereby grant you an additional + permission to link the program and your derivative works with the + separately licensed software that they have included with MySQL. + + 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, version 2.0, for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "sql/field.h" +#include "vidx/vidx_common.h" + +namespace vidx { +class Field_vector : public Field_varstring { + public: + static uint32 dimension_bytes(uint32 dimensions) { + return VECTOR_PRECISION * dimensions; + } + + Field_vector(uchar *ptr_arg, uint32 len_arg, uint length_bytes_arg, + uchar *null_ptr_arg, uchar null_bit_arg, uchar auto_flags_arg, + const char *field_name_arg, TABLE_SHARE *share) + : Field_varstring(ptr_arg, len_arg, length_bytes_arg, null_ptr_arg, + null_bit_arg, auto_flags_arg, field_name_arg, share, + &my_charset_bin) {} + + Field_vector(uint32 len_arg, bool is_nullable_arg, const char *field_name_arg, + TABLE_SHARE *share) + : Field_varstring(len_arg, is_nullable_arg, field_name_arg, share, + &my_charset_bin) {} + + Field_vector(const Field_vector &field) : Field_varstring(field) {} + + uint32 get_dimensions() const; + + void sql_type(String &res) const final { + const CHARSET_INFO *cs = res.charset(); + size_t length = cs->cset->snprintf( + cs, res.ptr(), res.alloced_length(), + RDS_COMMENT_VIDX_START "vector(%u)" RDS_COMMENT_VIDX_END + " varbinary(%u)", + get_dimensions(), VECTOR_PRECISION * get_dimensions()); + res.length(length); + } + Field_vector *clone(MEM_ROOT *mem_root) const final { + assert(type() == MYSQL_TYPE_VARCHAR); + return new (mem_root) Field_vector(*this); + } + using Field_varstring::store; + type_conversion_status store(double nr) final; + type_conversion_status store(longlong nr, bool unsigned_val) final; + type_conversion_status store_decimal(const my_decimal *) final; + type_conversion_status store(const char *from, size_t length, + const CHARSET_INFO *cs) final; + uint is_equal(const Create_field *new_field) const final; + String *val_str(String *, String *) const final; + bool is_vector() const final { return true; } +}; +} // namespace vidx + +#endif /* VIDX_FIELD_INCLUDED */ diff --git a/include/vidx/vidx_func.h b/include/vidx/vidx_func.h new file mode 100644 index 00000000000..e5ac9625ef5 --- /dev/null +++ b/include/vidx/vidx_func.h @@ -0,0 +1,132 @@ +#ifndef VIDX_FUNC_INCLUDED +#define VIDX_FUNC_INCLUDED + +/* Copyright (c) 2025, 2025, Alibaba and/or its affiliates. All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License, version 2.0, + as published by the Free Software Foundation. + + This program is also distributed with certain software (including + but not limited to OpenSSL) that is licensed under separate terms, + as designated in a particular file or component or in included license + documentation. The authors of MySQL hereby grant you an additional + permission to link the program and your derivative works with the + separately licensed software that they have included with MySQL. + + 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, version 2.0, for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "vidx/vidx_common.h" + +class ORDER; + +namespace vidx { +enum distance_kind { EUCLIDEAN, COSINE, AUTO }; + +class Item_func_vec_distance : public Item_real_func { + public: + Item_func_vec_distance(const POS &pos, Item *a, Item *b) + : Item_real_func(pos, a, b), kind(AUTO) {} + + Item_func_vec_distance(const POS &pos, Item *a, Item *b, distance_kind c) + : Item_real_func(pos, a, b), kind(c) {} + + const char *func_name() const override { + static LEX_CSTRING name[3] = {{STRING_WITH_LEN("VEC_DISTANCE_EUCLIDEAN")}, + {STRING_WITH_LEN("VEC_DISTANCE_COSINE")}, + {STRING_WITH_LEN("VEC_DISTANCE")}}; + return name[kind].str; + } + + bool resolve_type(THD *thd) override; + int get_key(); + double val_real() override; + enum Functype functype() const override { return VECTOR_DISTANCE_FUNC; } + ha_rows get_limit() const { return m_limit; } + void set_limit(const ha_rows &limit) { m_limit = limit; } + Item *get_const_arg() const { return const_arg; } + + private: + bool check_args(); + + distance_kind kind; + double (*calc_distance_func)(float *v1, float *v2, size_t v_len); + ha_rows m_limit = 0; + Item_field *field_arg = nullptr; + Item *const_arg = nullptr; +}; + +class Item_func_vec_distance_euclidean final : public Item_func_vec_distance { + public: + Item_func_vec_distance_euclidean(const POS &pos, Item *a, Item *b) + : Item_func_vec_distance(pos, a, b, distance_kind::EUCLIDEAN) {} +}; + +class Item_func_vec_distance_cosine final : public Item_func_vec_distance { + public: + Item_func_vec_distance_cosine(const POS &pos, Item *a, Item *b) + : Item_func_vec_distance(pos, a, b, distance_kind::COSINE) {} +}; + +class Item_func_vec_fromtext final : public Item_str_func { + String buffer; + + public: + Item_func_vec_fromtext(const POS &pos, Item *a) : Item_str_func(pos, a) {} + bool resolve_type(THD *thd) override; + const char *func_name() const override { return "VEC_FromText"; } + String *val_str(String *str) override; +}; + +class Item_func_vec_totext final : public Item_str_func { + static const uint32_t per_value_chars = 16; + static const uint32_t max_output_bytes = + (MAX_DIMENSIONS * Item_func_vec_totext::per_value_chars); + String buffer; + + public: + Item_func_vec_totext(const POS &pos, Item *a) : Item_str_func(pos, a) { + collation.set(&my_charset_utf8mb4_0900_bin); + } + bool resolve_type(THD *thd) override; + const char *func_name() const override { return "VEC_ToText"; } + String *val_str(String *str) override; +}; + +class Item_func_vector_dim : public Item_int_func { + String value; + + public: + Item_func_vector_dim(const POS &pos, Item *a) : Item_int_func(pos, a) {} + longlong val_int() override; + const char *func_name() const override { return "vector_dim"; } + bool resolve_type(THD *thd) override { + if (param_type_is_default(thd, 0, 1, MYSQL_TYPE_VARCHAR)) { + return true; + } + bool valid_type = (args[0]->data_type() == MYSQL_TYPE_VARCHAR) || + (args[0]->result_type() == STRING_RESULT && + args[0]->collation.collation == &my_charset_bin); + if (!valid_type) { + my_error(ER_WRONG_ARGUMENTS, MYF(0), func_name()); + return true; + } + max_length = 10; + return false; + } +}; + +static inline bool check_item_func_vec_distance(const Item *item) { + return item->type() == Item::FUNC_ITEM && + ((Item_func *)item)->functype() == Item_func::VECTOR_DISTANCE_FUNC; +} +} // namespace vidx + +#endif /* VIDX_FUNC_INCLUDED */ diff --git a/include/vidx/vidx_hnsw.h b/include/vidx/vidx_hnsw.h new file mode 100644 index 00000000000..bba5bdd1668 --- /dev/null +++ b/include/vidx/vidx_hnsw.h @@ -0,0 +1,56 @@ +#ifndef VIDX_HNSW_INCLUDED +#define VIDX_HNSW_INCLUDED + +/* Copyright (c) 2025, 2025, Alibaba and/or its affiliates. All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License, version 2.0, + as published by the Free Software Foundation. + + This program is also distributed with certain software (including + but not limited to OpenSSL) that is licensed under separate terms, + as designated in a particular file or component or in included license + documentation. The authors of MySQL hereby grant you an additional + permission to link the program and your derivative works with the + separately licensed software that they have included with MySQL. + + 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, version 2.0, for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +class THD; +class KEY; +struct TABLE; + +namespace dd { +class Table; +} // namespace dd + +namespace vidx { +namespace hnsw { +static constexpr uint32_t DEF_CACHE_SIZE = 16 * 1024 * 1024; +static constexpr uint max_ef = 10000; + +extern ulonglong max_cache_size; +extern void *trx_handler; + +std::unique_ptr create_dd_table(THD *thd, const char *table_name, + KEY *key, dd::Table *dd_table, + TABLE *table, const char *db_name, + const uint tref_len); +int mhnsw_insert(TABLE *table, KEY *keyinfo); +int mhnsw_read_first(TABLE *table, KEY *keyinfo, Item *dist); +int mhnsw_read_next(TABLE *table); +int mhnsw_read_end(TABLE *table); +int mhnsw_invalidate(TABLE *table, const uchar *rec, KEY *keyinfo); +int mhnsw_delete_all(TABLE *table, KEY *keyinfo); +void mhnsw_free(TABLE_SHARE *share); +} // namespace hnsw +} // namespace vidx + +#endif /* VIDX_HNSW_INCLUDED */ diff --git a/include/vidx/vidx_index.h b/include/vidx/vidx_index.h new file mode 100644 index 00000000000..0e8de4789e8 --- /dev/null +++ b/include/vidx/vidx_index.h @@ -0,0 +1,145 @@ +#ifndef VIDX_INDEX_INCLUDED +#define VIDX_INDEX_INCLUDED + +/* Copyright (c) 2025, 2025, Alibaba and/or its affiliates. All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License, version 2.0, + as published by the Free Software Foundation. + + This program is also distributed with certain software (including + but not limited to OpenSSL) that is licensed under separate terms, + as designated in a particular file or component or in included license + documentation. The authors of MySQL hereby grant you an additional + permission to link the program and your derivative works with the + separately licensed software that they have included with MySQL. + + 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, version 2.0, for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "my_inttypes.h" // uintxx_t +#include "sql/dd/properties.h" // dd::Properties +#include "sql/dd/types/table.h" // dd::Table +#include "sql/key.h" // KEY + +#include "vidx/vidx_common.h" + +class THD; +struct TABLE; +struct handlerton; +struct TABLE_SHARE; +struct st_plugin_int; +class JOIN_TAB; +class ORDER; +class Alter_info; + +namespace dd { +class Schema; +} // namespace dd + +namespace vidx { +constexpr uint32_t DATA_ROW_ID_LEN = 6; + +class Item_func_vec_distance; + +extern st_plugin_int *vidx_plugin; +extern bool feature_disabled; + +bool check_vector_ddl_and_rewrite_sql(THD *thd, Alter_info *alter_info, + KEY *key_info, const uint key_count, + TABLE *table); + +namespace hnsw { +uint index_options_print(const uint distance, const uint m, char *buf, + uint buf_len); + +bool copy_index_option_m(THD *thd, uint *to, const uint from); +} // namespace hnsw + +bool copy_index_option_distance(THD *thd, uint *to, const uint from); + +/* Create the auxiliary table for the vector index. +@param[in] thd Thread context. +@param[in] key The vector key. +@param[in] dd_table The dd table object describing the base table. +@param[in] table The base table +@param[in] db_name The DB name. +@param[in] old_table_id The old table id before truncate, or + dd::INVALID_OBJECT_ID if new create. +@return true if failed. */ +bool create_table(THD *thd, KEY *key, dd::Table *dd_table, TABLE *table, + const char *db_name, const uint64_t old_table_id); + +/* Drop the auxiliary table for the vector index. +@param[in] thd Thread context. +@param[in] dd_table The dd table object describing the base table. +@param[in] db_name The DB name. +@return true if failed. */ +bool delete_table(THD *thd, const dd::Table *dd_table, const char *db_name); + +/* Rename the auxiliary table for the vector index. +@param[in] thd Thread context. +@param[in] dd_table The dd table object describing the base table. +@param[in] base The base handlerton. +@param[in] new_schema The dd schema object. +@param[in] old_db The old DB name before rename. +@param[in] new_db The new DB name after rename. +@param[in] flags flags. See also mysql_rename_table(). +@return true if failed. */ +bool rename_table(THD *thd, dd::Table *dd_table, handlerton *base, + const dd::Schema &new_schema, const char *old_db, + const char *new_db, uint flags); + +/* Build the info of vector key. +@param[in] thd Thread context. +@param[in] share The table share. +@param[in] dd_table The dd table object describing the base table. +@param[in] nr The number of the vector key. +@return true if failed. */ +bool build_hlindex_key(THD *thd, TABLE_SHARE *share, const dd::Table *dd_table, + const uint nr); + +/* Test if ORDER BY is a single distance function(ORDER BY VEC_DISTANCE), +sort order is descending, and vector index is more efficient than original +access path. +@param[in] tab JOIN_TAB to check +@param[in] order pointer to ORDER struct. +@param[in] limit maximum number of rows to select. +@param[out] order_idx idx choosen. +@return True if vector index is enabled and efficient, otherwise False. */ +bool test_if_cheaper_vector_ordering(JOIN_TAB *tab, ORDER *order, ha_rows limit, + int *order_idx); + +/* Check if the key is a vector key. +@param[in] key The vector key. +@return true if the key is a vector key. */ +static inline bool key_is_vector(KEY *key) { + return key != nullptr && (key->flags & HA_VECTOR); +} + +/* Check the option "__hlindexes__" of the dd table exists and is not empty. +@param[in] dd_table The dd table. +@return true if "__hlindexes__" exists and is not empty, otherwise false. */ +static inline bool dd_table_has_hlindexes(const dd::Table *dd_table) { + return dd_table->options().exists("__hlindexes__"); +} + +/* Check if the dd table is a vector table. +@param[in] dd_table The dd table. +@return true if the dd table is a vector table, otherwise false. */ +static inline bool dd_table_is_hlindex(const dd::Table *dd_table) { + assert(dd_table->options().exists("__vector_column__") == + dd_table->options().exists("__vector_m__")); + assert(dd_table->options().exists("__vector_column__") == + dd_table->options().exists("__vector_distance__")); + return dd_table->options().exists("__vector_column__"); +} +} // namespace vidx + +#endif /* VIDX_INDEX_INCLUDED */ diff --git a/mysql-test/r/comments.result b/mysql-test/r/comments.result index 8e0904709ec..17bce93040f 100644 --- a/mysql-test/r/comments.result +++ b/mysql-test/r/comments.result @@ -10,11 +10,9 @@ ERROR 42000: Query was empty select 1 /*!32301 +1 */; 1 +1 2 -select 1 /*!999999 +1 */; +select 1 /*!99998 +1 */; 1 1 -Warnings: -Warning 4164 Immediately starting the version comment after the version number is deprecated and may change behavior in a future release. Please insert a white-space character after the version number. select 1--1; 1--1 2 @@ -32,12 +30,12 @@ select 1/*!2*/; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2*/' at line 1 select 1/*!000002*/; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2*/' at line 1 -select 1/*!999992*/; +select 1/*!99992*/; 1 1 Warnings: Warning 4164 Immediately starting the version comment after the version number is deprecated and may change behavior in a future release. Please insert a white-space character after the version number. -select 1 + /*!00000 2 */ + 3 /*!99999 noise*/ + 4; +select 1 + /*!00000 2 */ + 3 /*!99998 noise*/ + 4; 1 + 2 + 3 + 4 10 drop table if exists table_28779; @@ -58,7 +56,7 @@ drop table table_28779; # # WL#12099: Deprecate nested comments in 8.0 # -SELECT 1 /*!99999 /* */ */; +SELECT 1 /*!99998 /* */ */; 1 1 Warnings: @@ -91,6 +89,7 @@ DO 1 /*!80034 +1*/; # Form feed (0x0c). Should pass without warning. DO 1 /*!80034 +1*/; # Carriage return (0x0d). Should pass without warning. -DO 1 /*!80034 +1*/; +DO 1 /*!80034 ++1*/; # Space (0x20). Should pass without warning. DO 1 /*!80034 +1*/; diff --git a/mysql-test/r/derived_condition_pushdown.result b/mysql-test/r/derived_condition_pushdown.result index e978151b295..c30fd2b2671 100644 --- a/mysql-test/r/derived_condition_pushdown.result +++ b/mysql-test/r/derived_condition_pushdown.result @@ -249,7 +249,7 @@ FROM (SELECT f1 as i, f2 as j FROM t1 ) as dt1 , (SELECT f1 as l, f2 as m, f3 as n FROM t1) as dt2 WHERE i > 1 and i+j > 40 and m < 20 and m+i > 20; EXPLAIN --> Filter: ((dt2.m + dt1.i) > 20) (rows=24) +-> Filter: ((dt2.`m` + dt1.i) > 20) (rows=24) -> Inner hash join (no condition) (rows=24) -> Table scan on dt1 (rows=6) -> Materialize (rows=6) diff --git a/mysql-test/r/information_schema_keywords.result b/mysql-test/r/information_schema_keywords.result index 74ba19d332c..27e3e00fd2e 100644 --- a/mysql-test/r/information_schema_keywords.result +++ b/mysql-test/r/information_schema_keywords.result @@ -99,6 +99,7 @@ CONTAINS 0 CONTEXT 0 CONTINUE 1 CONVERT 1 +COSINE 0 CPU 0 CREATE 1 CROSS 1 @@ -143,6 +144,7 @@ DIRECTORY 0 DISABLE 0 DISCARD 0 DISK 0 +DISTANCE 0 DISTINCT 1 DISTINCTROW 1 DIV 1 @@ -171,6 +173,7 @@ ERROR 0 ERRORS 0 ESCAPE 0 ESCAPED 1 +EUCLIDEAN 0 EVENT 0 EVENTS 0 EVERY 0 @@ -328,6 +331,7 @@ LONGBLOB 1 LONGTEXT 1 LOOP 1 LOW_PRIORITY 1 +M 0 MASTER 0 MASTER_AUTO_POSITION 0 MASTER_BIND 1 @@ -730,6 +734,7 @@ VARCHARACTER 1 VARIABLES 0 VARYING 1 VCPU 0 +VECTOR 1 VIEW 0 VIRTUAL 1 VISIBLE 0 diff --git a/mysql-test/r/no_binlog_gtid_empty_statement.result b/mysql-test/r/no_binlog_gtid_empty_statement.result index fe73164143f..cba023da268 100644 --- a/mysql-test/r/no_binlog_gtid_empty_statement.result +++ b/mysql-test/r/no_binlog_gtid_empty_statement.result @@ -1,10 +1,10 @@ USE test; SET GTID_NEXT= '#'; CREATE TABLE t1 (c1 INT); -/*!99999 SET @@SESSION.non_supported_session_variable = 1*/; +/*!99998 SET @@SESSION.non_supported_session_variable = 1*/; SET GTID_NEXT= '#'; INSERT INTO t1 VALUES (1); -/*!99999 SET @@SESSION.non_supported_session_variable = 1*/; +/*!99998 SET @@SESSION.non_supported_session_variable = 1*/; SET GTID_NEXT= '#'; DROP TABLE t1; include/rpl_set_gtid_mode.inc [ON on servers 1] @@ -12,10 +12,10 @@ SET GTID_NEXT='AUTOMATIC'; RESET MASTER; SET GTID_NEXT= '#'; CREATE TABLE t2 (c1 INT); -/*!99999 SET @@SESSION.non_supported_session_variable = 1*/; +/*!99998 SET @@SESSION.non_supported_session_variable = 1*/; SET GTID_NEXT= '#'; INSERT INTO t2 VALUES (1); -/*!99999 SET @@SESSION.non_supported_session_variable = 1*/; +/*!99998 SET @@SESSION.non_supported_session_variable = 1*/; SET GTID_NEXT= '#'; DROP TABLE t2; SET GTID_NEXT='AUTOMATIC'; diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index a7e413ef53c..6efc0e98ab6 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -6241,14 +6241,14 @@ select 1; /*! select 2; */ select 3; /*!00000 select 4; */ -/*!99999 select 5; */ +/*!99998 select 5; */ end $$ create procedure proc_25411_b( /* real comment */ /*! p1 int, */ /*!00000 p2 int */ -/*!99999 ,p3 int */ +/*!99998 ,p3 int */ ) begin select p1, p2; @@ -6256,11 +6256,11 @@ end $$ create procedure proc_25411_c() begin -select 1/*!,2*//*!00000,3*//*!99999,4*/; -select 1/*! ,2*//*!00000 ,3*//*!99999 ,4*/; -select 1/*!,2 *//*!00000,3 *//*!99999,4 */; -select 1/*! ,2 *//*!00000 ,3 *//*!99999 ,4 */; -select 1 /*!,2*/ /*!00000,3*/ /*!99999,4*/ ; +select 1/*!,2*//*!00000,3*//*!99998,4*/; +select 1/*! ,2*//*!00000 ,3*//*!99998 ,4*/; +select 1/*!,2 *//*!00000,3 *//*!99998,4 */; +select 1/*! ,2 *//*!00000 ,3 *//*!99998 ,4 */; +select 1 /*!,2*/ /*!00000,3*/ /*!99998,4*/ ; end $$ Warnings: diff --git a/mysql-test/suite/binlog/r/binlog_rewrite.result b/mysql-test/suite/binlog/r/binlog_rewrite.result index 612c2a4d3ea..e526d1721ea 100644 --- a/mysql-test/suite/binlog/r/binlog_rewrite.result +++ b/mysql-test/suite/binlog/r/binlog_rewrite.result @@ -19,7 +19,7 @@ GRANT EXECUTE ON PROCEDURE p1 /*before to*/TO/*after to*/ user1@localhost, user2 GRANT EXECUTE ON PROCEDURE p1 TO user1@localhost, user2@localhost; REVOKE EXECUTE ON PROCEDURE p1 FROM user1@localhost, user2@localhost; CREATE FUNCTION f1() RETURNS INT RETURN 123; -GRANT EXECUTE ON FUNCTION f1 /*before to*/TO/*after to*/ user1@localhost/*!10000 , user2@localhost*/ /*!99999 THIS_WOULD_BREAK */; +GRANT EXECUTE ON FUNCTION f1 /*before to*/TO/*after to*/ user1@localhost/*!10000 , user2@localhost*/ /*!99998 THIS_WOULD_BREAK */; REVOKE EXECUTE ON FUNCTION f1 FROM user1@localhost, user2@localhost; DROP USER user1@localhost, user2@localhost; DROP FUNCTION f1; diff --git a/mysql-test/suite/binlog/t/binlog_rewrite.test b/mysql-test/suite/binlog/t/binlog_rewrite.test index 62534fbd1ef..cc6739e647a 100644 --- a/mysql-test/suite/binlog/t/binlog_rewrite.test +++ b/mysql-test/suite/binlog/t/binlog_rewrite.test @@ -40,7 +40,7 @@ GRANT EXECUTE ON PROCEDURE p1 TO user1@localhost, user2@localhost; REVOKE EXECUTE ON PROCEDURE p1 FROM user1@localhost, user2@localhost; CREATE FUNCTION f1() RETURNS INT RETURN 123; -GRANT EXECUTE ON FUNCTION f1 /*before to*/TO/*after to*/ user1@localhost/*!10000 , user2@localhost*/ /*!99999 THIS_WOULD_BREAK */; +GRANT EXECUTE ON FUNCTION f1 /*before to*/TO/*after to*/ user1@localhost/*!10000 , user2@localhost*/ /*!99998 THIS_WOULD_BREAK */; REVOKE EXECUTE ON FUNCTION f1 FROM user1@localhost, user2@localhost; DROP USER user1@localhost, user2@localhost; diff --git a/mysql-test/suite/component_keyring_file/r/database.result b/mysql-test/suite/component_keyring_file/r/database.result index 544ccfeba68..1f119c11d3b 100644 --- a/mysql-test/suite/component_keyring_file/r/database.result +++ b/mysql-test/suite/component_keyring_file/r/database.result @@ -449,7 +449,7 @@ DROP DATABASE db1; CREATE DATABASE `db1` /*!99999 DEFAULT ENCRYPTION='Y' */; SHOW CREATE DATABASE db1; Database Create Database -db1 CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ +db1 CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='Y' */ DROP DATABASE db1; ````````````````````````````````````````````````````````` # ALTER DATABASE withDEFAULT ENCRYPTION clause 'y/n' diff --git a/mysql-test/suite/encryption/r/database.result b/mysql-test/suite/encryption/r/database.result index fa51b1b8c30..64cc2ac14ce 100644 --- a/mysql-test/suite/encryption/r/database.result +++ b/mysql-test/suite/encryption/r/database.result @@ -440,7 +440,7 @@ db1 CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4 DROP DATABASE db1; ````````````````````````````````````````````````````````` # See that we ignore the clause with invalid mysql version. -CREATE DATABASE `db1` /*!99999 DEFAULT ENCRYPTION='Y' */; +CREATE DATABASE `db1` /*!99998 DEFAULT ENCRYPTION='Y' */; SHOW CREATE DATABASE db1; Database Create Database db1 CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ diff --git a/mysql-test/suite/encryption/t/database.test b/mysql-test/suite/encryption/t/database.test index 462fac399a4..3efaa2bec5f 100644 --- a/mysql-test/suite/encryption/t/database.test +++ b/mysql-test/suite/encryption/t/database.test @@ -137,7 +137,7 @@ SHOW CREATE DATABASE db1; DROP DATABASE db1; --echo ````````````````````````````````````````````````````````` --echo # See that we ignore the clause with invalid mysql version. -CREATE DATABASE `db1` /*!99999 DEFAULT ENCRYPTION='Y' */; +CREATE DATABASE `db1` /*!99998 DEFAULT ENCRYPTION='Y' */; SHOW CREATE DATABASE db1; DROP DATABASE db1; diff --git a/mysql-test/suite/information_schema/r/i_s_schema_definition_debug.result b/mysql-test/suite/information_schema/r/i_s_schema_definition_debug.result index deea8ee5e32..09eb2924848 100644 --- a/mysql-test/suite/information_schema/r/i_s_schema_definition_debug.result +++ b/mysql-test/suite/information_schema/r/i_s_schema_definition_debug.result @@ -209,7 +209,7 @@ CREATE OR REPLACE DEFINER=`mysql.infoschema`@`localhost` VIEW information_schema col.ordinal_position AS ORDINAL_POSITION, col.default_value_utf8 AS COLUMN_DEFAULT, IF (col.is_nullable = 1, 'YES','NO') AS IS_NULLABLE, - SUBSTRING_INDEX(SUBSTRING_INDEX(col.column_type_utf8, '(', 1),' ', 1) AS DATA_TYPE, + SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(col.column_type_utf8, '*/ ', -1), '(', 1),' ', 1) AS DATA_TYPE, INTERNAL_DD_CHAR_LENGTH(col.type, col.char_length, coll.name, 0) AS CHARACTER_MAXIMUM_LENGTH, INTERNAL_DD_CHAR_LENGTH(col.type, col.char_length, coll.name, 1) AS CHARACTER_OCTET_LENGTH, IF (col.numeric_precision = 0, NULL, col.numeric_precision) AS NUMERIC_PRECISION, @@ -242,7 +242,7 @@ INSERT INTO I_S_check_table(t) VALUES ("CREATE OR REPLACE DEFINER=`mysql.infosch col.ordinal_position AS ORDINAL_POSITION, col.default_value_utf8 AS COLUMN_DEFAULT, IF (col.is_nullable = 1, 'YES','NO') AS IS_NULLABLE, - SUBSTRING_INDEX(SUBSTRING_INDEX(col.column_type_utf8, '(', 1),' ', 1) AS DATA_TYPE, + SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(col.column_type_utf8, '*/ ', -1), '(', 1),' ', 1) AS DATA_TYPE, INTERNAL_DD_CHAR_LENGTH(col.type, col.char_length, coll.name, 0) AS CHARACTER_MAXIMUM_LENGTH, INTERNAL_DD_CHAR_LENGTH(col.type, col.char_length, coll.name, 1) AS CHARACTER_OCTET_LENGTH, IF (col.numeric_precision = 0, NULL, col.numeric_precision) AS NUMERIC_PRECISION, diff --git a/mysql-test/suite/rds/r/vidx_column.result b/mysql-test/suite/rds/r/vidx_column.result new file mode 100644 index 00000000000..d822cb1fced --- /dev/null +++ b/mysql-test/suite/rds/r/vidx_column.result @@ -0,0 +1,188 @@ +# 1. KEYWORDs +# Word vector is not able to be the name, while words m, distance, +# euclidean, cosine is still able. +CREATE TABLE t1 ( +vector int +); +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'int +)' at line 2 +CREATE TABLE t1 ( +m int, +distance int, +euclidean int, +cosine int +); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `m` int DEFAULT NULL, + `distance` int DEFAULT NULL, + `euclidean` int DEFAULT NULL, + `cosine` int DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +DROP TABLE t1; + +# 2. NONSUPPORT about VECTOR COLUMN +# The variable vidx_disabled will forbid to create VECTOR column +SET GLOBAL vidx_disabled = ON; +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(16382) +); +ERROR HY000: Creating vector columns or indexes is disabled. +SET GLOBAL vidx_disabled = OFF; +# The range of the dimension of VECTOR columns is limited by row size +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(16383) +); +ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs +# The dimension of VECTOR column must be set explicitly +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR +); +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 4 +# The dimension of VECTOR column must be set by number not string +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR("kkk") +); +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"kkk") +)' at line 3 + +# 3. SUPPORT about VECTOR COLUMN +# The range of the dimension of VECTOR columns is limited by row size +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(16382) +); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int NOT NULL AUTO_INCREMENT, + `v` /*!99999 vector(16382) */ varbinary(65528) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +DROP TABLE t1; +# The dimension of VECTOR column can be 0 +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(0) +); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int NOT NULL AUTO_INCREMENT, + `v` /*!99999 vector(0) */ varbinary(0) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +DROP TABLE t1; +# Set Decimal as the VECTOR dimension will be corrected as the integer +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(10.1) +); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int NOT NULL AUTO_INCREMENT, + `v` /*!99999 vector(10) */ varbinary(40) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +DROP TABLE t1; +# The VECTOR field can be used in routines. +CREATE PROCEDURE vector_distance(v1 VECTOR(5), v2 VECTOR(5)) +BEGIN +SELECT VEC_DISTANCE_EUCLIDEAN(v1, v2); +END$$ +CREATE FUNCTION str2vector(in_str TEXT) RETURNS VECTOR(5) +BEGIN +RETURN VEC_FROMTEXT(in_str); +END$$ +CALL vector_distance(VEC_FROMTEXT('[1,2,3,4,5]'), VEC_FROMTEXT('[1,2,3,4,5]')); +VEC_DISTANCE_EUCLIDEAN(v1, v2) +0 +SELECT VEC_TOTEXT(str2vector('[1,2,3,4,5]')); +VEC_TOTEXT(str2vector('[1,2,3,4,5]')) +[1,2,3,4,5] +DROP PROCEDURE vector_distance; +DROP FUNCTION str2vector; + +# 4. DML about VECTOR COLUMN +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5) +); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int NOT NULL AUTO_INCREMENT, + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +SET transaction_isolation = 'READ-COMMITTED'; +# NULL is allowed if column is nullable +INSERT INTO t1(v) VALUES (NULL); +# other types except string is not allowed +INSERT INTO t1(v) VALUES (1); +ERROR HY000: Value of type 'longlong, size: 8' cannot be converted to 'vector(5)' type. +INSERT INTO t1(v) VALUES (1.1); +# Vector with different dimension is not allowed, including empty vector +INSERT INTO t1(v) VALUES (""); +ERROR HY000: Incorrect vector value: '' for column 'v' at row 1 +INSERT INTO t1(v) VALUES (x'e360d63ebe554f3fcdbc523f4522193f523608'); +ERROR HY000: Value of type 'string, size: 19' cannot be converted to 'vector(5)' type. +INSERT INTO t1(v) VALUES (x'e360d63ebe554f3fcdbc523f4522193f5236083d3d3d'); +ERROR HY000: Value of type 'string, size: 22' cannot be converted to 'vector(5)' type. +# string is allowed, but warning if charset is not binary and sql_mode=strict +SET sql_mode="STRICT_TRANS_TABLES"; +Warnings: +Warning 3135 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release. +INSERT INTO t1(v) VALUES ("===================="); +ERROR HY000: Incorrect vector value: '====================' for column 'v' at row 1 +SET sql_mode=""; +INSERT INTO t1(v) VALUES ("===================="); +Warnings: +Warning 1366 Incorrect vector value: '====================' for column 'v' at row 1 +# HEX string is allowed +INSERT INTO t1(v) VALUES (x'e360d63ebe554f3fcdbc523f4522193f5236083d'); +SELECT VEC_TOTEXT(v) FROM t1; +VEC_TOTEXT(v) +NULL +[0.046201,0.046201,0.046201,0.046201,0.046201] +[0.418708,0.809902,0.823193,0.598179,0.0332549] +# Vector column can be the part of normal index +CREATE INDEX i1 ON t1(v, id); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int NOT NULL AUTO_INCREMENT, + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `i1` (`v`,`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +SELECT VEC_TOTEXT(v) FROM t1 FORCE INDEX(i1); +VEC_TOTEXT(v) +NULL +[0.046201,0.046201,0.046201,0.046201,0.046201] +[0.418708,0.809902,0.823193,0.598179,0.0332549] +# Vector column can build a prefix index. Number means the prefix +# dimension rather than the prefix length. +CREATE INDEX i2 ON t1(v(2)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int NOT NULL AUTO_INCREMENT, + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `i1` (`v`,`id`), + KEY `i2` (`v`(2)) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +SELECT VEC_TOTEXT(v) FROM t1 FORCE INDEX(i2); +VEC_TOTEXT(v) +NULL +[0.046201,0.046201,0.046201,0.046201,0.046201] +[0.418708,0.809902,0.823193,0.598179,0.0332549] +DROP TABLE t1; +SET GLOBAL vidx_disabled = ON; diff --git a/mysql-test/suite/rds/r/vidx_ddl.result b/mysql-test/suite/rds/r/vidx_ddl.result new file mode 100644 index 00000000000..5d5efe71a1c --- /dev/null +++ b/mysql-test/suite/rds/r/vidx_ddl.result @@ -0,0 +1,310 @@ +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +SET transaction_isolation = 'READ-COMMITTED'; +SET GLOBAL vidx_disabled = OFF; +# 1. NONSUPPORT about VECTOR INDEX +# The variable vidx_disabled will forbid to create VECTOR index +SET GLOBAL vidx_disabled = ON; +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5), +VECTOR INDEX vi(v) +); +ERROR HY000: Creating vector columns or indexes is disabled. +SET GLOBAL vidx_disabled = OFF; +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5) +); +SET GLOBAL vidx_disabled = ON; +ALTER TABLE t1 ADD VECTOR INDEX vi(v); +ERROR HY000: Creating vector columns or indexes is disabled. +DROP TABLE t1; +SET GLOBAL vidx_disabled = OFF; +# Vector index is not supported for partitioned or temp tables. +CREATE TEMPORARY TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5), +VECTOR INDEX vi(v) +); +ERROR 42000: This version of MySQL doesn't yet support 'the VECTOR index in partitioned or temp tables' +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +c1 INT, +v VECTOR(5), +VECTOR INDEX vi(v) +)PARTITION BY HASH (c1) PARTITIONS 3; +ERROR 42000: This version of MySQL doesn't yet support 'the VECTOR index in partitioned or temp tables' +# Vector index can only be created on one VECTOR column not null +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5), +t VECTOR(5), +VECTOR INDEX vi(v,t) +); +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ',t) +)' at line 5 +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v INT NOT NULL, +VECTOR INDEX vi(v) +); +ERROR HY000: Incorrect usage of vector index: Only support one visible VECTOR column +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5), +VECTOR INDEX vi(v) +); +ALTER TABLE t1 MODIFY COLUMN v VECTOR(5) INVISIBLE; +ERROR HY000: Incorrect usage of vector index: Only support one visible VECTOR column +DROP TABLE t1; +# VECTOR INDEX can't be created on generate column +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v BLOB NOT NULL, +VECTOR INDEX vi(VEC_FROMTEXT(v)) +); +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(v)) +)' at line 4 +# VECTOR INDEX‘s options should be set in their range. m should be +# in [3,200]. distance should be in {euclidean, cosine} +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5), +VECTOR INDEX vi(v) m=2 +); +ERROR HY000: Incorrect usage of vector index: Invalid options. +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5), +VECTOR INDEX vi(v) m=201 +); +ERROR HY000: Incorrect usage of vector index: Invalid options. +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5), +VECTOR INDEX vi(v) distance=wrong +); +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'wrong +)' at line 4 +# VECTOR keys can not be prefix +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(768), +VECTOR INDEX vi(v(1)) +); +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(1)) +)' at line 4 +# VECTOR key's dimension must be greater than 0 +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(0), +VECTOR INDEX vi(v) +); +ERROR 42000: The used storage engine can't index column 'v' +# The range of the dimension of VECTOR keys is not limited by key size +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VARCHAR(3076), +INDEX vi(v) +); +ERROR 42000: Specified key was too long; max key length is 3072 bytes +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(769), +VECTOR INDEX vi(v) +); +DROP TABLE t1; +# Can't be invisible +CREATE TABLE t10 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5), +VECTOR INDEX vi(v) INVISIBLE +); +ERROR HY000: Incorrect usage of vector index: Must be visible. +# Don't support multi VECTOR indexes yet +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5), +VECTOR INDEX vi(v), +VECTOR INDEX vi2(v) +); +ERROR 42000: This version of MySQL doesn't yet support 'multiple VECTOR indexes' +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5), +VECTOR INDEX vi(v) +); +CREATE VECTOR INDEX vi2 ON t1(v); +ERROR 42000: This version of MySQL doesn't yet support 'multiple VECTOR indexes' +ALTER TABLE t1 ADD VECTOR INDEX vi2(v); +ERROR 42000: This version of MySQL doesn't yet support 'multiple VECTOR indexes' +DROP TABLE t1; + +# 2. Don't support inplace ddl yet +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5) +); +ALTER TABLE t1 ADD VECTOR INDEX vi(v), algorithm=instant; +ERROR 0A000: ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY/INPLACE. +ALTER TABLE t1 ADD VECTOR INDEX vi(v), algorithm=inplace; +ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITHM=COPY. +ALTER TABLE t1 ADD VECTOR INDEX vi(v); +ALTER TABLE t1 DROP INDEX vi, algorithm=instant; +ERROR 0A000: ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY/INPLACE. +ALTER TABLE t1 DROP INDEX vi, algorithm=inplace; +ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITHM=COPY. +ALTER TABLE t1 DROP INDEX vi; +DROP TABLE t1; + +# 3. DDL about VECTOR INDEX +# CREATE TABLE +CREATE DATABASE IF NOT EXISTS test2; +USE test2; +# VECTOR INDEX should be at the end of key list +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +text LONGTEXT NOT NULL, +meta JSON NOT NULL, +v VECTOR(5), +VECTOR INDEX vi(v) m=3 distance=euclidean +); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int NOT NULL AUTO_INCREMENT, + `text` longtext NOT NULL, + `meta` json NOT NULL, + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL, + PRIMARY KEY (`id`)/*!99999 , + VECTOR KEY `vi` (`v`) M=3 DISTANCE=EUCLIDEAN */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +ALTER TABLE t1 ADD INDEX i2(v); +CREATE INDEX idx_meta ON `t1` ((CAST(JSON_UNQUOTE(JSON_EXTRACT(meta, '$.document_id')) AS CHAR(36)))); +CREATE FULLTEXT INDEX idx_full_text ON `t1` (text); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int NOT NULL AUTO_INCREMENT, + `text` longtext NOT NULL, + `meta` json NOT NULL, + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `i2` (`v`), + KEY `idx_meta` ((cast(json_unquote(json_extract(`meta`,_utf8mb4'$.document_id')) as char(36) charset utf8mb4))), + FULLTEXT KEY `idx_full_text` (`text`)/*!99999 , + VECTOR KEY `vi` (`v`) M=3 DISTANCE=EUCLIDEAN */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +DROP TABLE t1; +# DROP VECTOR INDEX +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5), +VECTOR INDEX vi(v) m=3 distance=euclidean +); +INSERT INTO t1(v) SELECT VEC_FROMTEXT(CONCAT('[', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ']')); +DROP INDEX vi ON t1; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int NOT NULL AUTO_INCREMENT, + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +# CREATE VECTOR INDEX +CREATE VECTOR INDEX vi ON t1(v) m=200 distance=cosine; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int NOT NULL AUTO_INCREMENT, + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL, + PRIMARY KEY (`id`)/*!99999 , + VECTOR KEY `vi` (`v`) M=200 DISTANCE=COSINE */ +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +# ALTER TABLE DROP VECTOR INDEX +ALTER TABLE t1 DROP INDEX `vi`; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int NOT NULL AUTO_INCREMENT, + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +# ALTER TABLE ADD VECTOR INDEX +ALTER TABLE t1 ADD VECTOR INDEX vi(v) m=200 distance=cosine; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int NOT NULL AUTO_INCREMENT, + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL, + PRIMARY KEY (`id`)/*!99999 , + VECTOR KEY `vi` (`v`) M=200 DISTANCE=COSINE */ +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +# ALTER TABLE RENAME VECTOR INDEX +ALTER TABLE t1 RENAME INDEX `vi` TO `vi2`; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int NOT NULL AUTO_INCREMENT, + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL, + PRIMARY KEY (`id`)/*!99999 , + VECTOR KEY `vi2` (`v`) M=200 DISTANCE=COSINE */ +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +# OPTIMIZE TABLE +OPTIMIZE TABLE t1; +Table Op Msg_type Msg_text +test2.t1 optimize note Table does not support optimize, doing recreate + analyze instead +test2.t1 optimize status OK +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int NOT NULL AUTO_INCREMENT, + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL, + PRIMARY KEY (`id`)/*!99999 , + VECTOR KEY `vi2` (`v`) M=200 DISTANCE=COSINE */ +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +# TRUNCATE TABLE +TRUNCATE TABLE t1; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int NOT NULL AUTO_INCREMENT, + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL, + PRIMARY KEY (`id`)/*!99999 , + VECTOR KEY `vi2` (`v`) M=200 DISTANCE=COSINE */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +# RENAME TABLE +RENAME TABLE t1 TO t2; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int NOT NULL AUTO_INCREMENT, + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL, + PRIMARY KEY (`id`)/*!99999 , + VECTOR KEY `vi2` (`v`) M=200 DISTANCE=COSINE */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +CREATE TABLE t1 LIKE t2; +# DROP TABLE +DROP TABLE t2; +# DROP DATABASE +DROP DATABASE test2; +USE test; + +# 4. Vars about VECTOR INDEX +SET SESSION vidx_default_distance = 'cosine'; +SET SESSION vidx_hnsw_default_m = 155; +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5), +VECTOR INDEX vi(v) +); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int NOT NULL AUTO_INCREMENT, + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL, + PRIMARY KEY (`id`)/*!99999 , + VECTOR KEY `vi` (`v`) M=155 DISTANCE=COSINE */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +DROP TABLE t1; +SET GLOBAL vidx_disabled = ON; diff --git a/mysql-test/suite/rds/r/vidx_debug.result b/mysql-test/suite/rds/r/vidx_debug.result new file mode 100644 index 00000000000..4060f6716eb --- /dev/null +++ b/mysql-test/suite/rds/r/vidx_debug.result @@ -0,0 +1,218 @@ +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +CALL mtr.add_suppression("\\[ERROR\\].*Scanned file '.*' for tablespace .* cannot be opened because it is not in a sub-directory named for the schema"); +CALL mtr.add_suppression("\\[Warning\\] .*MY-\\d+.* Tablespace .*, name '.*', file '*.*' is missing!"); + +# 1. Failed or crash during CREATE +# 1.1 whole DDL is failed because DDL of vidx table is failed +SET DEBUG = "d,failed_before_vidx_ddl"; +CREATE TABLE t1 (v VECTOR(5), VECTOR INDEX vi(v)); +ERROR HY000: Create vector index `vi` in `test`.`t1` (aux_tab: vidx_000000000000042d_00) failed: debug failed before vidx ddl. +# expect that both base tablespace and vidx tablespace are not created +SHOW CREATE TABLE t1; +ERROR 42S02: Table 'test.t1' doesn't exist +# 1.2 crash before create vidx table +SET DEBUG = "d,crash_before_vidx_ddl"; +CREATE TABLE t1 (v VECTOR(5), VECTOR INDEX vi(v)); +# expect that base tablespace has been created but vidx tablespace is not created +t1.ibd +# expect that creation is rollback after crash recovery +SHOW CREATE TABLE t1; +ERROR 42S02: Table 'test.t1' doesn't exist +# 1.3 crash before post ddl +SET DEBUG = "d,ddl_log_before_post_ddl"; +CREATE TABLE t1 (v VECTOR(5), VECTOR INDEX vi(v)); +# expect that both base tablespace and vidx tablespace are created +t1.ibd +vidx_#_00.ibd +# expect that creation is committed after crash recovery +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL/*!99999 , + VECTOR KEY `vi` (`v`) M=6 DISTANCE=EUCLIDEAN */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +t1.ibd +vidx_#_00.ibd +SET DEBUG = '+d,skip_dd_table_access_check'; +SELECT count(*) AS `Expected as 0` FROM mysql.innodb_ddl_log; +Expected as 0 +0 + +# 2. Failed during DML +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,5]")); +SET DEBUG = "d,failed_before_vidx_dml"; +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,6]")); +ERROR HY000: Incorrect usage of vector index: debug failed before vidx dml. +SELECT VEC_TOTEXT(v) FROM t1; +VEC_TOTEXT(v) +[1,2,3,4,5] +UPDATE t1 SET v = VEC_FROMTEXT("[1,2,3,4,6]"); +ERROR HY000: Incorrect usage of vector index: debug failed before vidx dml. +SELECT VEC_TOTEXT(v) FROM t1; +VEC_TOTEXT(v) +[1,2,3,4,5] +DELETE FROM t1; +ERROR HY000: Incorrect usage of vector index: debug failed before vidx dml. +SELECT VEC_TOTEXT(v) FROM t1; +VEC_TOTEXT(v) +[1,2,3,4,5] + +# 3. Failed or crash during RENAME +# 3.1 whole DDL is failed because DDL of vidx table is failed +CREATE DATABASE test2; +SET DEBUG = "d,failed_before_vidx_ddl"; +RENAME TABLE t1 TO test2.t2; +ERROR HY000: Rename vector index `vi` in `test2`.`t2` (aux_tab: vidx_000000000000042f_00) failed: debug failed before vidx ddl. +# expect that both base tablespace and vidx tablespace are not renamed +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL/*!99999 , + VECTOR KEY `vi` (`v`) M=6 DISTANCE=EUCLIDEAN */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +SHOW CREATE TABLE test2.t2; +ERROR 42S02: Table 'test2.t2' doesn't exist +files in test/ +t1.ibd +vidx_#_00.ibd +files in test2/ +# 3.2 crash before rename vidx table +SET DEBUG = "d,crash_before_vidx_ddl"; +RENAME TABLE t1 TO test2.t2; +# expect that base tablespace has been renamed but vidx tablespace is not renamed +files in test/ +vidx_#_00.ibd +files in test2/ +t2.ibd +# expect that renaming is rollback after crash recovery +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL/*!99999 , + VECTOR KEY `vi` (`v`) M=6 DISTANCE=EUCLIDEAN */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +SHOW CREATE TABLE test2.t2; +ERROR 42S02: Table 'test2.t2' doesn't exist +files in test/ +t1.ibd +vidx_#_00.ibd +files in test2/ +# 3.3 crash before post ddl +SET DEBUG = "d,ddl_log_before_post_ddl"; +RENAME TABLE t1 TO test2.t2; +# expect that both base tablespace and vidx tablespace are not renamed +files in test/ +files in test2/ +t2.ibd +vidx_#_00.ibd +# expect that rename is committed after crash recovery +SHOW CREATE TABLE t1; +ERROR 42S02: Table 'test.t1' doesn't exist +SHOW CREATE TABLE test2.t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL/*!99999 , + VECTOR KEY `vi` (`v`) M=6 DISTANCE=EUCLIDEAN */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +files in test/ +files in test2/ +t2.ibd +vidx_#_00.ibd +SET DEBUG = '+d,skip_dd_table_access_check'; +SELECT count(*) AS `Expected as 0` FROM mysql.innodb_ddl_log; +Expected as 0 +0 +RENAME TABLE test2.t2 TO t1; +DROP DATABASE test2; + +# 4. Failed or crash during TRUNCATE +# 4.1 whole DDL is failed because DDL of vidx table is failed +SET DEBUG = "d,failed_before_vidx_ddl"; +TRUNCATE TABLE t1; +ERROR HY000: Truncate vector index `vi` in `test`.`t1` (aux_tab: vidx_0000000000000431_00) failed: debug failed before vidx ddl. +# expect that both base tablespace and vidx tablespace are not truncated +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL/*!99999 , + VECTOR KEY `vi` (`v`) M=6 DISTANCE=EUCLIDEAN */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +t1.ibd +vidx_#_00.ibd +# 4.2 crash before rename vidx table +SET DEBUG = "d,crash_before_vidx_ddl"; +TRUNCATE TABLE t1; +# expect that both base tablespace and vidx tablespace are not truncated +t1.ibd +vidx_#_00.ibd +# expect that truncation is rollback after crash recovery +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL/*!99999 , + VECTOR KEY `vi` (`v`) M=6 DISTANCE=EUCLIDEAN */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +t1.ibd +vidx_#_00.ibd +# 4.3 crash before post ddl +SET DEBUG = "d,ddl_log_before_post_ddl"; +TRUNCATE TABLE t1; +# expect that both base tablespace and vidx tablespace are not truncated +t1.ibd +vidx_#_00.ibd +# expect that truncation is committed after crash recovery +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL/*!99999 , + VECTOR KEY `vi` (`v`) M=6 DISTANCE=EUCLIDEAN */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +t1.ibd +vidx_#_00.ibd +SET DEBUG = '+d,skip_dd_table_access_check'; +SELECT count(*) AS `Expected as 0` FROM mysql.innodb_ddl_log; +Expected as 0 +0 + +# 5. Failed or crash during DROP +# 5.1 whole DDL is failed because DDL of vidx table is failed +SET DEBUG = "d,failed_before_vidx_ddl"; +DROP TABLE t1; +ERROR HY000: Drop vector index `vi` in `test`.`t1` (aux_tab: vidx_0000000000000433_00) failed: debug failed before vidx ddl. +# expect that both base tablespace and vidx tablespace are not dropped +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL/*!99999 , + VECTOR KEY `vi` (`v`) M=6 DISTANCE=EUCLIDEAN */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +t1.ibd +vidx_#_00.ibd +# 5.2 crash before rename vidx table +SET DEBUG = "d,crash_before_vidx_ddl"; +DROP TABLE t1; +# expect that both base tablespace and vidx tablespace are not dropped +t1.ibd +vidx_#_00.ibd +# expect that drop is rollback after crash recovery +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL/*!99999 , + VECTOR KEY `vi` (`v`) M=6 DISTANCE=EUCLIDEAN */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +t1.ibd +vidx_#_00.ibd +# 5.3 crash before post ddl +SET DEBUG = "d,ddl_log_before_post_ddl"; +DROP TABLE t1; +# expect that both base tablespace and vidx tablespace are not dropped +t1.ibd +vidx_#_00.ibd +# expect that drop is committed after crash recovery +SHOW CREATE TABLE t1; +ERROR 42S02: Table 'test.t1' doesn't exist +SET DEBUG = '+d,skip_dd_table_access_check'; +SELECT count(*) AS `Expected as 0` FROM mysql.innodb_ddl_log; +Expected as 0 +0 diff --git a/mysql-test/suite/rds/r/vidx_dml.result b/mysql-test/suite/rds/r/vidx_dml.result new file mode 100644 index 00000000000..f53bd211827 --- /dev/null +++ b/mysql-test/suite/rds/r/vidx_dml.result @@ -0,0 +1,115 @@ +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +SET GLOBAL vidx_disabled = OFF; +SET transaction_isolation = 'READ-COMMITTED'; +# 1. Prepare +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +a INT NOT NULL, +v VECTOR(5), +INDEX (a), +VECTOR INDEX vi(v) +) ENGINE = InnoDB; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int NOT NULL AUTO_INCREMENT, + `a` int NOT NULL, + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `a` (`a`)/*!99999 , + VECTOR KEY `vi` (`v`) M=6 DISTANCE=EUCLIDEAN */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci + +# 2. Insert 100 rows +INSERT INTO t1(a, v) SELECT 1, VEC_FROMTEXT(CONCAT('[', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ']')); + +# 3. Delete +DELETE FROM t1 WHERE id % 3 = 0; + +# 4. Update +UPDATE t1 SET v = (SELECT VEC_FROMTEXT(CONCAT('[', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ']'))) WHERE id % 3 = 1; + +# 5. Select +SELECT COUNT(*) FROM t1; +COUNT(*) +67 +# expect to use vector index scan +EXPLAIN SELECT * FROM t1 ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) limit 16; +id select_type table partitions type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 NULL index NULL vi 23 NULL 67 100.00 NULL +EXPLAIN SELECT * FROM t1 WHERE id>1 ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) limit 16; +id select_type table partitions type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 NULL index PRIMARY vi 23 NULL 67 100.00 Using where +EXPLAIN SELECT * FROM t1 WHERE a=1 ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) limit 16; +id select_type table partitions type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 NULL index a vi 23 NULL 67 100.00 Using where +EXPLAIN SELECT VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) AS distance FROM t1 ORDER BY distance limit 16; +id select_type table partitions type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 NULL index NULL vi 23 NULL 67 100.00 NULL +# expect to use JT_ALL +EXPLAIN SELECT * FROM t1 ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) limit 17; +id select_type table partitions type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 NULL ALL NULL NULL NULL NULL 67 100.00 Using filesort +EXPLAIN SELECT * FROM t1 WHERE id>1 ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) limit 17; +id select_type table partitions type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 NULL ALL PRIMARY NULL NULL NULL 67 100.00 Using where; Using filesort +EXPLAIN SELECT * FROM t1 WHERE a=1 ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) limit 17; +id select_type table partitions type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 NULL ALL a NULL NULL NULL 67 100.00 Using where; Using filesort +EXPLAIN SELECT VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) AS distance FROM t1 ORDER BY distance limit 17; +id select_type table partitions type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 NULL ALL NULL NULL NULL NULL 67 100.00 Using filesort +# expect to use SK range +EXPLAIN SELECT * FROM t1 WHERE a>1 ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) limit 1; +id select_type table partitions type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 NULL range a a 4 NULL 1 100.00 Using index condition; Using filesort +# FORCE INDEX +EXPLAIN SELECT * FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) limit 16; +id select_type table partitions type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 NULL ALL NULL NULL NULL NULL 67 100.00 Using filesort +EXPLAIN SELECT * FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")); +id select_type table partitions type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 NULL index NULL vi 23 NULL 67 100.00 NULL +EXPLAIN SELECT * FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) limit 100; +id select_type table partitions type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 NULL index NULL vi 23 NULL 67 100.00 NULL +# select using VIEW +CREATE VIEW `view1` AS SELECT * FROM t1; +SELECT id, VEC_TOTEXT(v) FROM `view1` ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) limit 1; +SELECT id, VEC_TOTEXT(v) FROM `view1` ORDER BY VEC_DISTANCE_EUCLIDEAN(VEC_FROMTEXT("[1,2,3,4,5]"), v) limit 1; +DROP VIEW `view1`; + +# 6. Select using prepare stmt +PREPARE stmt FROM 'SELECT id FROM t1 ORDER BY vec_distance_euclidean(v, ?) LIMIT ?'; +SET @vec = VEC_FROMTEXT("[1,2,3,4,5]"); +SET @limit = 10; +EXECUTE stmt USING @vec, @limit; +SET @vec = VEC_FROMTEXT("[1,2,3,4]"); +EXECUTE stmt USING @vec, @limit; +ERROR HY000: Incorrect arguments to VEC_DISTANCE_EUCLIDEAN + +# 7. Select using distance with different objects +# numeric +SELECT * FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, 1) limit 1; +ERROR HY000: Incorrect arguments to VEC_DISTANCE_EUCLIDEAN +SELECT * FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, 1) limit 1; +ERROR HY000: Incorrect arguments to VEC_DISTANCE_EUCLIDEAN +SELECT * FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, 1.1) limit 1; +ERROR HY000: Incorrect arguments to VEC_DISTANCE_EUCLIDEAN +SELECT * FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, 1.1) limit 1; +ERROR HY000: Incorrect arguments to VEC_DISTANCE_EUCLIDEAN +# string with different length +SELECT * FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, "1.1") limit 1; +ERROR HY000: Incorrect arguments to VEC_DISTANCE_EUCLIDEAN +SELECT * FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, "1.1") limit 1; +ERROR HY000: Incorrect arguments to VEC_DISTANCE_EUCLIDEAN +# string with same length +SELECT * FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") limit 1; +SELECT * FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") limit 1; + +# 8. Delete all +DELETE FROM t1; + +# 9. Clear +DROP TABLE t1; +SET GLOBAL vidx_disabled = ON; diff --git a/mysql-test/suite/rds/r/vidx_fix_71283799.result b/mysql-test/suite/rds/r/vidx_fix_71283799.result new file mode 100644 index 00000000000..78746e9c56f --- /dev/null +++ b/mysql-test/suite/rds/r/vidx_fix_71283799.result @@ -0,0 +1,24 @@ +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +SET GLOBAL vidx_disabled = OFF; +SET transaction_isolation = 'READ-COMMITTED'; +# Prepare a vector table in other database. +CREATE DATABASE test2; +CREATE TABLE test2.t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5), +VECTOR INDEX vi(v) +) ENGINE = InnoDB; +INSERT INTO test2.t1 SELECT 1, VEC_FROMTEXT(CONCAT('[', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ']')); +# Don't do purge before restart. +SET GLOBAL debug="d,do_not_meta_lock_in_background"; +# Delete data. +DELETE FROM test2.t1 where id = 1; +# Restart and wait until all purged. +# Before this patch, purge thread holds MDL SR locks on auxiliary tables. +SELECT COUNT(1) FROM performance_schema.metadata_locks WHERE OBJECT_SCHEMA='test2'; +COUNT(1) +0 +# Before this patch, DDL about test2.t1 will hang. +DROP TABLE test2.t1; +DROP DATABASE test2; +SET GLOBAL vidx_disabled = ON; diff --git a/mysql-test/suite/rds/r/vidx_fix_71294192.result b/mysql-test/suite/rds/r/vidx_fix_71294192.result new file mode 100644 index 00000000000..c110f13b104 --- /dev/null +++ b/mysql-test/suite/rds/r/vidx_fix_71294192.result @@ -0,0 +1,16 @@ +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +SET GLOBAL vidx_disabled = OFF; +SET transaction_isolation = 'READ-COMMITTED'; +# Prepare a vector table in other database. +CREATE DATABASE test2; +CREATE TABLE test2.t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5), +VECTOR INDEX vi(v) +) ENGINE = InnoDB; +INSERT INTO test2.t1(id, v) SELECT 1, VEC_FROMTEXT(CONCAT('[', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ']')); +# Restart mysqld to ensure the auxiliary table is not opened before dropped. +# Before this patch, the DROP will cause a crash. +DROP TABLE test2.t1; +DROP DATABASE test2; +SET GLOBAL vidx_disabled = ON; diff --git a/mysql-test/suite/rds/r/vidx_fix_MDEV_37068.result b/mysql-test/suite/rds/r/vidx_fix_MDEV_37068.result new file mode 100644 index 00000000000..b5d195afc41 --- /dev/null +++ b/mysql-test/suite/rds/r/vidx_fix_MDEV_37068.result @@ -0,0 +1,15 @@ +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +SET GLOBAL vidx_disabled = OFF; +SET transaction_isolation = 'READ-COMMITTED'; +# +# MDEV-37068 Can't find record in 't1' on INSERT to Vector table +# +SET sql_mode=''; +create table t1 (v vector (1) not null,vector vec (v),unique vu (v)) engine=innodb; +start transaction; +insert t1 values (VEC_FROMTEXT("[1]")), (VEC_FROMTEXT("[1]")); +ERROR 23000: Duplicate entry '\x00\x00\x80?' for key 't1.vu' +insert t1 values (VEC_FROMTEXT("[1]")); +drop table t1; +set sql_mode=default; +SET GLOBAL vidx_disabled = ON; diff --git a/mysql-test/suite/rds/r/vidx_func.result b/mysql-test/suite/rds/r/vidx_func.result new file mode 100644 index 00000000000..73d15f4f25c --- /dev/null +++ b/mysql-test/suite/rds/r/vidx_func.result @@ -0,0 +1,137 @@ +SET GLOBAL vidx_disabled = OFF; +SET transaction_isolation = 'READ-COMMITTED'; +# 1. SUPPORT about VECTOR functions +SELECT VECTOR_DIM(VEC_FROMTEXT("[1,2,3,4,5]")); +VECTOR_DIM(VEC_FROMTEXT("[1,2,3,4,5]")) +5 +SELECT VEC_TOTEXT(x'e360d63ebe554f3fcdbc523f4522193f5236083d'); +VEC_TOTEXT(x'e360d63ebe554f3fcdbc523f4522193f5236083d') +[0.418708,0.809902,0.823193,0.598179,0.0332549] +SELECT VEC_TOTEXT("abcd"); +VEC_TOTEXT("abcd") +[1.6778e22] +SELECT VEC_TOTEXT(VEC_FROMTEXT("[1,2,3,4,5]")); +VEC_TOTEXT(VEC_FROMTEXT("[1,2,3,4,5]")) +[1,2,3,4,5] +SELECT VEC_DISTANCE_EUCLIDEAN(VEC_FROMTEXT("[1,2,3,4,5]"), VEC_FROMTEXT("[1,2,3,4,5]")); +VEC_DISTANCE_EUCLIDEAN(VEC_FROMTEXT("[1,2,3,4,5]"), VEC_FROMTEXT("[1,2,3,4,5]")) +0 +SELECT VEC_DISTANCE_EUCLIDEAN(VEC_FROMTEXT("[1,2,3,4,5]"), VEC_FROMTEXT("[1,2,3,4,5.1]")); +VEC_DISTANCE_EUCLIDEAN(VEC_FROMTEXT("[1,2,3,4,5]"), VEC_FROMTEXT("[1,2,3,4,5.1]")) +0.09999990463256836 +SELECT VEC_DISTANCE_COSINE(VEC_FROMTEXT("[1,2,3,4,5]"), VEC_FROMTEXT("[1,2,3,4,5]")); +VEC_DISTANCE_COSINE(VEC_FROMTEXT("[1,2,3,4,5]"), VEC_FROMTEXT("[1,2,3,4,5]")) +0 +SELECT VEC_DISTANCE_COSINE(VEC_FROMTEXT("[1,2,3,4,5]"), VEC_FROMTEXT("[1,2,3,4,5.1]")); +VEC_DISTANCE_COSINE(VEC_FROMTEXT("[1,2,3,4,5]"), VEC_FROMTEXT("[1,2,3,4,5.1]")) +0.00004867880623027343 +# NULL, empty vector is allowed in VEC_TOTEXT and VECTOR_DIM +SELECT VEC_TOTEXT(x''); +VEC_TOTEXT(x'') + +SELECT VEC_TOTEXT(NULL); +VEC_TOTEXT(NULL) +NULL +SELECT VECTOR_DIM(x''); +VECTOR_DIM(x'') +0 +SELECT VECTOR_DIM(NULL); +VECTOR_DIM(NULL) +NULL +# NULL vector is allowed in VEC_FROMTEXT +SELECT VEC_FROMTEXT(NULL); +VEC_FROMTEXT(NULL) +NULL + +# 3. NONSUPPORT about VECTOR functions +# The length of arguments should be able to converted to a vector dimension +SELECT VEC_TOTEXT("abc"); +ERROR HY000: Invalid binary vector format. Must use IEEE standard float representation in little-endian format. Use VEC_FromText() to generate it. +# Invalid binary format +SELECT VEC_FROMTEXT("1,2,3,4,5]"); +ERROR HY000: Data cannot be converted to a valid vector: '1,2,3,4,5]' +SELECT VEC_FROMTEXT(""); +ERROR HY000: Data cannot be converted to a valid vector: '' +# The number of arguments is not correct +SELECT VEC_TOTEXT(); +ERROR 42000: Incorrect parameter count in the call to native function 'VEC_TOTEXT' +SELECT VECTOR_DIM(); +ERROR 42000: Incorrect parameter count in the call to native function 'VECTOR_DIM' +SELECT VECTOR_DIM(VEC_FROMTEXT("[1,2,3,4,5]"), VEC_FROMTEXT("[1,2,3,4,5]")); +ERROR 42000: Incorrect parameter count in the call to native function 'VECTOR_DIM' +# The distance tween two vectors having different dimensions should be NULL +SELECT VEC_DISTANCE_EUCLIDEAN(VEC_FROMTEXT("[1,2,3,4,5]"), VEC_FROMTEXT("[1,2,3,4]")); +VEC_DISTANCE_EUCLIDEAN(VEC_FROMTEXT("[1,2,3,4,5]"), VEC_FROMTEXT("[1,2,3,4]")) +NULL +SELECT VEC_DISTANCE_EUCLIDEAN(VEC_FROMTEXT("[1,2,3,4,5]"), NULL); +VEC_DISTANCE_EUCLIDEAN(VEC_FROMTEXT("[1,2,3,4,5]"), NULL) +NULL +SELECT VEC_DISTANCE_COSINE(VEC_FROMTEXT("[1,2,3,4,5]"), VEC_FROMTEXT("[1,2,3,4,5,6]")); +VEC_DISTANCE_COSINE(VEC_FROMTEXT("[1,2,3,4,5]"), VEC_FROMTEXT("[1,2,3,4,5,6]")) +NULL +SELECT VEC_DISTANCE_COSINE(NULL, VEC_FROMTEXT("[1,2,3,4,5,6]")); +VEC_DISTANCE_COSINE(NULL, VEC_FROMTEXT("[1,2,3,4,5,6]")) +NULL +SELECT VEC_DISTANCE_COSINE(NULL, NULL); +VEC_DISTANCE_COSINE(NULL, NULL) +NULL + +# 4. DML using vector functions +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5) +); +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,5]")); +INSERT INTO t1(v) VALUES (TO_VECTOR("[1.1,2.1,3.1,4.1,5.1]")); +INSERT INTO t1(v) VALUES (STRING_TO_VECTOR("[1.2,2.2,3.2,4.2,5.2]")); +INSERT INTO t1(v) VALUES (x'e360d63ebe554f3fcdbc523f4522193f5236083d'); +SELECT id, VEC_TOTEXT(v) FROM t1; +id VEC_TOTEXT(v) +1 [1,2,3,4,5] +2 [1.1,2.1,3.1,4.1,5.1] +3 [1.2,2.2,3.2,4.2,5.2] +4 [0.418708,0.809902,0.823193,0.598179,0.0332549] +SELECT VECTOR_DIM(v) FROM t1; +VECTOR_DIM(v) +5 +5 +5 +5 +SELECT VEC_TOTEXT(v) FROM t1; +VEC_TOTEXT(v) +[1,2,3,4,5] +[1.1,2.1,3.1,4.1,5.1] +[1.2,2.2,3.2,4.2,5.2] +[0.418708,0.809902,0.823193,0.598179,0.0332549] +SELECT FROM_VECTOR(v) FROM t1; +FROM_VECTOR(v) +[1,2,3,4,5] +[1.1,2.1,3.1,4.1,5.1] +[1.2,2.2,3.2,4.2,5.2] +[0.418708,0.809902,0.823193,0.598179,0.0332549] +SELECT VECTOR_TO_STRING(v) FROM t1; +VECTOR_TO_STRING(v) +[1,2,3,4,5] +[1.1,2.1,3.1,4.1,5.1] +[1.2,2.2,3.2,4.2,5.2] +[0.418708,0.809902,0.823193,0.598179,0.0332549] +SELECT id, VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) FROM t1; +id VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) +1 0 +2 0.2236066378139594 +3 0.4472134888760042 +4 6.537098835577236 +SELECT id, VEC_DISTANCE_COSINE(v, VEC_FROMTEXT("[1,2,3,4,5]")) FROM t1; +id VEC_DISTANCE_COSINE(v, VEC_FROMTEXT("[1,2,3,4,5]")) +1 0 +2 0.00007830157192822984 +3 0.00029710017677209155 +4 0.3027471560934656 +SELECT id FROM t1 ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")); +id +1 +2 +3 +4 +DROP TABLE t1; +SET GLOBAL vidx_disabled = ON; diff --git a/mysql-test/suite/rds/r/vidx_rpl.result b/mysql-test/suite/rds/r/vidx_rpl.result new file mode 100644 index 00000000000..f98c780a551 --- /dev/null +++ b/mysql-test/suite/rds/r/vidx_rpl.result @@ -0,0 +1,160 @@ +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +include/master-slave.inc +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the connection metadata repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START REPLICA; see the 'START REPLICA Syntax' in the MySQL Manual for more information. +[connection master] +[connection slave] +SET GLOBAL vidx_disabled = OFF; +[connection master] +SET GLOBAL vidx_disabled = OFF; + +# 1. Test ddl log event +# a. Show query binlog records vector column as /*!99999 vector(X) */ varbinary(4*X) +# vector index as index not existing +# b. Check operation of vector index can't be in one query with other operations +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5), +VECTOR INDEX vi(v) +) ENGINE = InnoDB; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # use `test`; CREATE TABLE `t1` ( + `id` int NOT NULL AUTO_INCREMENT, + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL, + PRIMARY KEY (`id`)/*!99999 , + VECTOR KEY `vi` (`v`) M=6 DISTANCE=EUCLIDEAN */ +) ENGINE=InnoDB +ALTER TABLE t1 ADD COLUMN `v2` vector(10); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # use `test`; ALTER TABLE t1 ADD COLUMN `v2` /*!99999 vector(10) */ varbinary(40) +ALTER TABLE t1 RENAME INDEX `vi` TO `vi2`, DROP COLUMN `v2`; +ERROR 42000: This version of MySQL doesn't yet support 'perform other operations while alter a vector index' +ALTER TABLE t1 RENAME INDEX `vi` TO `vi2`; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # use `test`; /*!99999 ALTER TABLE t1 RENAME INDEX `vi` TO `vi2` */ +ALTER TABLE t1 DROP INDEX `vi2`, DROP COLUMN `v2`; +ERROR 42000: This version of MySQL doesn't yet support 'perform other operations while alter a vector index' +ALTER TABLE t1 DROP INDEX `vi2`; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # use `test`; /*!99999 ALTER TABLE t1 DROP INDEX `vi2` */ +CREATE VECTOR INDEX `vi` ON t1(v); +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # use `test`; /*!99999 CREATE VECTOR INDEX `vi` ON t1(v) */ +DROP INDEX `vi` ON t1; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # use `test`; /*!99999 DROP INDEX `vi` ON t1 */ +include/sync_slave_sql_with_master.inc +[connection slave] +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int NOT NULL AUTO_INCREMENT, + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL, + `v2` /*!99999 vector(10) */ varbinary(40) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci + +# 2. Test dml in transactions +# Prepare +[connection master] +SET transaction_isolation = 'READ-COMMITTED'; +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5), +VECTOR INDEX vi(v) +) ENGINE = InnoDB; +# Insert data using transactions +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,10]")); +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,9]")); +BEGIN; +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,8]")); +SAVEPOINT sp1; +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,7]")); +SAVEPOINT sp2; +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,6]")); +ROLLBACK TO SAVEPOINT sp2; +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,5]")); +COMMIT; +BEGIN; +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,4]")); +ROLLBACK; +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,3]")); +include/rpl_sync.inc + +# Validate data in mater +SELECT id, VEC_TOTEXT(v) FROM t1; +id VEC_TOTEXT(v) +1 [1,2,3,4,10] +2 [1,2,3,4,9] +3 [1,2,3,4,8] +4 [1,2,3,4,7] +6 [1,2,3,4,5] +8 [1,2,3,4,3] +EXPLAIN SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; +id select_type table partitions type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 NULL ALL NULL NULL NULL NULL 8 100.00 Using filesort +SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; +id VEC_TOTEXT(v) +6 [1,2,3,4,5] +4 [1,2,3,4,7] +8 [1,2,3,4,3] +3 [1,2,3,4,8] +2 [1,2,3,4,9] +EXPLAIN SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; +id select_type table partitions type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 NULL index NULL vi 23 NULL 8 100.00 NULL +SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; +id VEC_TOTEXT(v) +6 [1,2,3,4,5] +4 [1,2,3,4,7] +8 [1,2,3,4,3] +3 [1,2,3,4,8] +2 [1,2,3,4,9] + +# Validate data in slave +[connection slave] +SET transaction_isolation = 'READ-COMMITTED'; +SELECT id, VEC_TOTEXT(v) FROM t1; +id VEC_TOTEXT(v) +1 [1,2,3,4,10] +2 [1,2,3,4,9] +3 [1,2,3,4,8] +4 [1,2,3,4,7] +6 [1,2,3,4,5] +8 [1,2,3,4,3] +EXPLAIN SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; +id select_type table partitions type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 NULL ALL NULL NULL NULL NULL 6 100.00 Using filesort +SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; +id VEC_TOTEXT(v) +6 [1,2,3,4,5] +4 [1,2,3,4,7] +8 [1,2,3,4,3] +3 [1,2,3,4,8] +2 [1,2,3,4,9] +EXPLAIN SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; +id select_type table partitions type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 NULL index NULL vi 23 NULL 6 100.00 NULL +SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; +id VEC_TOTEXT(v) +6 [1,2,3,4,5] +4 [1,2,3,4,7] +8 [1,2,3,4,3] +3 [1,2,3,4,8] +2 [1,2,3,4,9] + +# 3. Clear +SET GLOBAL vidx_disabled = ON; +[connection master] +DROP TABLE t1; +SET GLOBAL vidx_disabled = ON; +include/rpl_sync.inc +include/rpl_end.inc diff --git a/mysql-test/suite/rds/r/vidx_support_nullable.result b/mysql-test/suite/rds/r/vidx_support_nullable.result new file mode 100644 index 00000000000..b347bcfdf8a --- /dev/null +++ b/mysql-test/suite/rds/r/vidx_support_nullable.result @@ -0,0 +1,43 @@ +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +SET GLOBAL vidx_disabled = OFF; +SET transaction_isolation = 'READ-COMMITTED'; +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +a INT, +v VECTOR(5), +VECTOR INDEX vi(v) +) ENGINE = InnoDB; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int NOT NULL AUTO_INCREMENT, + `a` int DEFAULT NULL, + `v` /*!99999 vector(5) */ varbinary(20) DEFAULT NULL, + PRIMARY KEY (`id`)/*!99999 , + VECTOR KEY `vi` (`v`) M=6 DISTANCE=EUCLIDEAN */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci +INSERT INTO t1 VALUES(1, 1, NULL); +INSERT INTO t1 VALUES(2, 2, VEC_FROMTEXT("[1,2,3,4,5]")); +INSERT INTO t1 VALUES(3, 3, NULL); +INSERT INTO t1 VALUES(4, 4, NULL); +DELETE FROM t1 WHERE id = 1; +UPDATE t1 SET v = NULL WHERE id = 2; +UPDATE t1 SET v = VEC_FROMTEXT("[1,2,3,4,5]") WHERE id = 3; +UPDATE t1 SET a=5 WHERE id = 4; +SELECT id, a, VEC_TOTEXT(v) FROM t1; +id a VEC_TOTEXT(v) +2 2 NULL +3 3 [1,2,3,4,5] +4 5 NULL +# Rows with NULL vector columns cannot be found using the vector index. +SELECT id, a, VEC_TOTEXT(v), VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) as dis FROM t1 FORCE INDEX(`vi`) ORDER BY dis; +id a VEC_TOTEXT(v) dis +3 3 [1,2,3,4,5] 0 +# Rows with NULL distances to target will be placed at the end of the result set. +SELECT id, a, VEC_TOTEXT(v), VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) as dis FROM t1 FORCE INDEX(PRIMARY) ORDER BY dis; +id a VEC_TOTEXT(v) dis +3 3 [1,2,3,4,5] 0 +2 2 NULL NULL +4 5 NULL NULL +DROP TABLE t1; +SET GLOBAL vidx_disabled = ON; diff --git a/mysql-test/suite/rds/r/vidx_trx.result b/mysql-test/suite/rds/r/vidx_trx.result new file mode 100644 index 00000000000..7b17ef2546e --- /dev/null +++ b/mysql-test/suite/rds/r/vidx_trx.result @@ -0,0 +1,60 @@ +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +SET GLOBAL vidx_disabled = OFF; +SET transaction_isolation = 'READ-COMMITTED'; +# 1. Prepare +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +v VECTOR(5), +VECTOR INDEX vi(v) +) ENGINE = InnoDB; + +# 2. Insert data using transactions +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,10]")); +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,9]")); +BEGIN; +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,8]")); +SAVEPOINT sp1; +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,7]")); +SAVEPOINT sp2; +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,6]")); +ROLLBACK TO SAVEPOINT sp2; +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,5]")); +COMMIT; +BEGIN; +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,4]")); +ROLLBACK; +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,3]")); + +# 3. Validate data +SELECT id, VEC_TOTEXT(v) FROM t1; +id VEC_TOTEXT(v) +1 [1,2,3,4,10] +2 [1,2,3,4,9] +3 [1,2,3,4,8] +4 [1,2,3,4,7] +6 [1,2,3,4,5] +8 [1,2,3,4,3] +EXPLAIN SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; +id select_type table partitions type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 NULL ALL NULL NULL NULL NULL 8 100.00 Using filesort +SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; +id VEC_TOTEXT(v) +6 [1,2,3,4,5] +4 [1,2,3,4,7] +8 [1,2,3,4,3] +3 [1,2,3,4,8] +2 [1,2,3,4,9] +EXPLAIN SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; +id select_type table partitions type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 NULL index NULL vi 23 NULL 8 100.00 NULL +SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; +id VEC_TOTEXT(v) +6 [1,2,3,4,5] +4 [1,2,3,4,7] +8 [1,2,3,4,3] +3 [1,2,3,4,8] +2 [1,2,3,4,9] + +# 4. Clear +DROP TABLE t1; +SET GLOBAL vidx_disabled = ON; diff --git a/mysql-test/suite/rds/t/vidx_column.test b/mysql-test/suite/rds/t/vidx_column.test new file mode 100644 index 00000000000..1e10478e342 --- /dev/null +++ b/mysql-test/suite/rds/t/vidx_column.test @@ -0,0 +1,157 @@ +########################################### +# The syntax and rules for VECTOR COLUMN # +########################################### +--source include/have_binlog_format_mixed_or_row.inc + +--echo # 1. KEYWORDs +--echo # Word vector is not able to be the name, while words m, distance, +--echo # euclidean, cosine is still able. +--error ER_PARSE_ERROR +CREATE TABLE t1 ( + vector int + ); + +CREATE TABLE t1 ( + m int, + distance int, + euclidean int, + cosine int + ); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo +--echo # 2. NONSUPPORT about VECTOR COLUMN +--echo # The variable vidx_disabled will forbid to create VECTOR column +SET GLOBAL vidx_disabled = ON; + +--error ER_VECTOR_DISABLED +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(16382) + ); + +SET GLOBAL vidx_disabled = OFF; + +--echo # The range of the dimension of VECTOR columns is limited by row size +--error ER_TOO_BIG_ROWSIZE +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(16383) + ); + +--echo # The dimension of VECTOR column must be set explicitly +--error ER_PARSE_ERROR +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR + ); + +--echo # The dimension of VECTOR column must be set by number not string +--error ER_PARSE_ERROR +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR("kkk") + ); + +--echo +--echo # 3. SUPPORT about VECTOR COLUMN +--echo # The range of the dimension of VECTOR columns is limited by row size +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(16382) + ); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo # The dimension of VECTOR column can be 0 +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(0) + ); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo # Set Decimal as the VECTOR dimension will be corrected as the integer +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(10.1) + ); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo # The VECTOR field can be used in routines. +DELIMITER $$; +CREATE PROCEDURE vector_distance(v1 VECTOR(5), v2 VECTOR(5)) +BEGIN + SELECT VEC_DISTANCE_EUCLIDEAN(v1, v2); +END$$ +CREATE FUNCTION str2vector(in_str TEXT) RETURNS VECTOR(5) +BEGIN + RETURN VEC_FROMTEXT(in_str); +END$$ +DELIMITER ;$$ + +CALL vector_distance(VEC_FROMTEXT('[1,2,3,4,5]'), VEC_FROMTEXT('[1,2,3,4,5]')); +SELECT VEC_TOTEXT(str2vector('[1,2,3,4,5]')); + +DROP PROCEDURE vector_distance; +DROP FUNCTION str2vector; + +--echo +--echo # 4. DML about VECTOR COLUMN +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5) + ); +SHOW CREATE TABLE t1; + +SET transaction_isolation = 'READ-COMMITTED'; + +--echo # NULL is allowed if column is nullable +INSERT INTO t1(v) VALUES (NULL); + +--echo # other types except string is not allowed +--error ER_DATA_INCOMPATIBLE_WITH_VECTOR +INSERT INTO t1(v) VALUES (1); +# the field size is different between the debug mode and the release mode. +--disable_result_log +--error ER_DATA_INCOMPATIBLE_WITH_VECTOR +INSERT INTO t1(v) VALUES (1.1); +--enable_result_log + +--echo # Vector with different dimension is not allowed, including empty vector +--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD +INSERT INTO t1(v) VALUES (""); +--error ER_DATA_INCOMPATIBLE_WITH_VECTOR +INSERT INTO t1(v) VALUES (x'e360d63ebe554f3fcdbc523f4522193f523608'); +--error ER_DATA_INCOMPATIBLE_WITH_VECTOR +INSERT INTO t1(v) VALUES (x'e360d63ebe554f3fcdbc523f4522193f5236083d3d3d'); + +--echo # string is allowed, but warning if charset is not binary and sql_mode=strict +SET sql_mode="STRICT_TRANS_TABLES"; +--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD +INSERT INTO t1(v) VALUES ("===================="); + +SET sql_mode=""; +INSERT INTO t1(v) VALUES ("===================="); + +--echo # HEX string is allowed +INSERT INTO t1(v) VALUES (x'e360d63ebe554f3fcdbc523f4522193f5236083d'); + +SELECT VEC_TOTEXT(v) FROM t1; + +--echo # Vector column can be the part of normal index +CREATE INDEX i1 ON t1(v, id); +SHOW CREATE TABLE t1; +SELECT VEC_TOTEXT(v) FROM t1 FORCE INDEX(i1); + +--echo # Vector column can build a prefix index. Number means the prefix +--echo # dimension rather than the prefix length. +CREATE INDEX i2 ON t1(v(2)); +SHOW CREATE TABLE t1; +SELECT VEC_TOTEXT(v) FROM t1 FORCE INDEX(i2); + +DROP TABLE t1; + +SET GLOBAL vidx_disabled = ON; diff --git a/mysql-test/suite/rds/t/vidx_ddl.test b/mysql-test/suite/rds/t/vidx_ddl.test new file mode 100644 index 00000000000..c33aadae603 --- /dev/null +++ b/mysql-test/suite/rds/t/vidx_ddl.test @@ -0,0 +1,276 @@ +########################################## +# The DDL for VECTOR Index # +########################################## +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +--source include/have_binlog_format_mixed_or_row.inc + +SET transaction_isolation = 'READ-COMMITTED'; +SET GLOBAL vidx_disabled = OFF; +--let $MYSQLD_DATADIR= `select @@datadir` + +--echo # 1. NONSUPPORT about VECTOR INDEX +--echo # The variable vidx_disabled will forbid to create VECTOR index +SET GLOBAL vidx_disabled = ON; + +--error ER_VECTOR_DISABLED +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5), + VECTOR INDEX vi(v) + ); + +SET GLOBAL vidx_disabled = OFF; + +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5) + ); + +SET GLOBAL vidx_disabled = ON; + +--error ER_VECTOR_DISABLED +ALTER TABLE t1 ADD VECTOR INDEX vi(v); +DROP TABLE t1; + +SET GLOBAL vidx_disabled = OFF; + +--echo # Vector index is not supported for partitioned or temp tables. +--error ER_NOT_SUPPORTED_YET +CREATE TEMPORARY TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5), + VECTOR INDEX vi(v) + ); + +--error ER_NOT_SUPPORTED_YET +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + c1 INT, + v VECTOR(5), + VECTOR INDEX vi(v) + )PARTITION BY HASH (c1) PARTITIONS 3; + +--echo # Vector index can only be created on one VECTOR column not null +--error ER_PARSE_ERROR +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5), + t VECTOR(5), + VECTOR INDEX vi(v,t) + ); + +--error ER_VECTOR_INDEX_USAGE +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v INT NOT NULL, + VECTOR INDEX vi(v) + ); + +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5), + VECTOR INDEX vi(v) + ); + +--error ER_VECTOR_INDEX_USAGE +ALTER TABLE t1 MODIFY COLUMN v VECTOR(5) INVISIBLE; + +DROP TABLE t1; + +--echo # VECTOR INDEX can't be created on generate column +--error ER_PARSE_ERROR +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v BLOB NOT NULL, + VECTOR INDEX vi(VEC_FROMTEXT(v)) + ); + +--echo # VECTOR INDEX‘s options should be set in their range. m should be +--echo # in [3,200]. distance should be in {euclidean, cosine} +--error ER_VECTOR_INDEX_USAGE +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5), + VECTOR INDEX vi(v) m=2 + ); + +--error ER_VECTOR_INDEX_USAGE +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5), + VECTOR INDEX vi(v) m=201 + ); + +--error ER_PARSE_ERROR +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5), + VECTOR INDEX vi(v) distance=wrong + ); + +--echo # VECTOR keys can not be prefix +--error ER_PARSE_ERROR +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(768), + VECTOR INDEX vi(v(1)) + ); + +--echo # VECTOR key's dimension must be greater than 0 +--error ER_WRONG_KEY_COLUMN +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(0), + VECTOR INDEX vi(v) + ); + +--echo # The range of the dimension of VECTOR keys is not limited by key size +--error ER_TOO_LONG_KEY +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VARCHAR(3076), + INDEX vi(v) + ); + +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(769), + VECTOR INDEX vi(v) + ); +DROP TABLE t1; + +--echo # Can't be invisible +--error ER_VECTOR_INDEX_USAGE +CREATE TABLE t10 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5), + VECTOR INDEX vi(v) INVISIBLE + ); + +--echo # Don't support multi VECTOR indexes yet +--error ER_NOT_SUPPORTED_YET +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5), + VECTOR INDEX vi(v), + VECTOR INDEX vi2(v) + ); + +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5), + VECTOR INDEX vi(v) + ); +--error ER_NOT_SUPPORTED_YET +CREATE VECTOR INDEX vi2 ON t1(v); +--error ER_NOT_SUPPORTED_YET +ALTER TABLE t1 ADD VECTOR INDEX vi2(v); +DROP TABLE t1; + +--echo +--echo # 2. Don't support inplace ddl yet +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5) + ); +--error ER_ALTER_OPERATION_NOT_SUPPORTED +ALTER TABLE t1 ADD VECTOR INDEX vi(v), algorithm=instant; +--error ER_ALTER_OPERATION_NOT_SUPPORTED +ALTER TABLE t1 ADD VECTOR INDEX vi(v), algorithm=inplace; + +ALTER TABLE t1 ADD VECTOR INDEX vi(v); + +--error ER_ALTER_OPERATION_NOT_SUPPORTED +ALTER TABLE t1 DROP INDEX vi, algorithm=instant; +--error ER_ALTER_OPERATION_NOT_SUPPORTED +ALTER TABLE t1 DROP INDEX vi, algorithm=inplace; + +ALTER TABLE t1 DROP INDEX vi; +DROP TABLE t1; + +--echo +--echo # 3. DDL about VECTOR INDEX +--echo # CREATE TABLE +CREATE DATABASE IF NOT EXISTS test2; +USE test2; + +--echo # VECTOR INDEX should be at the end of key list +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + text LONGTEXT NOT NULL, + meta JSON NOT NULL, + v VECTOR(5), + VECTOR INDEX vi(v) m=3 distance=euclidean + ); +SHOW CREATE TABLE t1; + +ALTER TABLE t1 ADD INDEX i2(v); +CREATE INDEX idx_meta ON `t1` ((CAST(JSON_UNQUOTE(JSON_EXTRACT(meta, '$.document_id')) AS CHAR(36)))); +CREATE FULLTEXT INDEX idx_full_text ON `t1` (text); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo # DROP VECTOR INDEX +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5), + VECTOR INDEX vi(v) m=3 distance=euclidean + ); + +--disable_warnings +INSERT INTO t1(v) SELECT VEC_FROMTEXT(CONCAT('[', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ']')); +--enable_warnings + +DROP INDEX vi ON t1; +SHOW CREATE TABLE t1; + +--echo # CREATE VECTOR INDEX +CREATE VECTOR INDEX vi ON t1(v) m=200 distance=cosine; +SHOW CREATE TABLE t1; + +--echo # ALTER TABLE DROP VECTOR INDEX +ALTER TABLE t1 DROP INDEX `vi`; +SHOW CREATE TABLE t1; + +--echo # ALTER TABLE ADD VECTOR INDEX +ALTER TABLE t1 ADD VECTOR INDEX vi(v) m=200 distance=cosine; +SHOW CREATE TABLE t1; + +--echo # ALTER TABLE RENAME VECTOR INDEX +ALTER TABLE t1 RENAME INDEX `vi` TO `vi2`; +SHOW CREATE TABLE t1; + +--echo # OPTIMIZE TABLE +OPTIMIZE TABLE t1; +SHOW CREATE TABLE t1; + +--echo # TRUNCATE TABLE +TRUNCATE TABLE t1; +SHOW CREATE TABLE t1; + +--echo # RENAME TABLE +RENAME TABLE t1 TO t2; +SHOW CREATE TABLE t2; +CREATE TABLE t1 LIKE t2; + +--echo # DROP TABLE +DROP TABLE t2; + +--echo # DROP DATABASE +DROP DATABASE test2; +USE test; + +--echo +--echo # 4. Vars about VECTOR INDEX +SET SESSION vidx_default_distance = 'cosine'; +SET SESSION vidx_hnsw_default_m = 155; + +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5), + VECTOR INDEX vi(v) + ); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +SET GLOBAL vidx_disabled = ON; \ No newline at end of file diff --git a/mysql-test/suite/rds/t/vidx_debug-master.opt b/mysql-test/suite/rds/t/vidx_debug-master.opt new file mode 100644 index 00000000000..c03d1638375 --- /dev/null +++ b/mysql-test/suite/rds/t/vidx_debug-master.opt @@ -0,0 +1,2 @@ +--vidx_disabled=OFF +--transaction_isolation=READ-COMMITTED \ No newline at end of file diff --git a/mysql-test/suite/rds/t/vidx_debug.test b/mysql-test/suite/rds/t/vidx_debug.test new file mode 100644 index 00000000000..c093dec3337 --- /dev/null +++ b/mysql-test/suite/rds/t/vidx_debug.test @@ -0,0 +1,272 @@ +########################################## +# The error situation for VECTOR Index # +########################################## +--source include/have_debug.inc +--source include/have_binlog_format_mixed_or_row.inc + +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +CALL mtr.add_suppression("\\[ERROR\\].*Scanned file '.*' for tablespace .* cannot be opened because it is not in a sub-directory named for the schema"); +CALL mtr.add_suppression("\\[Warning\\] .*MY-\\d+.* Tablespace .*, name '.*', file '*.*' is missing!"); + +--let $MYSQLD_DATADIR= `select @@datadir` + +--echo +--echo # 1. Failed or crash during CREATE +--echo # 1.1 whole DDL is failed because DDL of vidx table is failed +SET DEBUG = "d,failed_before_vidx_ddl"; + +--error ER_VECTOR_INDEX_FAILED +CREATE TABLE t1 (v VECTOR(5), VECTOR INDEX vi(v)); + +--echo # expect that both base tablespace and vidx tablespace are not created +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t1; +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test/ + +--echo # 1.2 crash before create vidx table +SET DEBUG = "d,crash_before_vidx_ddl"; + +--source include/expect_crash.inc +--error 0,CR_SERVER_LOST,ER_INTERNAL_ERROR +CREATE TABLE t1 (v VECTOR(5), VECTOR INDEX vi(v)); + +--echo # expect that base tablespace has been created but vidx tablespace is not created +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test/ + +--echo # expect that creation is rollback after crash recovery +--source include/start_mysqld_no_echo.inc + +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t1; +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test/ + +--echo # 1.3 crash before post ddl +SET DEBUG = "d,ddl_log_before_post_ddl"; + +--source include/expect_crash.inc +--error 0,CR_SERVER_LOST,ER_INTERNAL_ERROR +CREATE TABLE t1 (v VECTOR(5), VECTOR INDEX vi(v)); + +--echo # expect that both base tablespace and vidx tablespace are created +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test/ + +--echo # expect that creation is committed after crash recovery +--source include/start_mysqld_no_echo.inc + +SHOW CREATE TABLE t1; +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test/ + +SET DEBUG = '+d,skip_dd_table_access_check'; +SELECT count(*) AS `Expected as 0` FROM mysql.innodb_ddl_log; + +--echo +--echo # 2. Failed during DML +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,5]")); + +SET DEBUG = "d,failed_before_vidx_dml"; +--error ER_VECTOR_INDEX_USAGE +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,6]")); + +SELECT VEC_TOTEXT(v) FROM t1; + +--error ER_VECTOR_INDEX_USAGE +UPDATE t1 SET v = VEC_FROMTEXT("[1,2,3,4,6]"); + +SELECT VEC_TOTEXT(v) FROM t1; + +--error ER_VECTOR_INDEX_USAGE +DELETE FROM t1; + +SELECT VEC_TOTEXT(v) FROM t1; + +--echo +--echo # 3. Failed or crash during RENAME +--echo # 3.1 whole DDL is failed because DDL of vidx table is failed +CREATE DATABASE test2; +SET DEBUG = "d,failed_before_vidx_ddl"; + +--error ER_VECTOR_INDEX_FAILED +RENAME TABLE t1 TO test2.t2; + +--echo # expect that both base tablespace and vidx tablespace are not renamed +SHOW CREATE TABLE t1; +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE test2.t2; +--echo files in test/ +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test/ +--echo files in test2/ +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test2/ + +--echo # 3.2 crash before rename vidx table +SET DEBUG = "d,crash_before_vidx_ddl"; + +--source include/expect_crash.inc +--error 0,CR_SERVER_LOST,ER_INTERNAL_ERROR +RENAME TABLE t1 TO test2.t2; + +--echo # expect that base tablespace has been renamed but vidx tablespace is not renamed +--echo files in test/ +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test/ +--echo files in test2/ +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test2/ + +--echo # expect that renaming is rollback after crash recovery +--source include/start_mysqld_no_echo.inc + +SHOW CREATE TABLE t1; +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE test2.t2; +--echo files in test/ +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test/ +--echo files in test2/ +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test2/ + +--echo # 3.3 crash before post ddl +SET DEBUG = "d,ddl_log_before_post_ddl"; + +--source include/expect_crash.inc +--error 0,CR_SERVER_LOST,ER_INTERNAL_ERROR +RENAME TABLE t1 TO test2.t2; + +--echo # expect that both base tablespace and vidx tablespace are not renamed +--echo files in test/ +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test/ +--echo files in test2/ +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test2/ + +--echo # expect that rename is committed after crash recovery +--source include/start_mysqld_no_echo.inc + +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t1; +SHOW CREATE TABLE test2.t2; +--echo files in test/ +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test/ +--echo files in test2/ +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test2/ + +SET DEBUG = '+d,skip_dd_table_access_check'; +SELECT count(*) AS `Expected as 0` FROM mysql.innodb_ddl_log; + +RENAME TABLE test2.t2 TO t1; +DROP DATABASE test2; + +--echo +--echo # 4. Failed or crash during TRUNCATE +--echo # 4.1 whole DDL is failed because DDL of vidx table is failed +SET DEBUG = "d,failed_before_vidx_ddl"; + +--error ER_VECTOR_INDEX_FAILED +TRUNCATE TABLE t1; + +--echo # expect that both base tablespace and vidx tablespace are not truncated +SHOW CREATE TABLE t1; +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test/ + +--echo # 4.2 crash before rename vidx table +SET DEBUG = "d,crash_before_vidx_ddl"; + +--source include/expect_crash.inc +--error 0,CR_SERVER_LOST,ER_INTERNAL_ERROR +TRUNCATE TABLE t1; + +--echo # expect that both base tablespace and vidx tablespace are not truncated +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test/ | grep -v '^#' + +--echo # expect that truncation is rollback after crash recovery +--source include/start_mysqld_no_echo.inc + +SHOW CREATE TABLE t1; +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test/ + +--echo # 4.3 crash before post ddl +SET DEBUG = "d,ddl_log_before_post_ddl"; + +--source include/expect_crash.inc +--error 0,CR_SERVER_LOST,ER_INTERNAL_ERROR +TRUNCATE TABLE t1; + +--echo # expect that both base tablespace and vidx tablespace are not truncated +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test/ | grep -v '^#' + +--echo # expect that truncation is committed after crash recovery +--source include/start_mysqld_no_echo.inc + +SHOW CREATE TABLE t1; +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test/ + +SET DEBUG = '+d,skip_dd_table_access_check'; +SELECT count(*) AS `Expected as 0` FROM mysql.innodb_ddl_log; + +--echo +--echo # 5. Failed or crash during DROP +--echo # 5.1 whole DDL is failed because DDL of vidx table is failed +SET DEBUG = "d,failed_before_vidx_ddl"; + +--error ER_VECTOR_INDEX_FAILED +DROP TABLE t1; + +--echo # expect that both base tablespace and vidx tablespace are not dropped +SHOW CREATE TABLE t1; +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test/ + +--echo # 5.2 crash before rename vidx table +SET DEBUG = "d,crash_before_vidx_ddl"; + +--source include/expect_crash.inc +--error 0,CR_SERVER_LOST,ER_INTERNAL_ERROR +DROP TABLE t1; + +--echo # expect that both base tablespace and vidx tablespace are not dropped +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test/ + +--echo # expect that drop is rollback after crash recovery +--source include/start_mysqld_no_echo.inc + +SHOW CREATE TABLE t1; +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test/ + +--echo # 5.3 crash before post ddl +SET DEBUG = "d,ddl_log_before_post_ddl"; + +--source include/expect_crash.inc +--error 0,CR_SERVER_LOST,ER_INTERNAL_ERROR +DROP TABLE t1; + +--echo # expect that both base tablespace and vidx tablespace are not dropped +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test/ + +--echo # expect that drop is committed after crash recovery +--source include/start_mysqld_no_echo.inc + +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t1; +--replace_regex /vidx_.*_00\.ibd/vidx_#_00\.ibd/ +--exec ls $MYSQLD_DATADIR/test/ + +SET DEBUG = '+d,skip_dd_table_access_check'; +SELECT count(*) AS `Expected as 0` FROM mysql.innodb_ddl_log; diff --git a/mysql-test/suite/rds/t/vidx_dml.test b/mysql-test/suite/rds/t/vidx_dml.test new file mode 100644 index 00000000000..42ddba4054f --- /dev/null +++ b/mysql-test/suite/rds/t/vidx_dml.test @@ -0,0 +1,122 @@ +########################################## +# The DML for VECTOR INDEX # +########################################## +--source include/have_binlog_format_mixed_or_row.inc + +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +SET GLOBAL vidx_disabled = OFF; +SET transaction_isolation = 'READ-COMMITTED'; + +--echo # 1. Prepare +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + a INT NOT NULL, + v VECTOR(5), + INDEX (a), + VECTOR INDEX vi(v) + ) ENGINE = InnoDB; +SHOW CREATE TABLE t1; + +--echo +--echo # 2. Insert 100 rows +--disable_warnings +INSERT INTO t1(a, v) SELECT 1, VEC_FROMTEXT(CONCAT('[', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ']')); + +--disable_query_log +let $i=99; +while ($i) +{ + INSERT INTO t1(a, v) SELECT 1, VEC_FROMTEXT(CONCAT('[', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ']')); + dec $i; +} +--enable_query_log + +--echo +--echo # 3. Delete +DELETE FROM t1 WHERE id % 3 = 0; + +--echo +--echo # 4. Update +UPDATE t1 SET v = (SELECT VEC_FROMTEXT(CONCAT('[', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ']'))) WHERE id % 3 = 1; + +--echo +--echo # 5. Select +SELECT COUNT(*) FROM t1; + +--echo # expect to use vector index scan +EXPLAIN SELECT * FROM t1 ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) limit 16; +EXPLAIN SELECT * FROM t1 WHERE id>1 ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) limit 16; +EXPLAIN SELECT * FROM t1 WHERE a=1 ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) limit 16; +EXPLAIN SELECT VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) AS distance FROM t1 ORDER BY distance limit 16; + +--echo # expect to use JT_ALL +EXPLAIN SELECT * FROM t1 ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) limit 17; +EXPLAIN SELECT * FROM t1 WHERE id>1 ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) limit 17; +EXPLAIN SELECT * FROM t1 WHERE a=1 ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) limit 17; +EXPLAIN SELECT VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) AS distance FROM t1 ORDER BY distance limit 17; + +--echo # expect to use SK range +EXPLAIN SELECT * FROM t1 WHERE a>1 ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) limit 1; + +--echo # FORCE INDEX +EXPLAIN SELECT * FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) limit 16; +EXPLAIN SELECT * FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")); +EXPLAIN SELECT * FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) limit 100; +--enable_warnings + +--echo # select using VIEW +# MDEV-35922 +CREATE VIEW `view1` AS SELECT * FROM t1; +--disable_result_log +SELECT id, VEC_TOTEXT(v) FROM `view1` ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) limit 1; +SELECT id, VEC_TOTEXT(v) FROM `view1` ORDER BY VEC_DISTANCE_EUCLIDEAN(VEC_FROMTEXT("[1,2,3,4,5]"), v) limit 1; +--enable_result_log +DROP VIEW `view1`; + +--echo +--echo # 6. Select using prepare stmt +PREPARE stmt FROM 'SELECT id FROM t1 ORDER BY vec_distance_euclidean(v, ?) LIMIT ?'; +SET @vec = VEC_FROMTEXT("[1,2,3,4,5]"); +SET @limit = 10; +--disable_result_log +EXECUTE stmt USING @vec, @limit; +--enable_result_log + +SET @vec = VEC_FROMTEXT("[1,2,3,4]"); +--error ER_WRONG_ARGUMENTS +EXECUTE stmt USING @vec, @limit; + +--echo +--echo # 7. Select using distance with different objects +--echo # numeric +--error ER_WRONG_ARGUMENTS +SELECT * FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, 1) limit 1; +--error ER_WRONG_ARGUMENTS +SELECT * FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, 1) limit 1; + +--error ER_WRONG_ARGUMENTS +SELECT * FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, 1.1) limit 1; +--error ER_WRONG_ARGUMENTS +SELECT * FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, 1.1) limit 1; + +--echo # string with different length +--error ER_WRONG_ARGUMENTS +SELECT * FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, "1.1") limit 1; +--error ER_WRONG_ARGUMENTS +SELECT * FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, "1.1") limit 1; + +--echo # string with same length +--disable_result_log +SELECT * FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") limit 1; +SELECT * FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") limit 1; +--enable_result_log + +--echo +--echo # 8. Delete all +DELETE FROM t1; + +--echo +--echo # 9. Clear +DROP TABLE t1; + +SET GLOBAL vidx_disabled = ON; diff --git a/mysql-test/suite/rds/t/vidx_fix_71283799.test b/mysql-test/suite/rds/t/vidx_fix_71283799.test new file mode 100644 index 00000000000..aeb50c943d0 --- /dev/null +++ b/mysql-test/suite/rds/t/vidx_fix_71283799.test @@ -0,0 +1,41 @@ +################################################################################ +# Bug: aone#71283799 srv_purge_thread holds SHARED_READ MDL locks on vector # +# index auxiliary tables, blocking DDL operations. # +# Fix: Release the MDL lock immediately after accessing auxiliary table # +# metadata in build_hlindex_key. # +################################################################################ +--source include/have_debug.inc +--source include/have_binlog_format_mixed_or_row.inc + +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +SET GLOBAL vidx_disabled = OFF; +SET transaction_isolation = 'READ-COMMITTED'; + +--echo # Prepare a vector table in other database. +CREATE DATABASE test2; +CREATE TABLE test2.t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5), + VECTOR INDEX vi(v) + ) ENGINE = InnoDB; + +INSERT INTO test2.t1 SELECT 1, VEC_FROMTEXT(CONCAT('[', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ']')); + +--echo # Don't do purge before restart. +SET GLOBAL debug="d,do_not_meta_lock_in_background"; + +--echo # Delete data. +DELETE FROM test2.t1 where id = 1; + +--echo # Restart and wait until all purged. +--source include/restart_mysqld_no_echo.inc +--source include/wait_innodb_all_purged.inc + +--echo # Before this patch, purge thread holds MDL SR locks on auxiliary tables. +SELECT COUNT(1) FROM performance_schema.metadata_locks WHERE OBJECT_SCHEMA='test2'; + +--echo # Before this patch, DDL about test2.t1 will hang. +DROP TABLE test2.t1; +DROP DATABASE test2; + +SET GLOBAL vidx_disabled = ON; diff --git a/mysql-test/suite/rds/t/vidx_fix_71294192.test b/mysql-test/suite/rds/t/vidx_fix_71294192.test new file mode 100644 index 00000000000..a1828dce570 --- /dev/null +++ b/mysql-test/suite/rds/t/vidx_fix_71294192.test @@ -0,0 +1,31 @@ +################################################################################ +# Bug: aone#71294192 Can't find auxiliary table in dd if DROP vector table # +# before its dict_table_t is opened. # +# Fix: 1. Use correct db name to find auxiliary table. # +# 2. Remove '__hlindexes__' after the auxiliary table is dropped before # +# the table is dropped. # +################################################################################ +--source include/have_binlog_format_mixed_or_row.inc + +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +SET GLOBAL vidx_disabled = OFF; +SET transaction_isolation = 'READ-COMMITTED'; + +--echo # Prepare a vector table in other database. +CREATE DATABASE test2; +CREATE TABLE test2.t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5), + VECTOR INDEX vi(v) + ) ENGINE = InnoDB; + +INSERT INTO test2.t1(id, v) SELECT 1, VEC_FROMTEXT(CONCAT('[', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ',', RAND(), ']')); + +--echo # Restart mysqld to ensure the auxiliary table is not opened before dropped. +--source include/restart_mysqld_no_echo.inc + +--echo # Before this patch, the DROP will cause a crash. +DROP TABLE test2.t1; +DROP DATABASE test2; + +SET GLOBAL vidx_disabled = ON; diff --git a/mysql-test/suite/rds/t/vidx_fix_MDEV_37068.test b/mysql-test/suite/rds/t/vidx_fix_MDEV_37068.test new file mode 100644 index 00000000000..cd9cd3aa11d --- /dev/null +++ b/mysql-test/suite/rds/t/vidx_fix_MDEV_37068.test @@ -0,0 +1,19 @@ +--source include/have_binlog_format_mixed_or_row.inc + +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +SET GLOBAL vidx_disabled = OFF; +SET transaction_isolation = 'READ-COMMITTED'; + +--echo # +--echo # MDEV-37068 Can't find record in 't1' on INSERT to Vector table +--echo # +SET sql_mode=''; +create table t1 (v vector (1) not null,vector vec (v),unique vu (v)) engine=innodb; +start transaction; +--error ER_DUP_ENTRY +insert t1 values (VEC_FROMTEXT("[1]")), (VEC_FROMTEXT("[1]")); +insert t1 values (VEC_FROMTEXT("[1]")); +drop table t1; +set sql_mode=default; + +SET GLOBAL vidx_disabled = ON; diff --git a/mysql-test/suite/rds/t/vidx_func.test b/mysql-test/suite/rds/t/vidx_func.test new file mode 100644 index 00000000000..dc1536da5e9 --- /dev/null +++ b/mysql-test/suite/rds/t/vidx_func.test @@ -0,0 +1,82 @@ +############################################# +# The syntax and rules for VECTOR FUNCTION # +############################################# +--source include/have_binlog_format_mixed_or_row.inc + +SET GLOBAL vidx_disabled = OFF; +SET transaction_isolation = 'READ-COMMITTED'; + +--echo # 1. SUPPORT about VECTOR functions +SELECT VECTOR_DIM(VEC_FROMTEXT("[1,2,3,4,5]")); +SELECT VEC_TOTEXT(x'e360d63ebe554f3fcdbc523f4522193f5236083d'); +SELECT VEC_TOTEXT("abcd"); +SELECT VEC_TOTEXT(VEC_FROMTEXT("[1,2,3,4,5]")); +SELECT VEC_DISTANCE_EUCLIDEAN(VEC_FROMTEXT("[1,2,3,4,5]"), VEC_FROMTEXT("[1,2,3,4,5]")); +SELECT VEC_DISTANCE_EUCLIDEAN(VEC_FROMTEXT("[1,2,3,4,5]"), VEC_FROMTEXT("[1,2,3,4,5.1]")); +SELECT VEC_DISTANCE_COSINE(VEC_FROMTEXT("[1,2,3,4,5]"), VEC_FROMTEXT("[1,2,3,4,5]")); +SELECT VEC_DISTANCE_COSINE(VEC_FROMTEXT("[1,2,3,4,5]"), VEC_FROMTEXT("[1,2,3,4,5.1]")); + +--echo # NULL, empty vector is allowed in VEC_TOTEXT and VECTOR_DIM +SELECT VEC_TOTEXT(x''); +SELECT VEC_TOTEXT(NULL); + +SELECT VECTOR_DIM(x''); +SELECT VECTOR_DIM(NULL); + +--echo # NULL vector is allowed in VEC_FROMTEXT +SELECT VEC_FROMTEXT(NULL); + +--echo +--echo # 3. NONSUPPORT about VECTOR functions +--echo # The length of arguments should be able to converted to a vector dimension +--error ER_VECTOR_BINARY_FORMAT_INVALID +SELECT VEC_TOTEXT("abc"); + +--echo # Invalid binary format +--error ER_TO_VECTOR_CONVERSION +SELECT VEC_FROMTEXT("1,2,3,4,5]"); +--error ER_TO_VECTOR_CONVERSION +SELECT VEC_FROMTEXT(""); + +--echo # The number of arguments is not correct +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT VEC_TOTEXT(); + +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT VECTOR_DIM(); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT VECTOR_DIM(VEC_FROMTEXT("[1,2,3,4,5]"), VEC_FROMTEXT("[1,2,3,4,5]")); + +--echo # The distance tween two vectors having different dimensions should be NULL +SELECT VEC_DISTANCE_EUCLIDEAN(VEC_FROMTEXT("[1,2,3,4,5]"), VEC_FROMTEXT("[1,2,3,4]")); +SELECT VEC_DISTANCE_EUCLIDEAN(VEC_FROMTEXT("[1,2,3,4,5]"), NULL); +SELECT VEC_DISTANCE_COSINE(VEC_FROMTEXT("[1,2,3,4,5]"), VEC_FROMTEXT("[1,2,3,4,5,6]")); +SELECT VEC_DISTANCE_COSINE(NULL, VEC_FROMTEXT("[1,2,3,4,5,6]")); +SELECT VEC_DISTANCE_COSINE(NULL, NULL); + +--echo +--echo # 4. DML using vector functions +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5) + ); + +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,5]")); +INSERT INTO t1(v) VALUES (TO_VECTOR("[1.1,2.1,3.1,4.1,5.1]")); +INSERT INTO t1(v) VALUES (STRING_TO_VECTOR("[1.2,2.2,3.2,4.2,5.2]")); +INSERT INTO t1(v) VALUES (x'e360d63ebe554f3fcdbc523f4522193f5236083d'); + +SELECT id, VEC_TOTEXT(v) FROM t1; +SELECT VECTOR_DIM(v) FROM t1; +SELECT VEC_TOTEXT(v) FROM t1; +SELECT FROM_VECTOR(v) FROM t1; +SELECT VECTOR_TO_STRING(v) FROM t1; + +SELECT id, VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) FROM t1; +SELECT id, VEC_DISTANCE_COSINE(v, VEC_FROMTEXT("[1,2,3,4,5]")) FROM t1; + +SELECT id FROM t1 ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")); + +DROP TABLE t1; + +SET GLOBAL vidx_disabled = ON; diff --git a/mysql-test/suite/rds/t/vidx_rpl.test b/mysql-test/suite/rds/t/vidx_rpl.test new file mode 100644 index 00000000000..1d2a63b569b --- /dev/null +++ b/mysql-test/suite/rds/t/vidx_rpl.test @@ -0,0 +1,133 @@ +########################################## +# The transaction for VECTOR INDEX # +########################################## +--source include/have_binlog_format_mixed_or_row.inc +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); + +--source include/master-slave.inc + +--source include/rpl_connection_slave.inc +SET GLOBAL vidx_disabled = OFF; + +--source include/rpl_connection_master.inc +SET GLOBAL vidx_disabled = OFF; + +--echo +--echo # 1. Test ddl log event +--echo # a. Show query binlog records vector column as /*!99999 vector(X) */ varbinary(4*X) +--echo # vector index as index not existing +--echo # b. Check operation of vector index can't be in one query with other operations +let $binlog_start = query_get_value("SHOW MASTER STATUS", Position, 1); +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5), + VECTOR INDEX vi(v) + ) ENGINE = InnoDB; +--source include/show_binlog_events.inc + +let $binlog_start = query_get_value("SHOW MASTER STATUS", Position, 1); +ALTER TABLE t1 ADD COLUMN `v2` vector(10); +--source include/show_binlog_events.inc + +let $binlog_start = query_get_value("SHOW MASTER STATUS", Position, 1); +--error ER_NOT_SUPPORTED_YET +ALTER TABLE t1 RENAME INDEX `vi` TO `vi2`, DROP COLUMN `v2`; +ALTER TABLE t1 RENAME INDEX `vi` TO `vi2`; +--source include/show_binlog_events.inc + +let $binlog_start = query_get_value("SHOW MASTER STATUS", Position, 1); +--error ER_NOT_SUPPORTED_YET +ALTER TABLE t1 DROP INDEX `vi2`, DROP COLUMN `v2`; +ALTER TABLE t1 DROP INDEX `vi2`; +--source include/show_binlog_events.inc + +let $binlog_start = query_get_value("SHOW MASTER STATUS", Position, 1); +CREATE VECTOR INDEX `vi` ON t1(v); +--source include/show_binlog_events.inc + +let $binlog_start = query_get_value("SHOW MASTER STATUS", Position, 1); +DROP INDEX `vi` ON t1; +--source include/show_binlog_events.inc + +--source include/sync_slave_sql_with_master.inc +--source include/rpl_connection_slave.inc +SHOW CREATE TABLE t1; + +--echo +--echo # 2. Test dml in transactions +--echo # Prepare +--source include/rpl_connection_master.inc +SET transaction_isolation = 'READ-COMMITTED'; + +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5), + VECTOR INDEX vi(v) + ) ENGINE = InnoDB; +--disable_warnings + +--echo # Insert data using transactions +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,10]")); +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,9]")); + +BEGIN; + +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,8]")); + +SAVEPOINT sp1; + +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,7]")); + +SAVEPOINT sp2; + +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,6]")); + +ROLLBACK TO SAVEPOINT sp2; + +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,5]")); + +COMMIT; + +BEGIN; +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,4]")); +ROLLBACK; + +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,3]")); +--source include/rpl_sync.inc + +--echo +--echo # Validate data in mater +SELECT id, VEC_TOTEXT(v) FROM t1; + +EXPLAIN SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; +SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; + +EXPLAIN SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; +SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; + +--echo +--echo # Validate data in slave +--source include/rpl_connection_slave.inc +SET transaction_isolation = 'READ-COMMITTED'; + +SELECT id, VEC_TOTEXT(v) FROM t1; + +EXPLAIN SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; +SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; + +EXPLAIN SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; +SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; + +--echo +--echo # 3. Clear +--enable_warnings +SET GLOBAL vidx_disabled = ON; + +--source include/rpl_connection_master.inc +DROP TABLE t1; + +SET GLOBAL vidx_disabled = ON; + +--source include/rpl_sync.inc +--source include/rpl_end.inc diff --git a/mysql-test/suite/rds/t/vidx_support_nullable.test b/mysql-test/suite/rds/t/vidx_support_nullable.test new file mode 100644 index 00000000000..8696da0e8b7 --- /dev/null +++ b/mysql-test/suite/rds/t/vidx_support_nullable.test @@ -0,0 +1,35 @@ +--source include/have_binlog_format_mixed_or_row.inc + +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +SET GLOBAL vidx_disabled = OFF; +SET transaction_isolation = 'READ-COMMITTED'; + +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + a INT, + v VECTOR(5), + VECTOR INDEX vi(v) + ) ENGINE = InnoDB; +SHOW CREATE TABLE t1; + +INSERT INTO t1 VALUES(1, 1, NULL); +INSERT INTO t1 VALUES(2, 2, VEC_FROMTEXT("[1,2,3,4,5]")); +INSERT INTO t1 VALUES(3, 3, NULL); +INSERT INTO t1 VALUES(4, 4, NULL); + +DELETE FROM t1 WHERE id = 1; +UPDATE t1 SET v = NULL WHERE id = 2; +UPDATE t1 SET v = VEC_FROMTEXT("[1,2,3,4,5]") WHERE id = 3; +UPDATE t1 SET a=5 WHERE id = 4; + +SELECT id, a, VEC_TOTEXT(v) FROM t1; + +--echo # Rows with NULL vector columns cannot be found using the vector index. +SELECT id, a, VEC_TOTEXT(v), VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) as dis FROM t1 FORCE INDEX(`vi`) ORDER BY dis; + +--echo # Rows with NULL distances to target will be placed at the end of the result set. +SELECT id, a, VEC_TOTEXT(v), VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) as dis FROM t1 FORCE INDEX(PRIMARY) ORDER BY dis; + +DROP TABLE t1; + +SET GLOBAL vidx_disabled = ON; diff --git a/mysql-test/suite/rds/t/vidx_trx.test b/mysql-test/suite/rds/t/vidx_trx.test new file mode 100644 index 00000000000..0bf20c34efe --- /dev/null +++ b/mysql-test/suite/rds/t/vidx_trx.test @@ -0,0 +1,61 @@ +########################################## +# The transaction for VECTOR INDEX # +########################################## +--source include/have_binlog_format_mixed_or_row.inc +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +SET GLOBAL vidx_disabled = OFF; +SET transaction_isolation = 'READ-COMMITTED'; + +--echo # 1. Prepare +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + v VECTOR(5), + VECTOR INDEX vi(v) + ) ENGINE = InnoDB; +--disable_warnings + +--echo +--echo # 2. Insert data using transactions +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,10]")); +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,9]")); + +BEGIN; + +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,8]")); + +SAVEPOINT sp1; + +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,7]")); + +SAVEPOINT sp2; + +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,6]")); + +ROLLBACK TO SAVEPOINT sp2; + +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,5]")); + +COMMIT; + +BEGIN; +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,4]")); +ROLLBACK; + +INSERT INTO t1(v) VALUES (VEC_FROMTEXT("[1,2,3,4,3]")); + +--echo +--echo # 3. Validate data +SELECT id, VEC_TOTEXT(v) FROM t1; + +EXPLAIN SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; +SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(PRIMARY) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; + +EXPLAIN SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; +SELECT id, VEC_TOTEXT(v) FROM t1 FORCE INDEX(`vi`) ORDER BY VEC_DISTANCE_EUCLIDEAN(v, VEC_FROMTEXT("[1,2,3,4,5]")) LIMIT 5; + +--echo +--echo # 4. Clear +--enable_warnings +DROP TABLE t1; + +SET GLOBAL vidx_disabled = ON; diff --git a/mysql-test/suite/rpl/r/rpl_conditional_comments.result b/mysql-test/suite/rpl/r/rpl_conditional_comments.result index ac48dbf7c90..7b88acadd6c 100644 --- a/mysql-test/suite/rpl/r/rpl_conditional_comments.result +++ b/mysql-test/suite/rpl/r/rpl_conditional_comments.result @@ -12,11 +12,11 @@ master-bin.000001 # Query # # use `test`; CREATE TABLE t1(c1 INT) # ------------------------------------------------------------------ # In a statement, some CCs are applied while others are not. The CCs # which are not applied on master will be binlogged as common comments. -/*!99999 --- */INSERT /*!INTO*/ /*!10000 t1 */ VALUES(10) /*!99999 ,(11)*/; +/*!99998 --- */INSERT /*!INTO*/ /*!10000 t1 */ VALUES(10) /*!99998 ,(11)*/; include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Query # # BEGIN -master-bin.000001 # Query # # use `test`; /* 99999 --- */INSERT /*!INTO*/ /*!10000 t1 */ VALUES(10) /* 99999 ,(11)*/ +master-bin.000001 # Query # # use `test`; /* 99998 --- */INSERT /*!INTO*/ /*!10000 t1 */ VALUES(10) /* 99998 ,(11)*/ master-bin.000001 # Query # # COMMIT include/sync_slave_sql_with_master.inc include/diff_tables.inc [master:t1,slave:t1] @@ -25,7 +25,7 @@ include/diff_tables.inc [master:t1,slave:t1] # ----------------------------------------------------------------- # Verify whether it can be binlogged correctly when executing prepared # statement. -PREPARE stmt FROM 'INSERT INTO /*!99999 blabla*/ t1 VALUES(60) /*!99999 ,(61)*/'; +PREPARE stmt FROM 'INSERT INTO /*!99998 blabla*/ t1 VALUES(60) /*!99998 ,(61)*/'; EXECUTE stmt; DROP TABLE t1; CREATE TABLE t1(c1 INT); @@ -34,7 +34,7 @@ include/sync_slave_sql_with_master.inc include/diff_tables.inc [master:t1,slave:t1] SET @value=62; -PREPARE stmt FROM 'INSERT INTO /*!99999 blabla */ t1 VALUES(?) /*!99999 ,(63)*/'; +PREPARE stmt FROM 'INSERT INTO /*!99998 blabla */ t1 VALUES(?) /*!99998 ,(63)*/'; EXECUTE stmt USING @value; DROP TABLE t1; CREATE TABLE t1(c1 INT); @@ -42,20 +42,20 @@ EXECUTE stmt USING @value; include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Query # # BEGIN -master-bin.000001 # Query # # use `test`; INSERT INTO /* 99999 blabla*/ t1 VALUES(60) /* 99999 ,(61)*/ +master-bin.000001 # Query # # use `test`; INSERT INTO /* 99998 blabla*/ t1 VALUES(60) /* 99998 ,(61)*/ master-bin.000001 # Query # # COMMIT master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */ master-bin.000001 # Query # # use `test`; CREATE TABLE t1(c1 INT) master-bin.000001 # Query # # BEGIN -master-bin.000001 # Query # # use `test`; INSERT INTO /* 99999 blabla*/ t1 VALUES(60) /* 99999 ,(61)*/ +master-bin.000001 # Query # # use `test`; INSERT INTO /* 99998 blabla*/ t1 VALUES(60) /* 99998 ,(61)*/ master-bin.000001 # Query # # COMMIT master-bin.000001 # Query # # BEGIN -master-bin.000001 # Query # # use `test`; INSERT INTO /* 99999 blabla */ t1 VALUES(62) /* 99999 ,(63)*/ +master-bin.000001 # Query # # use `test`; INSERT INTO /* 99998 blabla */ t1 VALUES(62) /* 99998 ,(63)*/ master-bin.000001 # Query # # COMMIT master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */ master-bin.000001 # Query # # use `test`; CREATE TABLE t1(c1 INT) master-bin.000001 # Query # # BEGIN -master-bin.000001 # Query # # use `test`; INSERT INTO /* 99999 blabla */ t1 VALUES(62) /* 99999 ,(63)*/ +master-bin.000001 # Query # # use `test`; INSERT INTO /* 99998 blabla */ t1 VALUES(62) /* 99998 ,(63)*/ master-bin.000001 # Query # # COMMIT include/sync_slave_sql_with_master.inc include/diff_tables.inc [master:t1,slave:t1] @@ -64,8 +64,8 @@ include/diff_tables.inc [master:t1,slave:t1] # ----------------------------------------------------------------- # Verify it can restore the '!', if the it is an uncomplete conditional # comments -SELECT c1 FROM /*!99999 t1 WHEREN; -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '/*!99999 t1 WHEREN' at line 1 +SELECT c1 FROM /*!99998 t1 WHEREN; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '/*!99998 t1 WHEREN' at line 1 # # Bug#53373 Comments are not properly removed from the # pre-processed query buffer. diff --git a/mysql-test/suite/rpl/t/rpl_conditional_comments.test b/mysql-test/suite/rpl/t/rpl_conditional_comments.test index 2a4c66b1132..4755daa0339 100644 --- a/mysql-test/suite/rpl/t/rpl_conditional_comments.test +++ b/mysql-test/suite/rpl/t/rpl_conditional_comments.test @@ -4,7 +4,7 @@ # master. So they become common comments and will not be applied on slave. # # - Example: -# 'INSERT INTO t1 VALUES (1) /*!10000, (2)*/ /*!99999 ,(3)*/ +# 'INSERT INTO t1 VALUES (1) /*!10000, (2)*/ /*!99998 ,(3)*/ # will be binlogged as # 'INSERT INTO t1 VALUES (1) /*!10000, (2)*/ /* 99999 ,(3)*/'. ############################################################################### @@ -23,7 +23,7 @@ let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1); --echo # In a statement, some CCs are applied while others are not. The CCs --echo # which are not applied on master will be binlogged as common comments. -/*!99999 --- */INSERT /*!INTO*/ /*!10000 t1 */ VALUES(10) /*!99999 ,(11)*/; +/*!99998 --- */INSERT /*!INTO*/ /*!10000 t1 */ VALUES(10) /*!99998 ,(11)*/; source include/show_binlog_events.inc; let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1); @@ -37,7 +37,7 @@ let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1); --echo # Verify whether it can be binlogged correctly when executing prepared --echo # statement. --connection master -PREPARE stmt FROM 'INSERT INTO /*!99999 blabla*/ t1 VALUES(60) /*!99999 ,(61)*/'; +PREPARE stmt FROM 'INSERT INTO /*!99998 blabla*/ t1 VALUES(60) /*!99998 ,(61)*/'; EXECUTE stmt; DROP TABLE t1; CREATE TABLE t1(c1 INT); @@ -50,7 +50,7 @@ EXECUTE stmt; --connection master --echo SET @value=62; -PREPARE stmt FROM 'INSERT INTO /*!99999 blabla */ t1 VALUES(?) /*!99999 ,(63)*/'; +PREPARE stmt FROM 'INSERT INTO /*!99998 blabla */ t1 VALUES(?) /*!99998 ,(63)*/'; EXECUTE stmt USING @value; DROP TABLE t1; CREATE TABLE t1(c1 INT); @@ -70,7 +70,7 @@ let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1); --echo # comments --connection master --error 1064 -SELECT c1 FROM /*!99999 t1 WHEREN; +SELECT c1 FROM /*!99998 t1 WHEREN; --echo # diff --git a/mysql-test/suite/rpl_nogtid/r/rpl_loaddatalocal.result b/mysql-test/suite/rpl_nogtid/r/rpl_loaddatalocal.result index 8e857623c91..0096edfd7f9 100644 --- a/mysql-test/suite/rpl_nogtid/r/rpl_loaddatalocal.result +++ b/mysql-test/suite/rpl_nogtid/r/rpl_loaddatalocal.result @@ -79,7 +79,7 @@ LOAD DATA /*!10000 LOCAL INFILE 'MYSQLD_DATADIR/bug43746.sql' INTO TABLE */ t1; LOAD DATA/*!10000 LOCAL */INFILE 'MYSQLD_DATADIR/bug43746.sql'/*!10000 INTO*/TABLE t1; LOAD DATA/*!10000 LOCAL */INFILE 'MYSQLD_DATADIR/bug43746.sql'/* empty */INTO TABLE t1; LOAD DATA/*!10000 LOCAL */INFILE 'MYSQLD_DATADIR/bug43746.sql' INTO/* empty */TABLE t1; -LOAD/*!99999 special comments that do not expand */DATA/*!99999 code from the future */LOCAL INFILE 'MYSQLD_DATADIR/bug43746.sql'/*!99999 have flux capacitor */INTO/*!99999 will travel */TABLE t1; +LOAD/*!99998 special comments that do not expand */DATA/*!99998 code from the future */LOCAL INFILE 'MYSQLD_DATADIR/bug43746.sql'/*!99998 have flux capacitor */INTO/*!99998 will travel */TABLE t1; SET sql_mode='PIPES_AS_CONCAT,ANSI_QUOTES,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,TRADITIONAL'; LOAD DATA LOCAL INFILE 'MYSQLD_DATADIR/bug43746.sql' INTO TABLE t1; [slave] diff --git a/mysql-test/suite/rpl_nogtid/t/rpl_loaddatalocal.test b/mysql-test/suite/rpl_nogtid/t/rpl_loaddatalocal.test index ca69201851e..556eb3ec79d 100644 --- a/mysql-test/suite/rpl_nogtid/t/rpl_loaddatalocal.test +++ b/mysql-test/suite/rpl_nogtid/t/rpl_loaddatalocal.test @@ -143,7 +143,7 @@ eval LOAD DATA/*!10000 LOCAL */INFILE '$MYSQLD_DATADIR/bug43746.sql'/* empty */I eval LOAD DATA/*!10000 LOCAL */INFILE '$MYSQLD_DATADIR/bug43746.sql' INTO/* empty */TABLE t1; --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR -eval LOAD/*!99999 special comments that do not expand */DATA/*!99999 code from the future */LOCAL INFILE '$MYSQLD_DATADIR/bug43746.sql'/*!99999 have flux capacitor */INTO/*!99999 will travel */TABLE t1; +eval LOAD/*!99998 special comments that do not expand */DATA/*!99998 code from the future */LOCAL INFILE '$MYSQLD_DATADIR/bug43746.sql'/*!99998 have flux capacitor */INTO/*!99998 will travel */TABLE t1; SET sql_mode='PIPES_AS_CONCAT,ANSI_QUOTES,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,TRADITIONAL'; diff --git a/mysql-test/t/comments.test b/mysql-test/t/comments.test index 27e558c9482..8576140ecc9 100644 --- a/mysql-test/t/comments.test +++ b/mysql-test/t/comments.test @@ -9,7 +9,7 @@ multi line comment */; --error 1065 ; select 1 /*!32301 +1 */; -select 1 /*!999999 +1 */; +select 1 /*!99998 +1 */; select 1--1; # Note that the following returns 4 while it should return 2 # This is because the mysqld server doesn't parse -- comments @@ -31,9 +31,9 @@ select 1/*!2*/; --error ER_PARSE_ERROR select 1/*!000002*/; -select 1/*!999992*/; +select 1/*!99992*/; -select 1 + /*!00000 2 */ + 3 /*!99999 noise*/ + 4; +select 1 + /*!00000 2 */ + 3 /*!99998 noise*/ + 4; # # Bug#28779 (mysql_query() allows execution of statements with unbalanced @@ -70,7 +70,7 @@ drop table table_28779; --echo # WL#12099: Deprecate nested comments in 8.0 --echo # -SELECT 1 /*!99999 /* */ */; +SELECT 1 /*!99998 /* */ */; SELECT 2 /*!12345 /* */ */; SELECT 3 /*! /* */ */; @@ -97,7 +97,8 @@ DO 1 /*!80034 +1*/; DO 1 /*!80034 +1*/; --echo # Carriage return (0x0d). Should pass without warning. -DO 1 /*!80034 +1*/; +DO 1 /*!80034 ++1*/; --echo # Space (0x20). Should pass without warning. DO 1 /*!80034 +1*/; diff --git a/mysql-test/t/no_binlog_gtid_empty_statement.test b/mysql-test/t/no_binlog_gtid_empty_statement.test index 275cd6fe1fa..32ead4662d1 100644 --- a/mysql-test/t/no_binlog_gtid_empty_statement.test +++ b/mysql-test/t/no_binlog_gtid_empty_statement.test @@ -23,11 +23,11 @@ USE test; --source include/set_gtid_next.inc CREATE TABLE t1 (c1 INT); # This statement should be considered an empty statement -/*!99999 SET @@SESSION.non_supported_session_variable = 1*/; +/*!99998 SET @@SESSION.non_supported_session_variable = 1*/; --source include/set_gtid_next.inc INSERT INTO t1 VALUES (1); # This statement should be considered an empty statement -/*!99999 SET @@SESSION.non_supported_session_variable = 1*/; +/*!99998 SET @@SESSION.non_supported_session_variable = 1*/; --source include/set_gtid_next.inc DROP TABLE t1; @@ -46,11 +46,11 @@ RESET MASTER; --source include/set_gtid_next.inc CREATE TABLE t2 (c1 INT); # This statement should be considered an empty statement -/*!99999 SET @@SESSION.non_supported_session_variable = 1*/; +/*!99998 SET @@SESSION.non_supported_session_variable = 1*/; --source include/set_gtid_next.inc INSERT INTO t2 VALUES (1); # This statement should be considered an empty statement -/*!99999 SET @@SESSION.non_supported_session_variable = 1*/; +/*!99998 SET @@SESSION.non_supported_session_variable = 1*/; --source include/set_gtid_next.inc DROP TABLE t2; diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index d6a28310294..c32ed072f57 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -7112,7 +7112,7 @@ begin /*! select 2; */ select 3; /*!00000 select 4; */ - /*!99999 select 5; */ + /*!99998 select 5; */ end $$ @@ -7120,7 +7120,7 @@ create procedure proc_25411_b( /* real comment */ /*! p1 int, */ /*!00000 p2 int */ -/*!99999 ,p3 int */ +/*!99998 ,p3 int */ ) begin select p1, p2; @@ -7129,11 +7129,11 @@ $$ create procedure proc_25411_c() begin - select 1/*!,2*//*!00000,3*//*!99999,4*/; - select 1/*! ,2*//*!00000 ,3*//*!99999 ,4*/; - select 1/*!,2 *//*!00000,3 *//*!99999,4 */; - select 1/*! ,2 *//*!00000 ,3 *//*!99999 ,4 */; - select 1 /*!,2*/ /*!00000,3*/ /*!99999,4*/ ; + select 1/*!,2*//*!00000,3*//*!99998,4*/; + select 1/*! ,2*//*!00000 ,3*//*!99998 ,4*/; + select 1/*!,2 *//*!00000,3 *//*!99998,4 */; + select 1/*! ,2 *//*!00000 ,3 *//*!99998 ,4 */; + select 1 /*!,2*/ /*!00000,3*/ /*!99998,4*/ ; end $$ diff --git a/mysys/CMakeLists.txt b/mysys/CMakeLists.txt index b3e1cca7215..5d36f9ba20a 100644 --- a/mysys/CMakeLists.txt +++ b/mysys/CMakeLists.txt @@ -123,6 +123,7 @@ SET(MYSYS_SOURCES my_md5.cc my_rnd.cc my_openssl_fips.cc + hash.cc ) LIST(APPEND MYSYS_SOURCES my_aes_openssl.cc) diff --git a/mysys/array.cc b/mysys/array.cc index 0c85c6e4423..8120f3852e0 100644 --- a/mysys/array.cc +++ b/mysys/array.cc @@ -185,3 +185,21 @@ void delete_dynamic(DYNAMIC_ARRAY *array) { array->elements = array->max_element = 0; } } + +/* + Pop last element from array. + + SYNOPSIS + pop_dynamic() + array + + RETURN VALUE + pointer Ok + 0 Array is empty +*/ + +void *pop_dynamic(DYNAMIC_ARRAY *array) { + if (array->elements) + return array->buffer + (--array->elements * array->size_of_element); + return 0; +} diff --git a/mysys/hash.cc b/mysys/hash.cc new file mode 100644 index 00000000000..3ac66e736ce --- /dev/null +++ b/mysys/hash.cc @@ -0,0 +1,826 @@ +/* Copyright (c) 2000, 2010, Oracle and/or its affiliates. + Copyright (c) 2011, 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 St, Fifth Floor, Boston, MA 02110-1335 USA */ + +/* The hash functions used for saveing keys */ +/* One of key_length or key_length_offset must be given */ +/* Key length of 0 isn't allowed */ + +#include "vidx/hash.h" +#include +#include +#include "my_dbug.h" +#include "mysys_priv.h" + +#define NO_RECORD ~((my_hash_value_type)0) +#define LOWFIND 1 +#define LOWUSED 2 +#define HIGHFIND 4 +#define HIGHUSED 8 + +typedef struct st_hash_info { + uint32 next; /* index to next key */ + my_hash_value_type hash_nr; + uchar *data; /* data for current entry */ +} HASH_LINK; + +static uint my_hash_mask(my_hash_value_type hashnr, size_t buffmax, + size_t maxlength); +static void movelink(HASH_LINK *array, uint pos, uint next_link, uint newlink); +static int hashcmp(const HASH *hash, HASH_LINK *pos, const uchar *key, + size_t length); + +my_hash_value_type my_hash_sort(CHARSET_INFO *cs, const uchar *key, + size_t length) { + ulong nr1 = 1, nr2 = 4; + my_ci_hash_sort(cs, (uchar *)key, length, &nr1, &nr2); + return (my_hash_value_type)nr1; +} + +/** + @brief Initialize the hash + + @details + + Initialize the hash, by defining and giving valid values for + its elements. The failure to allocate memory for the + hash->array element will not result in a fatal failure. The + dynamic array that is part of the hash will allocate memory + as required during insertion. + + @param[in] psi_key The key to register instrumented memory + @param[in,out] hash The hash that is initialized + @param[in] growth_size size incrememnt for the underlying dynarray + @param[in] charset The character set information + @param[in] size The hash size + @param[in] key_offset The key offset for the hash + @param[in] key_length The length of the key used in + the hash + @param[in] get_key get the key for the hash + @param[in] free_element pointer to the function that + does cleanup + @param[in] flags flags set in the hash + @return indicates success or failure of initialization + @retval 0 success + @retval 1 failure +*/ +my_bool my_hash_init2(PSI_memory_key psi_key, HASH *hash, size_t growth_size, + CHARSET_INFO *charset, size_t size, size_t key_offset, + size_t key_length, my_hash_get_key get_key, + my_hash_function hash_function, + void (*free_element)(void *), uint flags) { + my_bool res; + DBUG_ENTER("my_hash_init2"); + DBUG_PRINT("enter", ("hash:%p size: %u", hash, (uint)size)); + + hash->records = 0; + hash->key_offset = key_offset; + hash->key_length = key_length; + hash->blength = 1; + hash->get_key = get_key; + hash->hash_function = hash_function ? hash_function : my_hash_sort; + hash->free = free_element; + hash->flags = flags; + hash->charset = charset; + res = my_init_dynamic_array(&hash->array, psi_key, sizeof(HASH_LINK), nullptr, + size, growth_size); + DBUG_RETURN(res); +} + +/* + Call hash->free on all elements in hash. + + SYNOPSIS + my_hash_free_elements() + hash hash table + + NOTES: + Sets records to 0 +*/ + +static inline void my_hash_free_elements(HASH *hash) { + uint records = hash->records; + if (records == 0) return; + + /* + Set records to 0 early to guard against anyone looking at the structure + during the free process + */ + hash->records = 0; + + if (hash->free) { + HASH_LINK *data = dynamic_element(&hash->array, 0, HASH_LINK *); + HASH_LINK *end = data + records; + do { + (*hash->free)((data++)->data); + } while (data < end); + } +} + +/* + Free memory used by hash. + + SYNOPSIS + my_hash_free() + hash the hash to delete elements of + + NOTES: Hash can't be reused without calling my_hash_init again. +*/ + +void my_hash_free(HASH *hash) { + DBUG_ENTER("my_hash_free"); + DBUG_PRINT("enter", ("hash:%p elements: %ld", hash, hash->records)); + + my_hash_free_elements(hash); + hash->free = 0; + delete_dynamic(&hash->array); + hash->blength = 0; + DBUG_VOID_RETURN; +} + +/* + Delete all elements from the hash (the hash itself is to be reused). + + SYNOPSIS + my_hash_reset() + hash the hash to delete elements of +*/ + +void my_hash_reset(HASH *hash) { + DBUG_ENTER("my_hash_reset"); + DBUG_PRINT("enter", ("hash:%p", hash)); + + my_hash_free_elements(hash); + reset_dynamic(&hash->array); + /* Set row pointers so that the hash can be reused at once */ + hash->blength = 1; + DBUG_VOID_RETURN; +} + +/* some helper functions */ + +/* + This function is char* instead of uchar* as HPUX11 compiler can't + handle inline functions that are not defined as native types +*/ + +static inline char *my_hash_key(const HASH *hash, const uchar *record, + size_t *length, my_bool first) { + if (hash->get_key) return (char *)(*hash->get_key)(record, length, first); + *length = hash->key_length; + return (char *)record + hash->key_offset; +} + +/* Calculate pos according to keys */ + +static uint my_hash_mask(my_hash_value_type hashnr, size_t buffmax, + size_t maxlength) { + if ((hashnr & (buffmax - 1)) < maxlength) + return (uint)(hashnr & (buffmax - 1)); + return (uint)(hashnr & ((buffmax >> 1) - 1)); +} + +static inline uint my_hash_rec_mask(HASH_LINK *pos, size_t buffmax, + size_t maxlength) { + return my_hash_mask(pos->hash_nr, buffmax, maxlength); +} + +/* for compilers which can not handle inline */ +static +#if !defined(__USLC__) && !defined(__sgi) + inline +#endif + my_hash_value_type + rec_hashnr(HASH *hash, const uchar *record) { + size_t length; + uchar *key = (uchar *)my_hash_key(hash, record, &length, 0); + return hash->hash_function(hash->charset, key, length); +} + +uchar *my_hash_search(const HASH *hash, const uchar *key, size_t length) { + HASH_SEARCH_STATE state; + return my_hash_first(hash, key, length, &state); +} + +uchar *my_hash_search_using_hash_value(const HASH *hash, + my_hash_value_type hash_value, + const uchar *key, size_t length) { + HASH_SEARCH_STATE state; + return my_hash_first_from_hash_value(hash, hash_value, key, length, &state); +} + +/* + Search after a record based on a key + + NOTE + Assigns the number of the found record to HASH_SEARCH_STATE state +*/ + +uchar *my_hash_first(const HASH *hash, const uchar *key, size_t length, + HASH_SEARCH_STATE *current_record) { + uchar *res; + assert(my_hash_inited(hash)); + + res = my_hash_first_from_hash_value( + hash, + hash->hash_function(hash->charset, key, + length ? length : hash->key_length), + key, length, current_record); + return res; +} + +uchar *my_hash_first_from_hash_value(const HASH *hash, + my_hash_value_type hash_value, + const uchar *key, size_t length, + HASH_SEARCH_STATE *current_record) { + HASH_LINK *pos; + DBUG_ENTER("my_hash_first_from_hash_value"); + + if (hash->records) { + uint flag = 1; + uint idx = my_hash_mask(hash_value, hash->blength, hash->records); + if (!length) + length = hash->key_length; // length for fixed length keys or 0 + do { + pos = dynamic_element(&hash->array, idx, HASH_LINK *); + if (!hashcmp(hash, pos, key, length)) { + DBUG_PRINT("exit", ("found key at %d", idx)); + *current_record = idx; + DBUG_RETURN(pos->data); + } + if (flag) { + flag = 0; /* Reset flag */ + if (my_hash_rec_mask(pos, hash->blength, hash->records) != idx) + break; /* Wrong link */ + } + } while ((idx = pos->next) != NO_RECORD); + } + *current_record = NO_RECORD; + DBUG_RETURN(0); +} + +/* Get next record with identical key */ +/* Can only be called if previous calls was my_hash_search */ + +uchar *my_hash_next(const HASH *hash, const uchar *key, size_t length, + HASH_SEARCH_STATE *current_record) { + HASH_LINK *pos; + uint idx; + + if (*current_record != NO_RECORD) { + HASH_LINK *data = dynamic_element(&hash->array, 0, HASH_LINK *); + if (!length) + length = hash->key_length; // length for fixed length keys or 0 + for (idx = data[*current_record].next; idx != NO_RECORD; idx = pos->next) { + pos = data + idx; + if (!hashcmp(hash, pos, key, length)) { + *current_record = idx; + return pos->data; + } + } + *current_record = NO_RECORD; + } + return 0; +} + +/* Change link from pos to new_link */ + +static void movelink(HASH_LINK *array, uint find, uint next_link, + uint newlink) { + HASH_LINK *old_link; + do { + old_link = array + next_link; + } while ((next_link = old_link->next) != find); + old_link->next = newlink; + return; +} + +/* + Compare a key in a record to a whole key. Return 0 if identical + + SYNOPSIS + hashcmp() + hash hash table + pos position of hash record to use in comparison + key key for comparison + length length of key + + NOTES: + length equal 0 can mean 2 things: + 1) it is fixed key length hash (HASH::key_length != 0) and + default length should be taken in this case + 2) it is really 0 length key for variable key length hash + (HASH::key_length == 0) + + RETURN + = 0 key of record == key + != 0 key of record != key + */ + +static int hashcmp(const HASH *hash, HASH_LINK *pos, const uchar *key, + size_t length) { + size_t rec_keylength; + uchar *rec_key; + rec_key = (uchar *)my_hash_key(hash, pos->data, &rec_keylength, 1); + return my_strnncoll(hash->charset, (uchar *)rec_key, rec_keylength, + (uchar *)key, length); +} + +/** + Write a hash-key to the hash-index + + @return + @retval 0 ok + @retval 1 Duplicate key or out of memory +*/ + +my_bool my_hash_insert(HASH *info, const uchar *record) { + int flag; + size_t idx, halfbuff, first_index; + size_t length; + my_hash_value_type current_hash_nr, rec_hash_nr = 0, rec2_hash_nr = 0; + uchar *rec_data = nullptr, *rec2_data = nullptr, *key; + HASH_LINK *data, *empty, *gpos = nullptr, *gpos2 = nullptr, *pos; + + key = (uchar *)my_hash_key(info, record, &length, 1); + current_hash_nr = info->hash_function(info->charset, key, length); + + if (info->flags & HASH_UNIQUE) { + if (my_hash_search_using_hash_value(info, current_hash_nr, key, length)) + return (TRUE); /* Duplicate entry */ + } + + flag = 0; + if (!(empty = (HASH_LINK *)alloc_dynamic(&info->array))) + return (TRUE); /* No more memory */ + + data = dynamic_element(&info->array, 0, HASH_LINK *); + halfbuff = info->blength >> 1; + + idx = first_index = info->records - halfbuff; + if (idx != info->records) /* If some records */ + { + do { + my_hash_value_type hash_nr; + pos = data + idx; + hash_nr = pos->hash_nr; + if (flag == 0) /* First loop; Check if ok */ + if (my_hash_mask(hash_nr, info->blength, info->records) != first_index) + break; + if (!(hash_nr & halfbuff)) { /* Key will not move */ + if (!(flag & LOWFIND)) { + if (flag & HIGHFIND) { + flag = LOWFIND | HIGHFIND; + /* key shall be moved to the current empty position */ + gpos = empty; + rec_data = pos->data; + rec_hash_nr = pos->hash_nr; + empty = pos; /* This place is now free */ + } else { + flag = LOWFIND | LOWUSED; /* key isn't changed */ + gpos = pos; + rec_data = pos->data; + rec_hash_nr = pos->hash_nr; + } + } else { + if (!(flag & LOWUSED)) { + /* Change link of previous LOW-key */ + gpos->data = rec_data; + gpos->hash_nr = rec_hash_nr; + gpos->next = (uint)(pos - data); + flag = (flag & HIGHFIND) | (LOWFIND | LOWUSED); + } + gpos = pos; + rec_data = pos->data; + rec_hash_nr = pos->hash_nr; + } + } else { /* key will be moved */ + if (!(flag & HIGHFIND)) { + flag = (flag & LOWFIND) | HIGHFIND; + /* key shall be moved to the last (empty) position */ + gpos2 = empty; + empty = pos; + rec2_data = pos->data; + rec2_hash_nr = pos->hash_nr; + } else { + if (!(flag & HIGHUSED)) { + /* Change link of previous hash-key and save */ + gpos2->data = rec2_data; + gpos2->hash_nr = rec2_hash_nr; + gpos2->next = (uint)(pos - data); + flag = (flag & LOWFIND) | (HIGHFIND | HIGHUSED); + } + gpos2 = pos; + rec2_data = pos->data; + rec2_hash_nr = pos->hash_nr; + } + } + } while ((idx = pos->next) != NO_RECORD); + + if ((flag & (LOWFIND | LOWUSED)) == LOWFIND) { + gpos->data = rec_data; + gpos->hash_nr = rec_hash_nr; + gpos->next = NO_RECORD; + } + if ((flag & (HIGHFIND | HIGHUSED)) == HIGHFIND) { + gpos2->data = rec2_data; + gpos2->hash_nr = rec2_hash_nr; + gpos2->next = NO_RECORD; + } + } + + idx = my_hash_mask(current_hash_nr, info->blength, info->records + 1); + pos = data + idx; + /* Check if we are at the empty position */ + if (pos == empty) { + pos->next = NO_RECORD; + } else { + /* Move conflicting record to empty position (last) */ + empty[0] = pos[0]; + /* Check if the moved record was in same hash-nr family */ + gpos = data + my_hash_rec_mask(pos, info->blength, info->records + 1); + if (pos == gpos) { + /* Point to moved record */ + pos->next = (uint32)(empty - data); + } else { + pos->next = NO_RECORD; + movelink(data, (uint)(pos - data), (uint)(gpos - data), + (uint)(empty - data)); + } + } + pos->data = (uchar *)record; + pos->hash_nr = current_hash_nr; + if (++info->records == info->blength) info->blength += info->blength; + return (0); +} + +/** + Remove one record from hash-table. + + @fn hash_delete() + @param hash Hash tree + @param record Row to be deleted + + @notes + The record with the same record ptr is removed. + If there is a free-function it's called if record was found. + + hash->free() is guarantee to be called only after the row has been + deleted from the hash and the hash can be reused by other threads. + + @return + @retval 0 ok + @retval 1 Record not found +*/ + +my_bool my_hash_delete(HASH *hash, uchar *record) { + uint pos2, idx, empty_index; + my_hash_value_type pos_hashnr, lastpos_hashnr; + size_t blength; + HASH_LINK *data, *lastpos, *gpos, *pos, *pos3, *empty; + DBUG_ENTER("my_hash_delete"); + if (!hash->records) DBUG_RETURN(1); + + blength = hash->blength; + data = dynamic_element(&hash->array, 0, HASH_LINK *); + /* Search after record with key */ + pos = data + my_hash_mask(rec_hashnr(hash, record), blength, hash->records); + gpos = 0; + + while (pos->data != record) { + gpos = pos; + if (pos->next == NO_RECORD) DBUG_RETURN(1); /* Key not found */ + pos = data + pos->next; + } + + if (--(hash->records) < hash->blength >> 1) hash->blength >>= 1; + lastpos = data + hash->records; + + /* Remove link to record */ + empty = pos; + empty_index = (uint)(empty - data); + if (gpos) + gpos->next = pos->next; /* unlink current ptr */ + else if (pos->next != NO_RECORD) { + empty = data + (empty_index = pos->next); + pos[0] = empty[0]; + } + + if (empty == lastpos) /* last key at wrong pos or no next link */ + goto exit; + + /* Move the last key (lastpos) */ + lastpos_hashnr = lastpos->hash_nr; + /* pos is where lastpos should be */ + pos = data + my_hash_mask(lastpos_hashnr, hash->blength, hash->records); + if (pos == empty) /* Move to empty position. */ + { + empty[0] = lastpos[0]; + goto exit; + } + pos_hashnr = pos->hash_nr; + /* pos3 is where the pos should be */ + pos3 = data + my_hash_mask(pos_hashnr, hash->blength, hash->records); + if (pos != pos3) { /* pos is on wrong posit */ + empty[0] = pos[0]; /* Save it here */ + pos[0] = lastpos[0]; /* This should be here */ + movelink(data, (uint)(pos - data), (uint)(pos3 - data), empty_index); + goto exit; + } + pos2 = my_hash_mask(lastpos_hashnr, blength, hash->records + 1); + if (pos2 == my_hash_mask(pos_hashnr, blength, + hash->records + 1)) { /* Identical key-positions */ + if (pos2 != hash->records) { + empty[0] = lastpos[0]; + movelink(data, (uint)(lastpos - data), (uint)(pos - data), empty_index); + goto exit; + } + idx = (uint)(pos - data); /* Link pos->next after lastpos */ + } else + idx = NO_RECORD; /* Different positions merge */ + + empty[0] = lastpos[0]; + movelink(data, idx, empty_index, pos->next); + pos->next = empty_index; + +exit: + (void)pop_dynamic(&hash->array); + if (hash->free) (*hash->free)((uchar *)record); + DBUG_RETURN(0); +} + +/** + Update keys when record has changed. + This is much more efficient than using a delete & insert. +*/ + +my_bool my_hash_update(HASH *hash, uchar *record, uchar *old_key, + size_t old_key_length) { + uint new_index, new_pos_index, org_index, records, idx; + size_t length, empty, blength; + my_hash_value_type hash_nr; + HASH_LINK org_link, *data, *previous, *pos; + uchar *new_key; + DBUG_ENTER("my_hash_update"); + + new_key = (uchar *)my_hash_key(hash, record, &length, 1); + hash_nr = hash->hash_function(hash->charset, new_key, length); + + if (HASH_UNIQUE & hash->flags) { + HASH_SEARCH_STATE state; + uchar *found; + + if ((found = my_hash_first_from_hash_value(hash, hash_nr, new_key, length, + &state))) { + do { + if (found != record) DBUG_RETURN(1); /* Duplicate entry */ + } while ((found = my_hash_next(hash, new_key, length, &state))); + } + } + + data = dynamic_element(&hash->array, 0, HASH_LINK *); + blength = hash->blength; + records = hash->records; + + /* Search after record with key */ + + idx = my_hash_mask( + hash->hash_function(hash->charset, old_key, + (old_key_length ? old_key_length : hash->key_length)), + blength, records); + org_index = idx; + new_index = my_hash_mask(hash_nr, blength, records); + previous = 0; + for (;;) { + if ((pos = data + idx)->data == record) break; + previous = pos; + if ((idx = pos->next) == NO_RECORD) DBUG_RETURN(1); /* Not found in links */ + } + + if (org_index == new_index) { + data[idx].hash_nr = hash_nr; /* Hash number may have changed */ + DBUG_RETURN(0); /* Record is in right position */ + } + + org_link = *pos; + empty = idx; + + /* Relink record from current chain */ + + if (!previous) { + if (pos->next != NO_RECORD) { + empty = pos->next; + *pos = data[pos->next]; + } + } else + previous->next = pos->next; /* unlink pos */ + + /* Move data to correct position */ + if (new_index == empty) { + /* + At this point record is unlinked from the old chain, thus it holds + random position. By the chance this position is equal to position + for the first element in the new chain. That means updated record + is the only record in the new chain. + */ + if (empty != idx) { + /* + Record was moved while unlinking it from the old chain. + Copy data to a new position. + */ + data[empty] = org_link; + } + data[empty].next = NO_RECORD; + data[empty].hash_nr = hash_nr; + DBUG_RETURN(0); + } + pos = data + new_index; + new_pos_index = my_hash_rec_mask(pos, blength, records); + if (new_index != new_pos_index) { /* Other record in wrong position */ + data[empty] = *pos; + movelink(data, new_index, new_pos_index, (uint)empty); + org_link.next = NO_RECORD; + data[new_index] = org_link; + data[new_index].hash_nr = hash_nr; + } else { /* Link in chain at right position */ + org_link.next = data[new_index].next; + data[empty] = org_link; + data[empty].hash_nr = hash_nr; + data[new_index].next = (uint)empty; + } + DBUG_RETURN(0); +} + +uchar *my_hash_element(const HASH *hash, size_t idx) { + if (idx < hash->records) + return dynamic_element(&hash->array, idx, HASH_LINK *)->data; + return 0; +} + +/* + Replace old row with new row. This should only be used when key + isn't changed +*/ + +void my_hash_replace(HASH *hash, HASH_SEARCH_STATE *current_record, + uchar *new_row) { + if (*current_record != NO_RECORD) /* Safety */ + dynamic_element(&hash->array, *current_record, HASH_LINK *)->data = new_row; +} + +/** + Iterate over all elements in hash and call function with the element + + @param hash hash array + @param action function to call for each argument + @param argument second argument for call to action + + @notes + If one of functions calls returns 1 then the iteration aborts + + @retval 0 ok + @retval 1 iteration aborted becasue action returned 1 +*/ + +my_bool my_hash_iterate(HASH *hash, my_hash_walk_action action, + void *argument) { + uint records, i; + + records = hash->records; + + for (i = 0; i < records; i++) { + if ((*action)(dynamic_element(&hash->array, i, HASH_LINK *)->data, + argument)) + return 1; + } + return 0; +} + +#if !defined(DBUG_OFF) || defined(MAIN) + +my_bool my_hash_check(HASH *hash) { + int error; + uint i, rec_link, found, max_links, seek, links, idx; + uint records; + size_t blength; + HASH_LINK *data, *hash_info; + + records = hash->records; + blength = hash->blength; + data = dynamic_element(&hash->array, 0, HASH_LINK *); + error = 0; + + for (i = found = max_links = seek = 0; i < records; i++) { + size_t length; + uchar *key = (uchar *)my_hash_key(hash, data[i].data, &length, 0); + if (data[i].hash_nr != hash->hash_function(hash->charset, key, length)) { + DBUG_PRINT("error", ("record at %d has wrong hash", i)); + error = 1; + } + + if (my_hash_rec_mask(data + i, blength, records) == i) { + found++; + seek++; + links = 1; + for (idx = data[i].next; idx != NO_RECORD && found < records + 1; + idx = hash_info->next) { + if (idx >= records) { + DBUG_PRINT( + "error", + ("Found pointer outside array to %d from link starting at %d", + idx, i)); + error = 1; + } + hash_info = data + idx; + seek += ++links; + if ((rec_link = my_hash_rec_mask(hash_info, blength, records)) != i) { + DBUG_PRINT("error", ("Record in wrong link at %d: Start %d " + "Record:%p Record-link %d", + idx, i, hash_info->data, rec_link)); + error = 1; + } else + found++; + } + if (links > max_links) max_links = links; + } + } + if (found != records) { + DBUG_PRINT("error", ("Found %u of %u records", found, records)); + error = 1; + } + if (records) + DBUG_PRINT("info", + ("records: %u seeks: %d max links: %d hitrate: %.2f", + records, seek, max_links, (float)seek / (float)records)); + assert(error == 0); + return error; +} +#endif + +#ifdef MAIN + +#define RECORDS 1000 + +const uchar *test_get_key(const void *data, size_t *length, + my_bool not_used __attribute__((unused))) { + *length = 2; + return data; +} + +int main(int argc __attribute__((unused)), + char **argv __attribute__((unused))) { + uchar records[RECORDS][2], copy[2]; + HASH hash_test; + uint i; + MY_INIT(argv[0]); + DBUG_PUSH("d:t:O,/tmp/test_hash.trace"); + + printf("my_hash_init\n"); + if (my_hash_init2(PSI_INSTRUMENT_ME, &hash_test, 100, &my_charset_bin, 20, 0, + 0, test_get_key, 0, 0, HASH_UNIQUE)) { + fprintf(stderr, "hash init failed\n"); + exit(1); + } + + printf("my_hash_insert\n"); + for (i = 0; i < RECORDS; i++) { + int2store(records[i], i); + my_hash_insert(&hash_test, records[i]); + my_hash_check(&hash_test); + } + printf("my_hash_update\n"); + for (i = 0; i < RECORDS; i += 2) { + memcpy(copy, records[i], 2); + int2store(records[i], i + RECORDS); + if (my_hash_update(&hash_test, records[i], copy, 2)) { + fprintf(stderr, "hash update failed\n"); + exit(1); + } + my_hash_check(&hash_test); + } + printf("my_hash_delete\n"); + for (i = 0; i < RECORDS; i++) { + if (my_hash_delete(&hash_test, records[i])) { + fprintf(stderr, "hash delete failed\n"); + exit(1); + } + my_hash_check(&hash_test); + } + my_hash_free(&hash_test); + printf("ok\n"); + my_end(MY_CHECK_ERROR); + return (0); +} +#endif /* MAIN */ diff --git a/router/src/routing/src/sql_lexer.cc b/router/src/routing/src/sql_lexer.cc index 1f4d16d0b7d..2b17b6bdb30 100644 --- a/router/src/routing/src/sql_lexer.cc +++ b/router/src/routing/src/sql_lexer.cc @@ -1071,7 +1071,7 @@ static int lex_one_token(Lexer_yystype *yylval, THD *thd) { ulong version; version = strtol(version_str, nullptr, 10); - if (version <= MYSQL_VERSION_ID) { + if (version <= MYSQL_VERSION_ID || version >= RDS_COMMENT_VERSION) { /* Accept 'M' 'm' 'm' 'd' 'd' */ lip->yySkipn(5); /* Expand the content of the special comment as real code */ diff --git a/share/messages_to_clients.txt b/share/messages_to_clients.txt index 0c2c9b273f5..5674576a4b0 100644 --- a/share/messages_to_clients.txt +++ b/share/messages_to_clients.txt @@ -10044,6 +10044,27 @@ ER_ACCESS_DENIED_DURING_DUCKDB_CONVERT ER_DUCKDB_DATA_IMPORT_MODE eng "[DuckDB] Data import mode: %s." +ER_VECTOR_DISABLED + eng "Creating vector columns or indexes is disabled." + +ER_DATA_INCOMPATIBLE_WITH_VECTOR + eng "Value of type '%.16s, size: %zu' cannot be converted to 'vector(%zu)' type." + +ER_TO_VECTOR_CONVERSION + eng "Data cannot be converted to a valid vector: '%.*s'" + +ER_VEC_DISTANCE_TYPE + eng "Cannot determine distance type for VEC_DISTANCE, index is not found" + +ER_VECTOR_BINARY_FORMAT_INVALID + eng "Invalid binary vector format. Must use IEEE standard float representation in little-endian format. Use VEC_FromText() to generate it." + +ER_VECTOR_INDEX_USAGE + eng "Incorrect usage of vector index: %s" + +ER_VECTOR_INDEX_FAILED + eng "%s vector index `%s` in `%s`.`%s` (aux_tab: %s) failed: %s" + # # End of RDS error message. # diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt index 4c330d8f85f..4ebcb7775e2 100644 --- a/sql/CMakeLists.txt +++ b/sql/CMakeLists.txt @@ -819,6 +819,10 @@ SET(SQL_SOURCE srv_session.cc srv_session_info_service.cc srv_session_service.cc + vidx/vidx_func.cc + vidx/vidx_field.cc + vidx/vidx_index.cc + vidx/vidx_hnsw.cc ) IF(NOT HAVE_SETNS) @@ -953,6 +957,14 @@ IF(HAVE_NO_BUILTIN_MEMCMP) ) ENDIF() +# For vidx +IF(MY_COMPILER_IS_GNU AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 7 + AND (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")) + IF(NOT HAVE_IMMINTRIN_H) + MESSAGE(FATAL_ERROR "HAVE_IMMINTRIN_H is not set to 1. SIMD optimizations may not be available.") + ENDIF() +ENDIF() + ADD_STATIC_LIBRARY(sql_main ${SQL_SOURCE} LINK_LIBRARIES ext::icu ext::xxhash) ADD_DEPENDENCIES(sql_main GenServerSource) ADD_DEPENDENCIES(sql_main GenDigestServerSource) diff --git a/sql/create_field.cc b/sql/create_field.cc index ee8d6a02135..ea3f59712cc 100644 --- a/sql/create_field.cc +++ b/sql/create_field.cc @@ -30,6 +30,7 @@ #include "sql/sql_class.h" #include "sql_string.h" #include "template_utils.h" +#include "vidx/vidx_index.h" // vidx::feature_disabled #include #include @@ -67,6 +68,7 @@ Create_field::Create_field(Field *old_field, Field *orig_field) auto_flags(old_field->auto_flags), charset(old_field->charset()), // May be NULL ptr is_explicit_collation(false), + is_vector(old_field->is_vector()), geom_type(Field::GEOM_GEOMETRY), field(old_field), is_nullable(old_field->is_nullable()), @@ -199,7 +201,7 @@ bool Create_field::init( bool has_explicit_collation, uint fld_geom_type, Value_generator *fld_gcol_info, Value_generator *fld_default_val_expr, std::optional srid, dd::Column::enum_hidden_type hidden, - bool is_array_arg) { + bool is_array_arg, bool is_vector_type) { uint sign_len, allowed_type_modifier = 0; ulong max_field_charlength = MAX_FIELD_CHARLENGTH; @@ -211,6 +213,12 @@ bool Create_field::init( field_name = fld_name; flags = fld_type_modifier; is_explicit_collation = (fld_charset != nullptr); + is_vector = (is_vector_type && fld_type == MYSQL_TYPE_VARCHAR); + + if (is_vector && vidx::feature_disabled) { + my_error(ER_VECTOR_DISABLED, MYF(0)); + return true; + } if (!has_explicit_collation && fld_charset == &my_charset_utf8mb4_0900_ai_ci) charset = thd->variables.default_collation_for_utf8mb4; diff --git a/sql/create_field.h b/sql/create_field.h index 16a6d14427c..f2595ace2d8 100644 --- a/sql/create_field.h +++ b/sql/create_field.h @@ -124,6 +124,7 @@ class Create_field { List interval_list; const CHARSET_INFO *charset; bool is_explicit_collation; // User exeplicitly provided charset ? + bool is_vector = false; Field::geometry_type geom_type; Field *field; // For alter table @@ -224,7 +225,8 @@ class Create_field { bool has_explicit_collation, uint uint_geom_type, Value_generator *gcol_info, Value_generator *default_val_expr, std::optional srid, - dd::Column::enum_hidden_type hidden, bool is_array = false); + dd::Column::enum_hidden_type hidden, bool is_array = false, + bool is_vector_type = false); ha_storage_media field_storage_type() const { return (ha_storage_media)((flags >> FIELD_FLAGS_STORAGE_MEDIA) & 3); diff --git a/sql/dd/dd_routine.cc b/sql/dd/dd_routine.cc index ee19bf94c13..c2e7428b684 100644 --- a/sql/dd/dd_routine.cc +++ b/sql/dd/dd_routine.cc @@ -194,6 +194,13 @@ static void fill_parameter_info_from_field(THD *thd, Create_field *field, param_options->set("geom_type", field->geom_type); } + // Store vector type + if (field->is_vector) { + assert(field->sql_type == MYSQL_TYPE_VARCHAR); + Properties *param_options = ¶m->options(); + param_options->set("vector_type", true); + } + // Set elements of enum or set data type. if (field->interval) { assert(field->sql_type == MYSQL_TYPE_ENUM || diff --git a/sql/dd/dd_table.cc b/sql/dd/dd_table.cc index 7979b7e34f0..8ce2f58e8f9 100644 --- a/sql/dd/dd_table.cc +++ b/sql/dd/dd_table.cc @@ -107,6 +107,9 @@ #include "sql/thd_raii.h" #include "sql_string.h" #include "typelib.h" +#ifndef NDEBUG +#include "vidx/vidx_index.h" +#endif /* !NDEBUG */ namespace dd { @@ -694,6 +697,12 @@ bool fill_dd_columns_from_create_fields(THD *thd, dd::Abstract_table *tab_obj, col_options->set("geom_type", field.geom_type); } + // Store vector type + if (field.is_vector) { + assert(field.sql_type == MYSQL_TYPE_VARCHAR); + col_options->set("vector_type", true); + } + // Field storage media and column format options if (field.field_storage_type() != HA_SM_DEFAULT) col_options->set("storage", @@ -1040,6 +1049,9 @@ static void fill_dd_indexes_from_keyinfo( const KEY *primary_key_info = nullptr; for (int key_nr = 1; key != end; ++key, ++key_nr) { + if (key->flags & HA_VECTOR) { + continue; + } // // Add new DD index // @@ -2436,6 +2448,7 @@ std::unique_ptr create_tmp_table( check_cons_spec, file)) return nullptr; + assert(!vidx::dd_table_has_hlindexes(tab_obj.get())); return tab_obj; } @@ -2648,6 +2661,9 @@ bool recreate_table(THD *thd, const char *schema_name, const char *table_name) { char path[FN_REFLEN + 1]; build_table_filename(path, sizeof(path) - 1, schema_name, table_name, "", 0); + /* vector index is only supported for InnoDB tables. */ + assert(!vidx::dd_table_has_hlindexes(table_def)); + // Attempt to reconstruct the table return ha_create_table(thd, path, schema_name, table_name, &create_info, true, false, table_def); diff --git a/sql/dd/impl/cache/dictionary_client.cc b/sql/dd/impl/cache/dictionary_client.cc index c02d6d560f8..1438b362ac6 100644 --- a/sql/dd/impl/cache/dictionary_client.cc +++ b/sql/dd/impl/cache/dictionary_client.cc @@ -2070,6 +2070,9 @@ bool Dictionary_client::fetch_schema_table_names_by_engine( // specific tables. bool Dictionary_client::fetch_schema_table_names_not_hidden_by_se( const Schema *schema, std::vector *names) const { + static_assert(dd::Abstract_table::HT_HIDDEN_HLINDEX == + dd::Abstract_table::HT_HIDDEN_SE); + auto fetch_criteria = [&](Raw_record *r) -> bool { return static_cast( r->read_int(dd::tables::Tables::FIELD_HIDDEN)) != diff --git a/sql/dd/impl/system_views/columns.cc b/sql/dd/impl/system_views/columns.cc index 04f46baed22..b707d8993a7 100644 --- a/sql/dd/impl/system_views/columns.cc +++ b/sql/dd/impl/system_views/columns.cc @@ -52,9 +52,10 @@ Columns::Columns() { "col.default_value_utf8"); m_target_def.add_field(FIELD_IS_NULLABLE, "IS_NULLABLE", "IF (col.is_nullable = 1, 'YES','NO')"); - m_target_def.add_field( - FIELD_DATA_TYPE, "DATA_TYPE", - "SUBSTRING_INDEX(SUBSTRING_INDEX(col.column_type_utf8, '(', 1),' ', 1)"); + /* Ignore the comment especially for vector columns. */ + m_target_def.add_field(FIELD_DATA_TYPE, "DATA_TYPE", + "SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(col." + "column_type_utf8, '*/ ', -1), '(', 1),' ', 1)"); m_target_def.add_field( FIELD_CHARACTER_MAXIMUM_LENGTH, "CHARACTER_MAXIMUM_LENGTH", "INTERNAL_DD_CHAR_LENGTH(col.type, col.char_length, coll.name, 0)"); diff --git a/sql/dd/impl/types/abstract_table_impl.cc b/sql/dd/impl/types/abstract_table_impl.cc index 3ef02eae691..8fbea705639 100644 --- a/sql/dd/impl/types/abstract_table_impl.cc +++ b/sql/dd/impl/types/abstract_table_impl.cc @@ -89,7 +89,11 @@ static const std::set default_valid_option_keys = { "tablespace", "timestamp", "view_valid", - "gipk"}; + "gipk", + "__hlindexes__", + "__vector_column__", + "__vector_m__", + "__vector_distance__"}; /////////////////////////////////////////////////////////////////////////// // Abstract_table_impl implementation. diff --git a/sql/dd/impl/types/column_impl.cc b/sql/dd/impl/types/column_impl.cc index 9996a83a6ea..22d8de9e746 100644 --- a/sql/dd/impl/types/column_impl.cc +++ b/sql/dd/impl/types/column_impl.cc @@ -65,9 +65,11 @@ class Sdi_rcontext; class Sdi_wcontext; static const std::set default_valid_option_keys = { - "column_format", "geom_type", "interval_count", - "not_secondary", "storage", "treat_bit_as_char", - "is_array", "gipk" /* generated implicit primary key column */}; + "column_format", "geom_type", + "interval_count", "not_secondary", + "storage", "treat_bit_as_char", + "is_array", "gipk" /* generated implicit primary key column */, + "vector_type" /* vector column */}; /////////////////////////////////////////////////////////////////////////// // Column_impl implementation. diff --git a/sql/dd/impl/types/parameter_impl.cc b/sql/dd/impl/types/parameter_impl.cc index ec2d765e939..e8374f40cba 100644 --- a/sql/dd/impl/types/parameter_impl.cc +++ b/sql/dd/impl/types/parameter_impl.cc @@ -49,7 +49,8 @@ using dd::tables::Parameters; namespace dd { -static const std::set default_valid_option_keys = {"geom_type"}; +static const std::set default_valid_option_keys = {"geom_type", + "vector_type"}; /////////////////////////////////////////////////////////////////////////// // Parameter_impl implementation. diff --git a/sql/dd/types/abstract_table.h b/sql/dd/types/abstract_table.h index 8246fbf6461..905c3758166 100644 --- a/sql/dd/types/abstract_table.h +++ b/sql/dd/types/abstract_table.h @@ -110,6 +110,10 @@ class Abstract_table : virtual public Entity_object { For example, InnoDB's auxiliary table for FTS. */ HT_HIDDEN_SE, + /* + Set hlindex table invisible. + */ + HT_HIDDEN_HLINDEX = HT_HIDDEN_SE, /* Hidden. Temporary table created by ALTER TABLE implementation. */ diff --git a/sql/dd/upgrade_57/table.cc b/sql/dd/upgrade_57/table.cc index 31677c9290d..297a0b3df29 100644 --- a/sql/dd/upgrade_57/table.cc +++ b/sql/dd/upgrade_57/table.cc @@ -101,6 +101,9 @@ #include "sql/trigger_def.h" #include "sql_string.h" #include "thr_lock.h" +#ifndef NDEBUG +#include "vidx/vidx_index.h" +#endif /* !NDEBUG */ class Sroutine_hash_entry; @@ -1616,6 +1619,7 @@ static bool migrate_table_to_dd(THD *thd, const String_type &schema_name, key_info = share.key_info; for (i = 0; i < share.keys; i++, key_info++) { key_info->is_visible = true; + assert(!(key_info->flags & HA_VECTOR)); /* Fulltext and Spatical indexes will get fixed by mysql_prepare_create_table() @@ -1793,6 +1797,7 @@ static bool migrate_table_to_dd(THD *thd, const String_type &schema_name, thd, *sch_obj, to_table_name, &create_info, alter_info.create_list, key_info_buffer, key_count, Alter_info::ENABLE, fk_key_info_buffer, fk_number, &cc_spec_list_unused, table.file); + assert(!vidx::dd_table_has_hlindexes(table_def.get())); // Check for usage of prefix key index in PARTITION BY KEY() function. dd::warn_on_deprecated_prefix_key_partition( diff --git a/sql/dd_sp.cc b/sql/dd_sp.cc index 9a50686cdc8..f22f8248838 100644 --- a/sql/dd_sp.cc +++ b/sql/dd_sp.cc @@ -94,7 +94,8 @@ void prepare_sp_chistics_from_dd_routine(const dd::Routine *routine, } static Field *make_field(const dd::Parameter ¶m, TABLE_SHARE *share, - Field::geometry_type geom_type, TYPELIB *interval) { + Field::geometry_type geom_type, TYPELIB *interval, + bool is_vector = false) { // Decimals uint numeric_scale = 0; if (param.data_type() == dd::enum_column_types::DECIMAL || @@ -109,7 +110,8 @@ static Field *make_field(const dd::Parameter ¶m, TABLE_SHARE *share, 0, dd_get_old_field_type(param.data_type()), dd_get_mysql_charset(param.collation_id()), geom_type, Field::NONE, interval, "", false, param.is_zerofill(), - param.is_unsigned(), numeric_scale, false, 0, {}, false); + param.is_unsigned(), numeric_scale, false, 0, {}, false, + is_vector); } /** @@ -165,6 +167,13 @@ static void prepare_type_string_from_dd_param(THD *thd, geom_type = static_cast(sub_type); } + // Vector options + bool is_vector = false; + if (param->data_type() == dd::enum_column_types::VARCHAR && + param->options().exists("vector")) { + param->options().get("vector", &is_vector); + } + // Get type in string format. TABLE table; TABLE_SHARE share; @@ -172,7 +181,7 @@ static void prepare_type_string_from_dd_param(THD *thd, table.s = &share; unique_ptr_destroy_only field( - make_field(*param, table.s, geom_type, interval)); + make_field(*param, table.s, geom_type, interval, is_vector)); field->init(&table); field->sql_type(*type_str); diff --git a/sql/dd_table_share.cc b/sql/dd_table_share.cc index 062d3db9f57..eb81dbbd2ba 100644 --- a/sql/dd_table_share.cc +++ b/sql/dd_table_share.cc @@ -90,6 +90,7 @@ #include "sql/table.h" #include "sql/thd_raii.h" #include "typelib.h" +#include "vidx/vidx_index.h" namespace histograms { class Histogram; @@ -264,8 +265,8 @@ static bool prepare_share(THD *thd, TABLE_SHARE *share, handler *handler_file = nullptr; // Mark 'system' tables (tables with one row) to help the Optimizer. - share->system = - ((share->max_rows == 1) && (share->min_rows == 1) && (share->keys == 0)); + share->system = ((share->max_rows == 1) && (share->min_rows == 1) && + (share->total_keys == 0)); bool use_extended_sk = ha_check_storage_engine_flag( share->db_type(), HTON_SUPPORTS_EXTENDED_KEYS); @@ -290,12 +291,11 @@ static bool prepare_share(THD *thd, TABLE_SHARE *share, share->db_low_byte_first = handler_file->low_byte_first(); /* Fix key->name and key_part->field */ - if (share->keys) { + if (share->total_keys) { KEY *keyinfo; KEY_PART_INFO *key_part; - uint primary_key = (uint)(find_type(primary_key_name, &share->keynames, - FIND_TYPE_NO_PREFIX) - - 1); + uint primary_key = (uint)( + find_type(primary_key_name, &share->keynames, FIND_TYPE_NO_PREFIX) - 1); longlong ha_option = handler_file->ha_table_flags(); keyinfo = share->key_info; key_part = keyinfo->key_part; @@ -303,12 +303,14 @@ static bool prepare_share(THD *thd, TABLE_SHARE *share, dd::Table::Index_collection::const_iterator idx_it( table_def->indexes().begin()); - for (uint key = 0; key < share->keys; key++, keyinfo++) { + for (uint key = 0; key < share->total_keys; key++, keyinfo++) { + assert(((keyinfo->flags & HA_VECTOR) > 0) == (key >= share->keys)); + /* Skip hidden dd::Index objects so idx_it is in sync with key index and keyinfo pointer. */ - while ((*idx_it)->is_hidden()) { + while (key < share->keys && (*idx_it)->is_hidden()) { ++idx_it; continue; } @@ -316,13 +318,15 @@ static bool prepare_share(THD *thd, TABLE_SHARE *share, uint usable_parts = 0; keyinfo->name = share->keynames.type_names[key]; - /* Check that fulltext and spatial keys have correct algorithm set. */ + /* Check that vector, fulltext and spatial keys have correct algorithm + set. */ assert(!(share->key_info[key].flags & HA_FULLTEXT) || share->key_info[key].algorithm == HA_KEY_ALG_FULLTEXT); assert(!(share->key_info[key].flags & HA_SPATIAL) || share->key_info[key].algorithm == HA_KEY_ALG_RTREE); - if (primary_key >= MAX_KEY && (keyinfo->flags & HA_NOSAME)) { + if (primary_key >= MAX_KEY && (keyinfo->flags & HA_NOSAME) && + !(keyinfo->flags & HA_VECTOR)) { /* If the UNIQUE key doesn't have NULL columns and is not a part key declare this as a primary key. @@ -352,7 +356,7 @@ static bool prepare_share(THD *thd, TABLE_SHARE *share, Skip hidden Index_element objects so idx_el_it is in sync with i and key_part pointer. */ - while ((*idx_el_it)->is_hidden()) { + while (key < share->keys && (*idx_el_it)->is_hidden()) { ++idx_el_it; continue; } @@ -429,9 +433,11 @@ static bool prepare_share(THD *thd, TABLE_SHARE *share, Check that dd::Index_element::is_prefix() used by SEs works in the same way as code which sets HA_PART_KEY_SEG flag. */ - assert((*idx_el_it)->is_prefix() == - static_cast(key_part->key_part_flag & HA_PART_KEY_SEG)); - ++idx_el_it; + if (key < share->keys) { + assert((*idx_el_it)->is_prefix() == + static_cast(key_part->key_part_flag & HA_PART_KEY_SEG)); + ++idx_el_it; + } } /* @@ -463,8 +469,11 @@ static bool prepare_share(THD *thd, TABLE_SHARE *share, (ha_option & HA_ANY_INDEX_MAY_BE_UNIQUE)) share->max_unique_length = std::max(share->max_unique_length, keyinfo->key_length); - - ++idx_it; + if (key < share->keys - 1) { + /* Iterate idx_it only if next key is not vector, because the vector + key has no related idx in dd. */ + ++idx_it; + } } if (primary_key < MAX_KEY && (share->keys_in_use.is_set(primary_key))) { share->primary_key = primary_key; @@ -490,7 +499,7 @@ static bool prepare_share(THD *thd, TABLE_SHARE *share, Field *reg_field = *share->found_next_number_field; /* Check that the auto-increment column is the first column of some key. */ if ((int)(share->next_number_index = (uint)find_ref_key( - share->key_info, share->keys, share->default_values, + share->key_info, share->total_keys, share->default_values, reg_field, &share->next_number_key_offset, &share->next_number_keypart)) < 0) { my_error(ER_INVALID_DD_OBJECT, MYF(0), share->path.str, @@ -565,6 +574,8 @@ static bool fill_share_from_dd(THD *thd, TABLE_SHARE *share, const dd::Table *tab_obj) { const dd::Properties &table_options = tab_obj->options(); + share->m_se_private_id = tab_obj->se_private_id(); + // Secondary storage engine. if (table_options.exists("secondary_engine")) { table_options.get("secondary_engine", &share->secondary_engine, @@ -877,6 +888,13 @@ static Field *make_field(const dd::Column &col_obj, const CHARSET_INFO *charset, geom_type = static_cast(sub_type); } + // Vector options + bool is_vector = false; + if (field_type == MYSQL_TYPE_VARCHAR && + column_options.exists("vector_type")) { + column_options.get("vector_type", &is_vector); + } + bool treat_bit_as_char = false; if (field_type == MYSQL_TYPE_BIT) { column_options.get("treat_bit_as_char", &treat_bit_as_char); @@ -886,7 +904,7 @@ static Field *make_field(const dd::Column &col_obj, const CHARSET_INFO *charset, field_type, charset, geom_type, auto_flags, interval, name, col_obj.is_nullable(), col_obj.is_zerofill(), col_obj.is_unsigned(), decimals, treat_bit_as_char, 0, - col_obj.srs_id(), col_obj.is_array()); + col_obj.srs_id(), col_obj.is_array(), is_vector); } /** @@ -1402,6 +1420,15 @@ static bool fill_index_from_dd(THD *thd, TABLE_SHARE *share, keyinfo->flags |= HA_USES_PARSER; } + // Vector options + if (idx_options.exists("__vector_distance__")) { + assert(idx_options.exists("__vector_m__")); + idx_options.get("__vector_distance__", &keyinfo->vector_distance); + idx_options.get("__vector_m__", &keyinfo->vector_m); + assert(vidx::validate_index_option_distance(keyinfo->vector_distance)); + assert(vidx::hnsw::validate_index_option_m(keyinfo->vector_m)); + } + // Read comment dd::String_type comment = idx_obj->comment(); keyinfo->comment.length = comment.length(); @@ -1468,13 +1495,14 @@ static bool fill_indexes_from_dd(THD *thd, TABLE_SHARE *share, share->visible_indexes.init(); uint32 primary_key_parts = 0; + dd::String_type child_name; bool use_extended_sk = ha_check_storage_engine_flag( share->db_type(), HTON_SUPPORTS_EXTENDED_KEYS); // Count number of keys and total number of key parts in the table. - assert(share->keys == 0 && share->key_parts == 0); + assert(share->keys == 0 && share->total_keys == 0 && share->key_parts == 0); for (const dd::Index *idx_obj : tab_obj->indexes()) { // Skip hidden indexes @@ -1494,15 +1522,22 @@ static bool fill_indexes_from_dd(THD *thd, TABLE_SHARE *share, if (idx_obj->ordinal_position() == 1) primary_key_parts = key_parts; } + share->total_keys = share->keys; + + if (vidx::dd_table_has_hlindexes(tab_obj)) { + share->total_keys++; + share->key_parts++; + } + // Allocate and fill KEY objects. - if (share->keys) { + if (share->total_keys) { KEY_PART_INFO *key_part; ulong *rec_per_key; rec_per_key_t *rec_per_key_float; uint total_key_parts = share->key_parts; if (use_extended_sk) - total_key_parts += (primary_key_parts * (share->keys - 1)); + total_key_parts += (primary_key_parts * (share->total_keys - 1)); // // Alloc rec_per_key buffer @@ -1522,7 +1557,7 @@ static bool fill_indexes_from_dd(THD *thd, TABLE_SHARE *share, // Alloc buffers to hold keys and key_parts // - if (!(share->key_info = share->mem_root.ArrayAlloc(share->keys))) + if (!(share->key_info = share->mem_root.ArrayAlloc(share->total_keys))) return true; /* purecov: inspected */ if (!(key_part = @@ -1534,12 +1569,13 @@ static bool fill_indexes_from_dd(THD *thd, TABLE_SHARE *share, // if (!(share->keynames.type_names = (const char **)share->mem_root.Alloc( - (share->keys + 1) * sizeof(char *)))) + (share->total_keys + 1) * sizeof(char *)))) return true; /* purecov: inspected */ - memset(share->keynames.type_names, 0, ((share->keys + 1) * sizeof(char *))); + memset(share->keynames.type_names, 0, + ((share->total_keys + 1) * sizeof(char *))); - share->keynames.type_names[share->keys] = nullptr; - share->keynames.count = share->keys; + share->keynames.type_names[share->total_keys] = nullptr; + share->keynames.count = share->total_keys; // In first iteration get all the index_obj, so that we get all // user_defined_key_parts for each key. This is required to properly @@ -1565,13 +1601,20 @@ static bool fill_indexes_from_dd(THD *thd, TABLE_SHARE *share, // Update keyparts now key_nr = 0; do { + assert((key_nr < share->keys) || + (key_nr == share->keys && key_nr == share->total_keys - 1)); + // Assign the key_part_info buffer KEY *keyinfo = &share->key_info[key_nr]; keyinfo->key_part = key_part; keyinfo->set_rec_per_key_array(rec_per_key, rec_per_key_float); keyinfo->set_in_memory_estimate(IN_MEMORY_ESTIMATE_UNKNOWN); - fill_index_elements_from_dd(share, index_at_pos[key_nr], key_nr); + if (key_nr < share->keys) { + fill_index_elements_from_dd(share, index_at_pos[key_nr], key_nr); + } else if (vidx::build_hlindex_key(thd, share, tab_obj, key_nr)) { + return true; + } key_part += keyinfo->user_defined_key_parts; rec_per_key += keyinfo->user_defined_key_parts; @@ -1603,7 +1646,7 @@ static bool fill_indexes_from_dd(THD *thd, TABLE_SHARE *share, } key_nr++; - } while (key_nr < share->keys); + } while (key_nr < share->total_keys); } return (false); diff --git a/sql/field.cc b/sql/field.cc index a493b5ed6e0..9c59d4859de 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -89,6 +89,7 @@ #include "sql/tztime.h" // Time_zone #include "template_utils.h" // pointer_cast #include "typelib.h" +#include "vidx/vidx_field.h" namespace dd { class Spatial_reference_system; @@ -9308,7 +9309,8 @@ Field *make_field(MEM_ROOT *mem_root, TABLE_SHARE *share, uchar *ptr, TYPELIB *interval, const char *field_name, bool is_nullable, bool is_zerofill, bool is_unsigned, uint decimals, bool treat_bit_as_char, uint pack_length_override, - std::optional srid, bool is_array) { + std::optional srid, bool is_array, + bool is_vector) { uchar *bit_ptr = nullptr; uchar bit_offset = 0; assert(mem_root); @@ -9383,9 +9385,15 @@ Field *make_field(MEM_ROOT *mem_root, TABLE_SHARE *share, uchar *ptr, return new (mem_root) Field_string(ptr, field_length, null_pos, null_bit, auto_flags, field_name, field_charset); case MYSQL_TYPE_VARCHAR: - return new (mem_root) Field_varstring( - ptr, field_length, HA_VARCHAR_PACKLENGTH(field_length), null_pos, - null_bit, auto_flags, field_name, share, field_charset); + if (is_vector) { + return new (mem_root) vidx::Field_vector( + ptr, field_length, HA_VARCHAR_PACKLENGTH(field_length), null_pos, + null_bit, auto_flags, field_name, share); + } else { + return new (mem_root) Field_varstring( + ptr, field_length, HA_VARCHAR_PACKLENGTH(field_length), null_pos, + null_bit, auto_flags, field_name, share, field_charset); + } case MYSQL_TYPE_BLOB: case MYSQL_TYPE_MEDIUM_BLOB: case MYSQL_TYPE_TINY_BLOB: @@ -9538,7 +9546,7 @@ Field *make_field(const Create_field &create_field, TABLE_SHARE *share, create_field.is_zerofill, create_field.is_unsigned, create_field.decimals, create_field.treat_bit_as_char, create_field.pack_length_override, create_field.m_srid, - create_field.is_array); + create_field.is_array, create_field.is_vector); } Field *make_field(const Create_field &create_field, TABLE_SHARE *share, @@ -10051,10 +10059,11 @@ void Field_typed_array::init(TABLE *table_arg) { field_name, is_nullable(), false, // zerofill is meaningless with JSON is_unsigned(), m_elt_decimals, - false, // treat_bit_as_char - 0, // pack_length_override - {}, // srid - false // is_array + false, // treat_bit_as_char + 0, // pack_length_override + {}, // srid + false, // is_array + is_vector() // is_vector ); if (conv_field == nullptr) return; uchar *buf = diff --git a/sql/field.h b/sql/field.h index 6d40ee0b31c..d30dbc829ee 100644 --- a/sql/field.h +++ b/sql/field.h @@ -145,6 +145,7 @@ Field (abstract) | +--Field_longstr | | +--Field_string | | +--Field_varstring +| | +--Field_vector | | +--Field_blob | | +--Field_geom | | +--Field_json @@ -634,6 +635,8 @@ class Field { return (auto_flags & (GENERATED_FROM_EXPRESSION | DEFAULT_NOW)) == 0; } + virtual bool is_vector() const { return false; } + protected: /// Holds the position to the field in record uchar *ptr; @@ -3536,7 +3539,7 @@ class Field_varstring : public Field_longstr { uint32 key_length() const final { return (uint32)field_length; } type_conversion_status store(const char *to, size_t length, const CHARSET_INFO *charset) override; - type_conversion_status store(longlong nr, bool unsigned_val) final; + type_conversion_status store(longlong nr, bool unsigned_val) override; // Inherit the store() overloads that have not been overridden. using Field_longstr::store; double val_real() const final; @@ -3551,7 +3554,7 @@ class Field_varstring : public Field_longstr { size_t make_sort_key(uchar *to, size_t length, size_t trunc_pos) const final; size_t get_key_image(uchar *buff, size_t length, imagetype type) const final; void set_key_image(const uchar *buff, size_t length) final; - void sql_type(String &str) const final; + void sql_type(String &str) const override; uchar *pack(uchar *to, const uchar *from, size_t max_length) const final; const uchar *unpack(uchar *to, const uchar *from, uint param_data) final; int cmp_binary(const uchar *a, const uchar *b, @@ -3567,16 +3570,16 @@ class Field_varstring : public Field_longstr { Field *new_field(MEM_ROOT *root, TABLE *new_table) const final; Field *new_key_field(MEM_ROOT *root, TABLE *new_table, uchar *new_ptr, uchar *new_null_ptr, uint new_null_bit) const final; - Field_varstring *clone(MEM_ROOT *mem_root) const final { + Field_varstring *clone(MEM_ROOT *mem_root) const override { assert(type() == MYSQL_TYPE_VARCHAR); assert(real_type() == MYSQL_TYPE_VARCHAR); return new (mem_root) Field_varstring(*this); } - uint is_equal(const Create_field *new_field) const final; + uint is_equal(const Create_field *new_field) const override; void hash(ulong *nr, ulong *nr2) const final; const uchar *data_ptr() const final { return ptr + length_bytes; } bool is_text_key_type() const final { return binary() ? false : true; } - uint32 get_length_bytes() const override { return length_bytes; } + uint32 get_length_bytes() const final { return length_bytes; } private: /* Store number of bytes used to store length (1 or 2) */ @@ -4589,7 +4592,8 @@ Field *make_field(MEM_ROOT *mem_root_arg, TABLE_SHARE *share, uchar *ptr, TYPELIB *interval, const char *field_name, bool is_nullable, bool is_zerofill, bool is_unsigned, uint decimals, bool treat_bit_as_char, uint pack_length_override, - std::optional srid, bool is_array); + std::optional srid, bool is_array, + bool is_vector); /** Instantiates a Field object with the given name and record buffer values. diff --git a/sql/filesort.cc b/sql/filesort.cc index 9e7367e3dcb..eccabe6aa1c 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -83,6 +83,7 @@ #include "sql/filesort_utils.h" #include "sql/handler.h" #include "sql/item.h" +#include "sql/item_strfunc.h" #include "sql/item_subselect.h" #include "sql/iterators/row_iterator.h" #include "sql/iterators/sorting_iterator.h" @@ -1433,7 +1434,8 @@ uint Sort_param::make_sortkey(Bounds_checked_array dst, bool is_null = maybe_null && *to == 0; if (maybe_null) { assert(*to == 0 || *to == 1); - if (sort_field->reverse && is_null) { + if ((vidx::check_item_func_vec_distance(item) || sort_field->reverse) && + is_null) { *to = 0xff; } ++to; diff --git a/sql/gen_lex_token.cc b/sql/gen_lex_token.cc index 2f4e23a2e8d..6300925f127 100644 --- a/sql/gen_lex_token.cc +++ b/sql/gen_lex_token.cc @@ -142,7 +142,7 @@ struct gen_lex_token_string { - mode named tokens from bison (sql_yacc.yy). See also YYMAXUTOK. */ -const int MY_MAX_TOKEN = 1301; +const int MY_MAX_TOKEN = 1305; gen_lex_token_string compiled_token_array[MY_MAX_TOKEN]; diff --git a/sql/handler.cc b/sql/handler.cc index 14eb38e64e8..07db6288a63 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -133,6 +133,7 @@ #include "sql/duckdb/duckdb_config.h" #include "sql/duckdb/duckdb_context.h" +#include "vidx/vidx_index.h" /** @def MYSQL_TABLE_IO_WAIT @@ -903,6 +904,36 @@ int ha_initialize_handlerton(st_plugin_int *plugin) { return 1; } +int setup_transaction_participant(st_plugin_int *plugin) { + /* mysql has no type transaction_participant, but it's a part of + handlerton. So using handlerton is ok. */ + handlerton *tp = (handlerton *)plugin->data; + ulong fslot; + /* Use the same way to iterate as in ha_initialize_handlerton(). */ + for (fslot = 0; fslot < se_plugin_array.size(); fslot++) { + if (!se_plugin_array[fslot]) break; + } + if (fslot < se_plugin_array.size()) + tp->slot = fslot; + else { + tp->slot = se_plugin_array.size(); + } + + if (se_plugin_array.assign_at(tp->slot, plugin) || + builtin_htons.assign_at(tp->slot, (plugin->plugin_dl == nullptr))) + return 1; + + uint tmp = tp->savepoint_offset; + tp->savepoint_offset = savepoint_alloc_size; + savepoint_alloc_size += tmp; + + if (tp->prepare) { + total_ha_2pc++; + } + + return 0; +} + int ha_init() { int error = 0; DBUG_TRACE; @@ -2553,6 +2584,9 @@ int ha_delete_table(THD *thd, handlerton *table_type, const char *path, TABLE_SHARE dummy_share; DBUG_TRACE; + error = vidx::dd_table_has_hlindexes(table_def) && + vidx::delete_table(thd, table_def, db); + dummy_table.s = &dummy_share; /* DB_TYPE_UNKNOWN is used in ALTER TABLE when renaming only .frm files */ @@ -2566,7 +2600,8 @@ int ha_delete_table(THD *thd, handlerton *table_type, const char *path, path = get_canonical_filename(file, path, tmp_path); - if ((error = file->ha_delete_table(path, table_def)) && generate_warning) { + if ((error || (error = file->ha_delete_table(path, table_def))) && + generate_warning) { /* Because file->print_error() use my_error() to generate the error message we use an internal error handler to intercept it and store the text @@ -3446,6 +3481,8 @@ int handler::ha_index_first(uchar *buf) { // Set status for the need to update generated fields m_update_generated_read_fields = table->has_gcol(); + assert(active_index < table_share->keys); + MYSQL_TABLE_IO_WAIT(PSI_TABLE_FETCH_ROW, active_index, result, { result = index_first(buf); }) if (!result && m_update_generated_read_fields) { @@ -4835,8 +4872,10 @@ int handler::ha_bulk_update_row(const uchar *old_data, uchar *new_data, int handler::ha_delete_all_rows() { assert(table_share->tmp_table != NO_TMP_TABLE || m_lock_type == F_WRLCK); mark_trx_read_write(); + int err = delete_all_rows(); + if (unlikely(!err)) err = table->hlindexes_on_delete_all(); - return delete_all_rows(); + return err; } /** @@ -5204,6 +5243,10 @@ int handler::index_next_same(uchar *buf, const uchar *key, uint keylen) { by storage engine if it supports atomic DDL. For non-temporary tables these changes will be saved to the data-dictionary by this call. + @param last_key key info of last index if table_def is created + instead of loaded from dd. Otherwise nullptr + @param recycled Whether create table came from recycling the + truncated operation @retval 0 ok @@ -5213,7 +5256,7 @@ int handler::index_next_same(uchar *buf, const uchar *key, uint keylen) { int ha_create_table(THD *thd, const char *path, const char *db, const char *table_name, HA_CREATE_INFO *create_info, bool update_create_info, bool is_temp_table, - dd::Table *table_def) { + dd::Table *table_def, KEY *last_key, bool recycled) { int error = 1; TABLE table; char name_buff[FN_REFLEN]; @@ -5224,6 +5267,7 @@ int ha_create_table(THD *thd, const char *path, const char *db, (create_info->options & HA_LEX_CREATE_TMP_TABLE) || (strstr(path, tmp_file_prefix) != nullptr); #endif + const uint64_t old_table_id = table_def->se_private_id(); DBUG_TRACE; init_tmp_table_share(thd, &share, db, 0, table_name, path, nullptr); @@ -5234,6 +5278,10 @@ int ha_create_table(THD *thd, const char *path, const char *db, share.m_psi = PSI_TABLE_CALL(get_table_share)(temp_table, &share); #endif + if (last_key == nullptr) { + last_key = share.get_vec_key(); + } + // When db_stat is 0, we can pass nullptr as dd::Table since it won't be used. destroy(&table); if (open_table_from_share(thd, &share, "", 0, (uint)READ_ALL, 0, &table, true, @@ -5257,6 +5305,10 @@ int ha_create_table(THD *thd, const char *path, const char *db, PSI_TABLE_CALL(drop_table_share) (temp_table, db, strlen(db), table_name, strlen(table_name)); #endif + } else if (vidx::key_is_vector(last_key) && + vidx::create_table(thd, last_key, table_def, &table, db, + old_table_id)) { + error = 1; } else { /* We do post-create update only for engines supporting atomic DDL @@ -7894,6 +7946,11 @@ class Binlog_log_row_cleanup { int binlog_log_row(TABLE *table, const uchar *before_record, const uchar *after_record, Log_func *log_func) { + if (table->s->is_hlindex) { + /* Don't write binlog for HLINDEX. */ + return 0; + } + bool error = false; THD *const thd = table->in_use; @@ -7966,6 +8023,11 @@ int binlog_log_row(TABLE *table, const uchar *before_record, int handler::ha_external_lock(THD *thd, int lock_type) { int error; DBUG_TRACE; + if (table->hlindex != nullptr && lock_type == F_UNLCK && + table->hlindex->file->get_lock_type() != F_UNLCK && + (error = table->hlindex->file->ha_external_lock(thd, F_UNLCK)) != 0) { + return error; + } /* Whether this is lock or unlock, this should be true, and is to verify that if get_auto_increment() was called (thus may have reserved intervals or @@ -8031,6 +8093,9 @@ int handler::ha_reset() { m_unique = nullptr; const int retval = reset(); + + table->reset_hlindexes(); + return retval; } @@ -8055,6 +8120,8 @@ int handler::ha_write_row(uchar *buf) { if (unlikely(error)) return error; + if (unlikely((error = table->hlindexes_on_insert()))) return error; + if (unlikely((error = binlog_log_row(table, nullptr, buf, log_func)))) return error; /* purecov: inspected */ @@ -8083,6 +8150,7 @@ int handler::ha_update_row(const uchar *old_data, uchar *new_data) { MYSQL_TABLE_IO_WAIT(PSI_TABLE_UPDATE_ROW, active_index, error, { error = update_row(old_data, new_data); }) + if (unlikely(!error && (error = table->hlindexes_on_update()))) return error; if (unlikely(error)) return error; if (unlikely((error = binlog_log_row(table, old_data, new_data, log_func)))) @@ -8115,6 +8183,7 @@ int handler::ha_delete_row(const uchar *buf) { { error = delete_row(buf); }) if (unlikely(error)) return error; + if (unlikely((error = table->hlindexes_on_delete(buf)))) return error; if (unlikely((error = binlog_log_row(table, buf, nullptr, log_func)))) return error; return 0; diff --git a/sql/handler.h b/sql/handler.h index dd9ba4e389f..6bd2f24181d 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -671,6 +671,7 @@ enum legacy_db_type { DB_TYPE_TEMPTABLE, DB_TYPE_FIRST_DYNAMIC = 42, DB_TYPE_DUCKDB, + DB_TYPE_HLINDEX_HELPER, DB_TYPE_DEFAULT = 127 // Must be last }; @@ -7205,6 +7206,7 @@ int ha_init(void); void ha_end(); int ha_initialize_handlerton(st_plugin_int *plugin); int ha_finalize_handlerton(st_plugin_int *plugin); +int setup_transaction_participant(st_plugin_int *plugin); TYPELIB *ha_known_exts(); int ha_panic(enum ha_panic_function flag); @@ -7227,7 +7229,8 @@ void ha_create_database(char *db); int ha_create_table(THD *thd, const char *path, const char *db, const char *table_name, HA_CREATE_INFO *create_info, bool update_create_info, bool is_temp_table, - dd::Table *table_def); + dd::Table *table_def, KEY *last_key = nullptr, + bool recycled = false); int ha_delete_table(THD *thd, handlerton *db_type, const char *path, const char *db, const char *alias, diff --git a/sql/item.h b/sql/item.h index a4fb20d9767..441785b00d5 100644 --- a/sql/item.h +++ b/sql/item.h @@ -1588,6 +1588,16 @@ class Item : public Parse_tree_node { max_length = MAX_DATETIME_WIDTH + fsp + (fsp > 0 ? 1 : 0); } + /** + Set the data type of the Item to be VECTOR. + */ + void set_data_type_vector(uint32 max_l) { + set_data_type(MYSQL_TYPE_VARCHAR); + collation.set(&my_charset_bin, DERIVATION_IMPLICIT); + decimals = DECIMAL_NOT_SPECIFIED; + max_length = max_l; + } + /** Set the data type of the Item to be GEOMETRY. */ diff --git a/sql/item_create.cc b/sql/item_create.cc index b02274259d3..ffd0b85afd7 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -1662,6 +1662,17 @@ static const std::pair func_array[] = { {"TO_BASE64", SQL_FN(Item_func_to_base64, 1)}, {"TO_DAYS", SQL_FN(Item_func_to_days, 1)}, {"TO_SECONDS", SQL_FN(Item_func_to_seconds, 1)}, + {"VEC_DISTANCE", SQL_FN(vidx::Item_func_vec_distance, 2)}, + {"VEC_DISTANCE_EUCLIDEAN", + SQL_FN(vidx::Item_func_vec_distance_euclidean, 2)}, + {"VEC_DISTANCE_COSINE", SQL_FN(vidx::Item_func_vec_distance_cosine, 2)}, + {"VEC_FROMTEXT", SQL_FN(vidx::Item_func_vec_fromtext, 1)}, + {"TO_VECTOR", SQL_FN(vidx::Item_func_vec_fromtext, 1)}, + {"STRING_TO_VECTOR", SQL_FN(vidx::Item_func_vec_fromtext, 1)}, + {"VEC_TOTEXT", SQL_FN(vidx::Item_func_vec_totext, 1)}, + {"FROM_VECTOR", SQL_FN(vidx::Item_func_vec_totext, 1)}, + {"VECTOR_TO_STRING", SQL_FN(vidx::Item_func_vec_totext, 1)}, + {"VECTOR_DIM", SQL_FN(vidx::Item_func_vector_dim, 1)}, {"UCASE", SQL_FN(Item_func_upper, 1)}, {"UNCOMPRESS", SQL_FN(Item_func_uncompress, 1)}, {"UNCOMPRESSED_LENGTH", SQL_FN(Item_func_uncompressed_length, 1)}, diff --git a/sql/item_func.h b/sql/item_func.h index 72fefbf903a..07b6815ac7c 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -192,6 +192,7 @@ class Item_func : public Item_result_field { GE_FUNC, GT_FUNC, FT_FUNC, + VECTOR_DISTANCE_FUNC, MATCH_FUNC, LIKE_FUNC, ISNULL_FUNC, diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 76d8231d426..710e1cff802 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -1785,4 +1785,6 @@ class Item_func_internal_get_dd_column_extra final : public Item_str_func { String *val_str(String *) override; }; +#include "vidx/vidx_func.h" + #endif /* ITEM_STRFUNC_INCLUDED */ diff --git a/sql/iterators/basic_row_iterators.cc b/sql/iterators/basic_row_iterators.cc index 1b5a0fac8d6..b0c1e7176e8 100644 --- a/sql/iterators/basic_row_iterators.cc +++ b/sql/iterators/basic_row_iterators.cc @@ -58,13 +58,15 @@ template IndexScanIterator::IndexScanIterator(THD *thd, TABLE *table, int idx, bool use_order, double expected_rows, - ha_rows *examined_rows) + ha_rows *examined_rows, + void *vec_func) : TableRowIterator(thd, table), m_record(table->record[0]), m_idx(idx), m_use_order(use_order), m_expected_rows(expected_rows), - m_examined_rows(examined_rows) {} + m_examined_rows(examined_rows), + m_vec_func(vec_func) {} template IndexScanIterator::~IndexScanIterator() { @@ -75,12 +77,19 @@ IndexScanIterator::~IndexScanIterator() { template bool IndexScanIterator::Init() { + assert((m_idx < (int)table()->s->keys) == (m_vec_func == nullptr)); + if (!table()->file->inited) { if (table()->covering_keys.is_set(m_idx) && !table()->no_keyread) { table()->set_keyread(true); } - int error = table()->file->ha_index_init(m_idx, m_use_order); + /* m_vec_func means the vector index is used which using the auxiliary + table and later re-scanning the main table */ + int error = m_vec_func != nullptr + ? table()->file->ha_rnd_init(false) + : table()->file->ha_index_init(m_idx, m_use_order); + if (error) { PrintError(error); return true; @@ -99,12 +108,18 @@ bool IndexScanIterator::Init() { //! @cond template <> int IndexScanIterator::Read() { // Forward read. + assert((m_vec_func == nullptr) == (m_idx < (int)table()->s->keys)); + assert((m_vec_func == nullptr) == (table()->file->inited == handler::INDEX)); + int error; if (m_first) { - error = table()->file->ha_index_first(m_record); + error = (m_vec_func != nullptr) + ? table()->hlindex_read_first(m_idx, m_vec_func) + : table()->file->ha_index_first(m_record); m_first = false; } else { - error = table()->file->ha_index_next(m_record); + error = (m_vec_func != nullptr) ? table()->hlindex_read_next() + : table()->file->ha_index_next(m_record); } if (error) return HandleError(error); if (m_examined_rows != nullptr) { @@ -115,6 +130,9 @@ int IndexScanIterator::Read() { // Forward read. template <> int IndexScanIterator::Read() { // Backward read. + assert(m_idx < (int)table()->s->keys); + assert(m_vec_func == nullptr); + int error; if (m_first) { error = table()->file->ha_index_last(m_record); diff --git a/sql/iterators/basic_row_iterators.h b/sql/iterators/basic_row_iterators.h index 8a55cb837bc..8a8c0097ca9 100644 --- a/sql/iterators/basic_row_iterators.h +++ b/sql/iterators/basic_row_iterators.h @@ -113,7 +113,8 @@ class IndexScanIterator final : public TableRowIterator { // // "examined_rows", if not nullptr, is incremented for each successful Read(). IndexScanIterator(THD *thd, TABLE *table, int idx, bool use_order, - double expected_rows, ha_rows *examined_rows); + double expected_rows, ha_rows *examined_rows, + void *vec_func); ~IndexScanIterator() override; bool Init() override; @@ -125,6 +126,7 @@ class IndexScanIterator final : public TableRowIterator { const bool m_use_order; const double m_expected_rows; ha_rows *const m_examined_rows; + void *m_vec_func; bool m_first = true; }; diff --git a/sql/join_optimizer/access_path.cc b/sql/join_optimizer/access_path.cc index 6e835eebaa0..f8ad2bb624e 100644 --- a/sql/join_optimizer/access_path.cc +++ b/sql/join_optimizer/access_path.cc @@ -428,13 +428,15 @@ unique_ptr_destroy_only CreateIteratorFromAccessPath( case AccessPath::INDEX_SCAN: { const auto ¶m = path->index_scan(); if (param.reverse) { + assert(param.vec_func == nullptr); + iterator = NewIterator>( thd, mem_root, param.table, param.idx, param.use_order, - path->num_output_rows(), examined_rows); + path->num_output_rows(), examined_rows, param.vec_func); } else { iterator = NewIterator>( thd, mem_root, param.table, param.idx, param.use_order, - path->num_output_rows(), examined_rows); + path->num_output_rows(), examined_rows, param.vec_func); } break; } diff --git a/sql/join_optimizer/access_path.h b/sql/join_optimizer/access_path.h index 3d55eaa87d3..5384b3926a2 100644 --- a/sql/join_optimizer/access_path.h +++ b/sql/join_optimizer/access_path.h @@ -867,6 +867,7 @@ struct AccessPath { int idx; bool use_order; bool reverse; + void *vec_func; } index_scan; struct { TABLE *table; @@ -1247,7 +1248,8 @@ inline AccessPath *NewTableScanAccessPath(THD *thd, TABLE *table, inline AccessPath *NewIndexScanAccessPath(THD *thd, TABLE *table, int idx, bool use_order, bool reverse, - bool count_examined_rows) { + bool count_examined_rows, + void *vec_func = nullptr) { AccessPath *path = new (thd->mem_root) AccessPath; path->type = AccessPath::INDEX_SCAN; path->count_examined_rows = count_examined_rows; @@ -1255,6 +1257,7 @@ inline AccessPath *NewIndexScanAccessPath(THD *thd, TABLE *table, int idx, path->index_scan().idx = idx; path->index_scan().use_order = use_order; path->index_scan().reverse = reverse; + path->index_scan().vec_func = vec_func; return path; } diff --git a/sql/key.h b/sql/key.h index c491210b562..81da4bb8867 100644 --- a/sql/key.h +++ b/sql/key.h @@ -159,6 +159,10 @@ class KEY { */ ulong *rec_per_key{nullptr}; + /** Options of vector index */ + uint vector_distance{0}; + uint vector_m{0}; + /** @retval true if this is a functional index (at least one of the key parts is a functional key part). diff --git a/sql/key_spec.h b/sql/key_spec.h index af11926465b..5902d5c3b31 100644 --- a/sql/key_spec.h +++ b/sql/key_spec.h @@ -43,7 +43,8 @@ enum keytype { KEYTYPE_MULTIPLE, KEYTYPE_FULLTEXT, KEYTYPE_SPATIAL, - KEYTYPE_FOREIGN + KEYTYPE_FOREIGN, + KEYTYPE_VECTOR }; enum fk_option { @@ -76,6 +77,8 @@ class KEY_CREATE_INFO { LEX_CSTRING parser_name = {NullS, 0}; LEX_CSTRING comment = {NullS, 0}; bool is_visible = true; + uint vector_m = UINT_MAX; + uint vector_distance = UINT_MAX; KEY_CREATE_INFO() = default; diff --git a/sql/lex.h b/sql/lex.h index fb3402d12d5..061a3ec43af 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -824,6 +824,11 @@ static const SYMBOL symbols[] = { {SYM("ZEROFILL", ZEROFILL_SYM)}, {SYM("ZONE", ZONE_SYM)}, {SYM("||", OR_OR_SYM)}, + {SYM("VECTOR", VECTOR_SYM)}, + {SYM("M", M_SYM)}, + {SYM("DISTANCE", DISTANCE_SYM)}, + {SYM("EUCLIDEAN", EUCLIDEAN_SYM)}, + {SYM("COSINE", COSINE_SYM)}, /* Place keywords that accept optimizer hints below this comment. */ diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 00f7a6b4758..94654149353 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -11919,6 +11919,7 @@ PSI_mutex_key key_mutex_slave_parallel_worker_count; PSI_mutex_key key_mutex_slave_parallel_worker; PSI_mutex_key key_structure_guard_mutex; PSI_mutex_key key_TABLE_SHARE_LOCK_ha_data; +PSI_mutex_key key_TABLE_SHARE_LOCK_share; PSI_mutex_key key_LOCK_query_plan; PSI_mutex_key key_LOCK_thd_query; PSI_mutex_key key_LOCK_cost_const; @@ -12008,6 +12009,7 @@ static PSI_mutex_info all_server_mutexes[]= { &key_mutex_slave_parallel_worker_count, "Relay_log_info::exit_count_lock", 0, 0, PSI_DOCUMENT_ME}, { &key_mutex_slave_parallel_worker, "Worker_info::jobs_lock", 0, 0, PSI_DOCUMENT_ME}, { &key_TABLE_SHARE_LOCK_ha_data, "TABLE_SHARE::LOCK_ha_data", 0, 0, PSI_DOCUMENT_ME}, + { &key_TABLE_SHARE_LOCK_share, "TABLE_SHARE::LOCK_share", 0, 0, PSI_DOCUMENT_ME}, { &key_LOCK_error_messages, "LOCK_error_messages", PSI_FLAG_SINGLETON, 0, PSI_DOCUMENT_ME}, { &key_LOCK_log_throttle_qni, "LOCK_log_throttle_qni", PSI_FLAG_SINGLETON, 0, PSI_DOCUMENT_ME}, { &key_gtid_ensure_index_mutex, "Gtid_state", PSI_FLAG_SINGLETON, 0, PSI_DOCUMENT_ME}, diff --git a/sql/mysqld.h b/sql/mysqld.h index f86f602fbd9..153762e0fd9 100644 --- a/sql/mysqld.h +++ b/sql/mysqld.h @@ -462,6 +462,7 @@ extern PSI_mutex_key key_mutex_slave_parallel_worker; extern PSI_mutex_key key_mutex_slave_parallel_worker_count; extern PSI_mutex_key key_structure_guard_mutex; extern PSI_mutex_key key_TABLE_SHARE_LOCK_ha_data; +extern PSI_mutex_key key_TABLE_SHARE_LOCK_share; extern PSI_mutex_key key_LOCK_query_plan; extern PSI_mutex_key key_LOCK_thd_query; extern PSI_mutex_key key_LOCK_cost_const; diff --git a/sql/parse_tree_column_attrs.h b/sql/parse_tree_column_attrs.h index bd37074e556..3c06119236f 100644 --- a/sql/parse_tree_column_attrs.h +++ b/sql/parse_tree_column_attrs.h @@ -618,6 +618,7 @@ class PT_type : public Parse_tree_node { virtual uint get_uint_geom_type() const { return 0; } virtual List *get_interval_list() const { return nullptr; } virtual bool is_serial_type() const { return false; } + virtual bool is_vector() const { return false; } }; /** @@ -738,6 +739,25 @@ class PT_char_type : public PT_type { const CHARSET_INFO *get_charset() const override { return charset; } }; +class PT_vector_type : public PT_type { + char vector_length_buffer[33]{}; + + public: + PT_vector_type(THD *thd, const char *length) : PT_type(MYSQL_TYPE_VARCHAR) { +#ifndef NDEBUG + assert(length != nullptr); +#endif /* NDEBUG */ + uint vector_length = atoi(length) * sizeof(float); + sprintf(vector_length_buffer, "%u", vector_length); + + thd->m_query_has_vector_column = true; + } + + const char *get_length() const override { return vector_length_buffer; } + const CHARSET_INFO *get_charset() const override { return &my_charset_bin; } + bool is_vector() const final { return true; } +}; + enum class Blob_type { TINY = MYSQL_TYPE_TINY_BLOB, MEDIUM = MYSQL_TYPE_MEDIUM_BLOB, @@ -959,6 +979,7 @@ class PT_field_def_base : public Parse_tree_node { const char *dec; const CHARSET_INFO *charset; bool has_explicit_collation; + bool is_vector = false; uint uint_geom_type; List *interval_list; alter_info_flags_t alter_info_flags; @@ -994,6 +1015,7 @@ class PT_field_def_base : public Parse_tree_node { length = type_node->get_length(); dec = type_node->get_dec(); charset = type_node->get_charset(); + is_vector = type_node->is_vector(); uint_geom_type = type_node->get_uint_geom_type(); interval_list = type_node->get_interval_list(); check_const_spec_list = new (pc->thd->mem_root) diff --git a/sql/parse_tree_nodes.cc b/sql/parse_tree_nodes.cc index 0721d64c6b8..d3ca9e899c0 100644 --- a/sql/parse_tree_nodes.cc +++ b/sql/parse_tree_nodes.cc @@ -2205,7 +2205,8 @@ bool PT_column_def::contextualize(Table_ddl_parse_context *pc) { field_def->interval_list, field_def->charset, field_def->has_explicit_collation, field_def->uint_geom_type, field_def->gcol_info, field_def->default_val_info, opt_place, - field_def->m_srid, field_def->check_const_spec_list, field_hidden_type); + field_def->m_srid, field_def->check_const_spec_list, field_hidden_type, + field_def->is_vector); } Sql_cmd *PT_create_table_stmt::make_cmd(THD *thd) { @@ -2959,7 +2960,7 @@ bool PT_alter_table_change_column::contextualize(Table_ddl_parse_context *pc) { m_field_def->has_explicit_collation, m_field_def->uint_geom_type, m_field_def->gcol_info, m_field_def->default_val_info, m_opt_place, m_field_def->m_srid, m_field_def->check_const_spec_list, - field_hidden_type); + field_hidden_type, m_field_def->is_vector); } bool PT_alter_table_rename::contextualize(Table_ddl_parse_context *pc) { @@ -3471,7 +3472,8 @@ bool PT_json_table_column_with_path::contextualize(Parse_context *pc) { nullptr, // Gcol_info nullptr, // Default gen expression {}, // SRID - dd::Column::enum_hidden_type::HT_VISIBLE); // Hidden + dd::Column::enum_hidden_type::HT_VISIBLE, // Hidden + m_type->is_vector()); // Hidden return false; } diff --git a/sql/parse_tree_nodes.h b/sql/parse_tree_nodes.h index a849c5a8117..a95e7a65a67 100644 --- a/sql/parse_tree_nodes.h +++ b/sql/parse_tree_nodes.h @@ -2219,6 +2219,10 @@ typedef PT_index_option PT_fulltext_index_parser_name; typedef PT_index_option PT_index_visibility; +typedef PT_index_option PT_index_vector_m; +typedef PT_index_option + PT_index_vector_distance; + /** The data structure (B-tree, Hash, etc) used for an index is called 'index_type' in the manual. Internally, this is stored in diff --git a/sql/psi_memory_key.cc b/sql/psi_memory_key.cc index 4633f5afd41..6e577200847 100644 --- a/sql/psi_memory_key.cc +++ b/sql/psi_memory_key.cc @@ -145,6 +145,7 @@ PSI_memory_key key_memory_user_var_entry; PSI_memory_key key_memory_user_var_entry_value; PSI_memory_key key_memory_sp_cache; PSI_memory_key key_memory_write_set_extraction; +PSI_memory_key key_memory_vidx_mem; #ifdef HAVE_PSI_INTERFACE @@ -370,6 +371,7 @@ static PSI_memory_info all_server_memory[] = { {&key_memory_log_sink_pfs, "log_sink_pfs", PSI_FLAG_ONLY_GLOBAL_STAT, 0, PSI_DOCUMENT_ME}, {&key_memory_histograms, "histograms", 0, 0, PSI_DOCUMENT_ME}, + {&key_memory_vidx_mem, "vector_index", 0, 0, PSI_DOCUMENT_ME}, {&key_memory_hash_join, "hash_join", PSI_FLAG_MEM_COLLECT, 0, PSI_DOCUMENT_ME}, {&key_memory_rm_table_foreach_root, "rm_table::foreach_root", diff --git a/sql/psi_memory_key.h b/sql/psi_memory_key.h index fddd758d594..7f2b7cd95c0 100644 --- a/sql/psi_memory_key.h +++ b/sql/psi_memory_key.h @@ -171,5 +171,5 @@ extern PSI_memory_key key_memory_user_var_entry; extern PSI_memory_key key_memory_user_var_entry_value; extern PSI_memory_key key_memory_sp_cache; extern PSI_memory_key key_memory_write_set_extraction; - +extern PSI_memory_key key_memory_vidx_mem; #endif // PSI_MEMORY_KEY_INCLUDED diff --git a/sql/server_component/table_access_service.cc b/sql/server_component/table_access_service.cc index 683cb5d9d29..2a9c58f4521 100644 --- a/sql/server_component/table_access_service.cc +++ b/sql/server_component/table_access_service.cc @@ -1025,7 +1025,7 @@ int impl_index_init(Table_access /* api_ta */, TA_table api_table, *api_key = nullptr; - for (index = 0; index < share->keys; index++) { + for (index = 0; index < share->total_keys; index++) { key_info = &table->key_info[index]; /* FIXME: KEY::name has no associated length member */ diff --git a/sql/sql_alter.h b/sql/sql_alter.h index 5465e833eb1..5c1382b8cc4 100644 --- a/sql/sql_alter.h +++ b/sql/sql_alter.h @@ -497,7 +497,8 @@ class Alter_info { Value_generator *default_val_expr, const char *opt_after, std::optional srid, Sql_check_constraint_spec_list *check_cons_list, - dd::Column::enum_hidden_type hidden, bool is_array = false); + dd::Column::enum_hidden_type hidden, bool is_vector, + bool is_array = false); private: Alter_info &operator=(const Alter_info &rhs); // not implemented diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 13b7a0454d1..939693152cd 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -989,6 +989,8 @@ void release_table_share(TABLE_SHARE *share) { assert(share->ref_count() != 0); if (share->decrement_ref_count() == 0) { + assert(share->hlindex == nullptr || share->hlindex->ref_count() == 0); + if (share->has_old_version() || table_def_shutdown_in_progress) table_def_cache->erase(to_string(share->table_cache_key)); else { @@ -1117,6 +1119,12 @@ OPEN_TABLE_LIST *list_open_tables(THD *thd, const char *db, const char *wild) { void intern_close_table(TABLE *table) { // Free all structures DBUG_TRACE; + + if (table->hlindex != nullptr) { + intern_close_table(table->hlindex); + table->hlindex = nullptr; + } + DBUG_PRINT("tcache", ("table: '%s'.'%s' %p", table->s ? table->s->db.str : "?", table->s ? table->s->table_name.str : "?", table)); @@ -2398,6 +2406,13 @@ void close_temporary_table(THD *thd, TABLE *table, bool free_share, void close_temporary(THD *thd, TABLE *table, bool free_share, bool delete_table) { + if (table->hlindex != nullptr) { + /* The temp table during DDL may have hlindexes. */ + close_temporary(thd, table->hlindex, free_share, delete_table); + table->hlindex = nullptr; + table->s->hlindex = nullptr; + } + handlerton *table_type = table->s->db_type(); DBUG_TRACE; DBUG_PRINT("tmptable", ("closing table: '%s'.'%s'", table->s->db.str, diff --git a/sql/sql_builtin.cc.in b/sql/sql_builtin.cc.in index 8dc70d0b2f4..6a46bbda111 100644 --- a/sql/sql_builtin.cc.in +++ b/sql/sql_builtin.cc.in @@ -31,7 +31,7 @@ extern "C" extern #endif builtin_plugin - @mysql_mandatory_plugins@ @mysql_optional_plugins@ builtin_binlog_plugin, builtin_mysql_password_plugin, builtin_caching_sha2_password_plugin, builtin_daemon_keyring_proxy_plugin; + @mysql_mandatory_plugins@ @mysql_optional_plugins@ builtin_binlog_plugin, builtin_mysql_password_plugin, builtin_caching_sha2_password_plugin, builtin_daemon_keyring_proxy_plugin, builtin_vidx_plugin; struct st_mysql_plugin *mysql_optional_plugins[]= { @@ -40,5 +40,5 @@ struct st_mysql_plugin *mysql_optional_plugins[]= struct st_mysql_plugin *mysql_mandatory_plugins[]= { - builtin_binlog_plugin, builtin_mysql_password_plugin, builtin_caching_sha2_password_plugin, builtin_daemon_keyring_proxy_plugin, @mysql_mandatory_plugins@ 0 + builtin_binlog_plugin, builtin_mysql_password_plugin, builtin_caching_sha2_password_plugin, builtin_daemon_keyring_proxy_plugin, builtin_vidx_plugin, @mysql_mandatory_plugins@ 0 }; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 07053313a4b..f731d73d3d2 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -3088,6 +3088,8 @@ void THD::notify_hton_post_release_exclusive(const MDL_key *mdl_key) { Then, transform the parse tree further into an AST, ready for resolving. */ bool THD::sql_parser() { + m_query_has_vector_column = false; + /* SQL parser function generated by YACC from sql_yacc.yy. diff --git a/sql/sql_class.h b/sql/sql_class.h index c3dd6188b79..809f7f6cee7 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -4742,8 +4742,12 @@ class THD : public MDL_context_owner, std::unordered_map external_store_; THD_rds_context m_rds_context; + public: THD_rds_context &get_rds_context() { return m_rds_context; } + + /* Indicates if query has vector column. */ + bool m_query_has_vector_column{false}; }; // End of class THD /** diff --git a/sql/sql_executor.cc b/sql/sql_executor.cc index a905c1f0b50..4e5eb1f83a5 100644 --- a/sql/sql_executor.cc +++ b/sql/sql_executor.cc @@ -3791,7 +3791,7 @@ AccessPath *QEP_TAB::access_path() { case JT_INDEX_SCAN: path = NewIndexScanAccessPath(join()->thd, table(), index(), use_order(), m_reversed_access, - /*count_examined_rows=*/true); + /*count_examined_rows=*/true, vec_func()); break; case JT_ALL: case JT_RANGE: diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 6520da9901f..4d735ca370f 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -75,6 +75,7 @@ #include "sql/window.h" #include "sql_update.h" // Sql_cmd_update #include "template_utils.h" +#include "vidx/vidx_common.h" // RDS_COMMENT_VERSION class PT_hint_list; @@ -1872,7 +1873,7 @@ static int lex_one_token(Lexer_yystype *yylval, THD *thd) { ulong version; version = strtol(version_str, nullptr, 10); - if (version <= MYSQL_VERSION_ID) { + if (version <= MYSQL_VERSION_ID || version >= RDS_COMMENT_VERSION) { /* Accept 'M' 'm' 'm' 'd' 'd' */ lip->yySkipn(5); /* Expand the content of the special comment as real code */ diff --git a/sql/sql_opt_exec_shared.h b/sql/sql_opt_exec_shared.h index fca770253da..0ee65e8894d 100644 --- a/sql/sql_opt_exec_shared.h +++ b/sql/sql_opt_exec_shared.h @@ -311,6 +311,8 @@ class QEP_shared { table_map added_tables() const { return added_tables_map; } Item_func_match *ft_func() const { return m_ft_func; } void set_ft_func(Item_func_match *f) { m_ft_func = f; } + void *vec_func() const { return m_vec_func; } + void set_vec_func(void *f) { m_vec_func = f; } // More elaborate functions: @@ -467,6 +469,9 @@ class QEP_shared { /** FT function */ Item_func_match *m_ft_func; + /** Vector distance function */ + void *m_vec_func = nullptr; + /** Set if index dive can be skipped for this query. See comments for check_skip_records_in_range_qualification. @@ -540,6 +545,8 @@ class QEP_shared_owner { table_map added_tables() const { return m_qs->added_tables(); } Item_func_match *ft_func() const { return m_qs->ft_func(); } void set_ft_func(Item_func_match *f) { return m_qs->set_ft_func(f); } + void *vec_func() const { return m_qs->vec_func(); } + void set_vec_func(void *f) { return m_qs->set_vec_func(f); } void set_prefix_tables(table_map prefix_tables, table_map prev_tables) { return m_qs->set_prefix_tables(prefix_tables, prev_tables); } diff --git a/sql/sql_optimizer.cc b/sql/sql_optimizer.cc index a0bdecdee62..94185ce5d82 100644 --- a/sql/sql_optimizer.cc +++ b/sql/sql_optimizer.cc @@ -73,6 +73,7 @@ #include "sql/item_cmpfunc.h" #include "sql/item_func.h" #include "sql/item_row.h" +#include "sql/item_strfunc.h" // vidx::Item_func_vec_distance #include "sql/item_subselect.h" #include "sql/item_sum.h" // Item_sum #include "sql/iterators/basic_row_iterators.h" @@ -113,6 +114,7 @@ #include "sql/window.h" #include "sql_string.h" #include "template_utils.h" +#include "vidx/vidx_index.h" // vidx::test_if_cheaper_vector_ordering using std::ceil; using std::max; @@ -1194,7 +1196,7 @@ bool substitute_gc(THD *thd, Query_block *query_block, Item *where_cond, // Collect all GCs that are a part of a key for (Table_ref *tl = query_block->leaf_tables; tl; tl = tl->next_leaf) { - if (tl->table->s->keys == 0) continue; + if (tl->table->s->total_keys == 0) continue; for (uint i = 0; i < tl->table->s->fields; i++) { Field *fld = tl->table->field[i]; if (fld->is_gcol() && @@ -1759,7 +1761,7 @@ bool is_prefix_index(TABLE *table, uint idx) { if (key_part->field && !(table->field[key_part->fieldnr - 1] ->part_of_prefixkey.is_clear_all()) && - !(key_info->flags & (HA_FULLTEXT | HA_SPATIAL))) { + !(key_info->flags & (HA_FULLTEXT | HA_SPATIAL | HA_VECTOR))) { return true; } } @@ -1967,7 +1969,7 @@ uint find_shortest_key(TABLE *table, const Key_map *usable_keys) { : MAX_KEY; if (!usable_keys->is_clear_all()) { uint min_length = (uint)~0; - for (uint nr = 0; nr < table->s->keys; nr++) { + for (uint nr = 0; nr < table->s->total_keys; nr++) { if (nr == usable_clustered_pk) continue; if (usable_keys->is_set(nr)) { /* @@ -2078,7 +2080,7 @@ static uint test_if_subkey(ORDER_with_src *order, JOIN_TAB *tab, uint ref, KEY_PART_INFO *ref_key_part = table->key_info[ref].key_part; KEY_PART_INFO *ref_key_part_end = ref_key_part + ref_key_parts; - for (nr = 0; nr < table->s->keys; nr++) { + for (nr = 0; nr < table->s->total_keys; nr++) { bool skip_quick; if (usable_keys->is_set(nr) && table->key_info[nr].key_length < min_length && @@ -2275,6 +2277,11 @@ static bool test_if_skip_sort_order(JOIN_TAB *tab, ORDER_with_src &order, return true; } } + + if (!ft_func && vidx::test_if_cheaper_vector_ordering( + tab, order.order, select_limit, order_idx)) { + return true; + } } /* @@ -7060,7 +7067,7 @@ static void warn_index_not_applicable(THD *thd, const Field *field, if (thd->lex->is_explain() || thd->variables.option_bits & OPTION_SAFE_UPDATES) - for (uint j = 0; j < field->table->s->keys; j++) + for (uint j = 0; j < field->table->s->total_keys; j++) if (cant_use_index.is_set(j)) push_warning_printf(thd, Sql_condition::SL_WARNING, ER_WARN_INDEX_NOT_APPLICABLE, @@ -7779,9 +7786,9 @@ static bool add_key_part(Key_use_array *keyuse_array, Key_field *key_field) { Table_ref *const tl = key_field->item_field->table_ref; TABLE *const table = tl->table; - for (uint key = 0; key < table->s->keys; key++) { + for (uint key = 0; key < table->s->total_keys; key++) { if (!(table->keys_in_use_for_query.is_set(key))) continue; - if (table->key_info[key].flags & (HA_FULLTEXT | HA_SPATIAL)) + if (table->key_info[key].flags & (HA_FULLTEXT | HA_SPATIAL | HA_VECTOR)) continue; // ToDo: ft-keys in non-ft queries. SerG uint key_parts = actual_key_parts(&table->key_info[key]); @@ -8125,7 +8132,7 @@ static void trace_indexes_added_group_distinct(Opt_trace_context *trace, KEY *key_info = join_tab->table()->key_info; Key_map existing_keys = join_tab->const_keys; - uint nbrkeys = join_tab->table()->s->keys; + uint nbrkeys = join_tab->table()->s->total_keys; Opt_trace_object trace_summary(trace, "const_keys_added"); { @@ -9306,7 +9313,7 @@ void JOIN::finalize_derived_keys() { */ if (table == nullptr || !tr->uses_materialization() || // (1) table->is_created() || // (2) - table->s->keys == 0 || // (3) + table->s->total_keys == 0 || // (3) (processed_tables & tr->map())) { // (4) continue; } @@ -9314,9 +9321,9 @@ void JOIN::finalize_derived_keys() { Collect all used keys before starting to shuffle them: First create a map from key number to the table using the key: */ - assert(table->s->keys <= MAX_INDEXES); + assert(table->s->total_keys <= MAX_INDEXES); TABLE *table_map[MAX_INDEXES]; - for (uint j = 0; j < table->s->keys; j++) { + for (uint j = 0; j < table->s->total_keys; j++) { table_map[j] = nullptr; } @@ -9326,7 +9333,7 @@ void JOIN::finalize_derived_keys() { // (deduplication) whether any expression refers to them or not. // In particular, they are used if we want to materialize a UNION DISTINCT // directly into the derived table. - for (uint key_idx = 0; key_idx < table->s->keys; ++key_idx) { + for (uint key_idx = 0; key_idx < table->s->total_keys; ++key_idx) { if (table->key_info[key_idx].flags & HA_NOSAME) { used_keys.set_bit(key_idx); } @@ -9361,7 +9368,7 @@ void JOIN::finalize_derived_keys() { (void)table->s->find_first_unused_tmp_key(used_keys); // Process keys in increasing key order - for (uint j = 0; j < table->s->keys; j++) { + for (uint j = 0; j < table->s->total_keys; j++) { TABLE *const t = table_map[j]; if (t == nullptr) continue; @@ -10632,7 +10639,7 @@ static bool list_contains_unique_index(JOIN_TAB *tab, TABLE *table = tab->table(); if (tab->is_inner_table_of_outer_join()) return false; - for (uint keynr = 0; keynr < table->s->keys; keynr++) { + for (uint keynr = 0; keynr < table->s->total_keys; keynr++) { if (keynr == table->s->primary_key || (table->key_info[keynr].flags & HA_NOSAME)) { KEY *keyinfo = table->key_info + keynr; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index ffecbf0266b..be8c24857cd 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -5516,6 +5516,7 @@ bool mysql_test_parse_for_slave(THD *thd) { @param col_check_const_spec_list List of column check constraints. @param hidden Column hidden type. @param is_array Whether it's a typed array field + @param is_vector Whether it's a typed vector field @return Return 0 if ok @@ -5529,7 +5530,7 @@ bool Alter_info::add_field( Value_generator *gcol_info, Value_generator *default_val_expr, const char *opt_after, std::optional srid, Sql_check_constraint_spec_list *col_check_const_spec_list, - dd::Column::enum_hidden_type hidden, bool is_array) { + dd::Column::enum_hidden_type hidden, bool is_vector, bool is_array) { uint8 datetime_precision = decimals ? atoi(decimals) : 0; DBUG_TRACE; assert(!is_array || hidden == dd::Column::enum_hidden_type::HT_HIDDEN_SQL); @@ -5630,7 +5631,7 @@ bool Alter_info::add_field( type_modifier, default_value, on_update_value, comment, change, interval_list, cs, has_explicit_collation, uint_geom_type, gcol_info, default_val_expr, srid, hidden, - is_array)) + is_array, is_vector)) return true; for (const auto &a : cf_appliers) { diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 5369a993367..73ca53d89b3 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -3802,6 +3802,10 @@ void JOIN::join_free() { } static void cleanup_table(TABLE *table) { + if (table->hlindex && table->hlindex->context) { + table->hlindex_read_end(); + } + if (table->is_created()) { table->file->ha_index_or_rnd_end(); } @@ -4989,7 +4993,7 @@ bool JOIN::make_tmp_tables_info() { /*sort_before_group=*/false)) return true; } - if (!tab->filesort && !tab->table()->s->keys && + if (!tab->filesort && !tab->table()->s->total_keys && (!(query_block->active_options() & OPTION_BUFFER_RESULT) || need_tmp_before_win || wno >= 1)) { /* @@ -5252,7 +5256,7 @@ bool test_if_cheaper_ordering(const JOIN_TAB *tab, ORDER_with_src *order, assert(refkey_rows_estimate >= 1.0); } - for (nr = 0; nr < table->s->keys; nr++) { + for (nr = 0; nr < table->s->total_keys; nr++) { int direction = 0; uint used_key_parts; bool skip_quick; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 1fecaeb94a0..1ccbacab30d 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -140,6 +140,7 @@ #include "sql_string.h" #include "template_utils.h" #include "thr_lock.h" +#include "vidx/vidx_index.h" /* @see dynamic_privileges_table.cc */ bool iterate_all_dynamic_privileges(THD *thd, @@ -2225,9 +2226,13 @@ bool store_create_info(THD *thd, Table_ref *table_list, String *packet, file->update_create_info(&create_info); primary_key = share->primary_key; - for (uint i = skip_gipk ? 1 : 0; i < share->keys; i++, key_info++) { + for (uint i = skip_gipk ? 1 : 0; i < share->total_keys; i++, key_info++) { KEY_PART_INFO *key_part = key_info->key_part; bool found_primary = false; + + if (key_info->flags & HA_VECTOR) + packet->append(STRING_WITH_LEN(RDS_COMMENT_VIDX_START)); + packet->append(STRING_WITH_LEN(",\n ")); if (i == primary_key && !strcmp(key_info->name, primary_key_name)) { @@ -2241,6 +2246,8 @@ bool store_create_info(THD *thd, Table_ref *table_list, String *packet, packet->append(STRING_WITH_LEN("UNIQUE KEY ")); else if (key_info->flags & HA_FULLTEXT) packet->append(STRING_WITH_LEN("FULLTEXT KEY ")); + else if (key_info->flags & HA_VECTOR) + packet->append(STRING_WITH_LEN("VECTOR KEY ")); else if (key_info->flags & HA_SPATIAL) packet->append(STRING_WITH_LEN("SPATIAL KEY ")); else @@ -2275,7 +2282,7 @@ bool store_create_info(THD *thd, Table_ref *table_list, String *packet, if (key_part->field && (key_part->length != table->field[key_part->fieldnr - 1]->key_length() && - !(key_info->flags & (HA_FULLTEXT | HA_SPATIAL)))) { + !(key_info->flags & (HA_FULLTEXT | HA_SPATIAL | HA_VECTOR)))) { packet->append_parenthesized((long)key_part->length / key_part->field->charset()->mbmaxlen); } @@ -2619,7 +2626,7 @@ bool store_create_info(THD *thd, Table_ref *table_list, String *packet, static void store_key_options(THD *thd, String *packet, TABLE *table, KEY *key_info) { bool foreign_db_mode = (thd->variables.sql_mode & MODE_ANSI) != 0; - char *end, buff[32]; + char *end, buff[40]; if (!foreign_db_mode) { /* @@ -2640,6 +2647,13 @@ static void store_key_options(THD *thd, String *packet, TABLE *table, } } + if (key_info->flags & HA_VECTOR) { + uint len = vidx::hnsw::index_options_print( + key_info->vector_distance, key_info->vector_m, buff, sizeof(buff)); + + packet->append(buff, len); + } + if ((key_info->flags & HA_USES_BLOCK_SIZE) && table->s->key_block_size != key_info->block_size) { packet->append(STRING_WITH_LEN(" KEY_BLOCK_SIZE=")); @@ -4287,7 +4301,7 @@ static int get_schema_tmp_table_keys_record(THD *thd, Table_ref *tables, key_info++; } - for (; i < show_table->s->keys; i++, key_info++) { + for (; i < show_table->s->total_keys; i++, key_info++) { KEY_PART_INFO *key_part = key_info->key_part; const char *str; for (uint j = 0; j < key_info->user_defined_key_parts; j++, key_part++) { @@ -4367,7 +4381,7 @@ static int get_schema_tmp_table_keys_record(THD *thd, Table_ref *tables, table->field[TMP_TABLE_KEYS_INDEX_TYPE]->store(str, strlen(str), cs); // SUB_PART - if (!(key_info->flags & HA_FULLTEXT) && + if (!(key_info->flags & (HA_FULLTEXT | HA_VECTOR)) && (key_part->field && key_part->length != show_table->s->field[key_part->fieldnr - 1]->key_length())) { diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 8e804d3d790..f5f298b204c 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -191,6 +191,7 @@ #include "sql/duckdb/duckdb_table.h" #include "sql/sql_table_ext.h" +#include "vidx/vidx_index.h" namespace dd { class View; @@ -511,7 +512,7 @@ class Disable_slave_info_update_guard { } }; -static bool trans_intermediate_ddl_commit(THD *thd, bool error) { +bool trans_intermediate_ddl_commit(THD *thd, bool error) { // Must be used for intermediate (but not final) DDL commits. Implicit_substatement_state_guard substatement_guard(thd); if (error) { @@ -998,9 +999,12 @@ static bool rea_create_tmp_table( return false; } + assert(!vidx::dd_table_has_hlindexes(tmp_table_ptr.get())); + // Create the table in the storage engine. if (ha_create_table(thd, path, db, table_name, create_info, false, false, - tmp_table_ptr.get())) { + tmp_table_ptr.get(), + keys == 0 ? nullptr : key_info + keys - 1)) { return true; } @@ -1178,7 +1182,7 @@ static bool rea_create_base_table( *post_ddl_ht = create_info->db_type; if (ha_create_table(thd, path, db, table_name, create_info, false, false, - table_def)) { + table_def, keys == 0 ? nullptr : key_info + keys - 1)) { /* Remove table from data-dictionary if it was added and rollback won't do this automatically. @@ -3922,8 +3926,12 @@ namespace { struct sort_keys { bool operator()(const KEY &a, const KEY &b) const { + // Sort VECTOR after not VECTOR. + if ((a.flags ^ b.flags) & HA_VECTOR) return b.flags & HA_VECTOR; + // std::sort may compare an element to itself: if (&a == &b) return false; + // Sort UNIQUE before not UNIQUE. if ((a.flags ^ b.flags) & HA_NOSAME) return a.flags & HA_NOSAME; @@ -4828,7 +4836,7 @@ static bool count_keys(const Mem_root_array &key_list, */ if ((key2->type != KEYTYPE_FOREIGN && key->type != KEYTYPE_FOREIGN && key2->type != KEYTYPE_SPATIAL && key2->type != KEYTYPE_FULLTEXT && - !redundant_keys->at(key2_counter) && + key2->type != KEYTYPE_VECTOR && !redundant_keys->at(key2_counter) && !foreign_key_prefix(key, key2))) { /* TODO: issue warning message */ /* mark that the generated key should be ignored */ @@ -4954,6 +4962,14 @@ static bool prepare_key_column(THD *thd, HA_CREATE_INFO *create_info, return true; } + if (key->type == KEYTYPE_VECTOR && + (!sql_field->is_vector || (sql_field->flags & FIELD_IS_INVISIBLE) || + sql_field->is_virtual_gcol())) { + my_error(ER_VECTOR_INDEX_USAGE, MYF(0), + "Only support one visible VECTOR column"); + return true; + } + if (sql_field->auto_flags & Field::NEXT_NUMBER) { if (column_nr == 0 || (file->ha_table_flags() & HA_AUTO_PART_KEY)) (*auto_increment)--; // Field is used @@ -5233,7 +5249,7 @@ static bool prepare_key_column(THD *thd, HA_CREATE_INFO *create_info, } if (key_part_length > file->max_key_part_length(create_info) && - key->type != KEYTYPE_FULLTEXT) { + key->type != KEYTYPE_FULLTEXT && key->type != KEYTYPE_VECTOR) { key_part_length = file->max_key_part_length(create_info); if (key->type == KEYTYPE_MULTIPLE) { /* not a critical problem */ @@ -5531,7 +5547,7 @@ static bool prepare_self_ref_fk_parent_key( for (const KEY *key = key_info_buffer; key < key_info_buffer + key_count; key++) { // We can't use FULLTEXT or SPATIAL indexes. - if (key->flags & (HA_FULLTEXT | HA_SPATIAL)) continue; + if (key->flags & (HA_FULLTEXT | HA_SPATIAL | HA_VECTOR)) continue; if (hton->foreign_keys_flags & HTON_FKS_NEED_DIFFERENT_PARENT_AND_SUPPORTING_KEYS) { @@ -5723,7 +5739,7 @@ static const KEY *find_fk_supporting_key(handlerton *hton, for (const KEY *key = key_info_buffer; key < key_info_buffer + key_count; key++) { // We can't use FULLTEXT or SPATIAL indexes. - if (key->flags & (HA_FULLTEXT | HA_SPATIAL)) continue; + if (key->flags & (HA_FULLTEXT | HA_SPATIAL | HA_VECTOR)) continue; if (key->algorithm == HA_KEY_ALG_HASH) { if (hton->foreign_keys_flags & HTON_FKS_WITH_SUPPORTING_HASH_KEYS) { @@ -7324,6 +7340,26 @@ static bool prepare_key( } key_info->flags |= HA_SPATIAL; break; + case KEYTYPE_VECTOR: + if (vidx::feature_disabled) { + my_error(ER_VECTOR_DISABLED, MYF(0)); + return true; + } + + if (vidx::copy_index_option_distance( + thd, &(key_info->vector_distance), + key->key_create_info.vector_distance) || + vidx::hnsw::copy_index_option_m(thd, &(key_info->vector_m), + key->key_create_info.vector_m)) { + my_error(ER_VECTOR_INDEX_USAGE, MYF(0), "Invalid options."); + return true; + } + if (!key->key_create_info.is_visible) { + my_error(ER_VECTOR_INDEX_USAGE, MYF(0), "Must be visible."); + return true; + } + key_info->flags |= HA_VECTOR; + break; case KEYTYPE_PRIMARY: case KEYTYPE_UNIQUE: key_info->flags |= HA_NOSAME; @@ -7359,6 +7395,9 @@ static bool prepare_key( assert(!key->key_create_info.is_algorithm_explicit); key_info->algorithm = HA_KEY_ALG_FULLTEXT; } else { + assert(!(key_info->flags & HA_VECTOR) || + !key->key_create_info.is_algorithm_explicit); + if (key->key_create_info.is_algorithm_explicit) { if (key->key_create_info.algorithm != HA_KEY_ALG_RTREE) { /* @@ -7421,7 +7460,7 @@ static bool prepare_key( key_info->actual_flags = key_info->flags; if (key_info->key_length > file->max_key_length() && - key->type != KEYTYPE_FULLTEXT) { + key->type != KEYTYPE_FULLTEXT && key->type != KEYTYPE_VECTOR) { my_error(ER_TOO_LONG_KEY, MYF(0), file->max_key_length()); if (thd->is_error()) // May be silenced - see Bug#20629014 return true; @@ -8076,6 +8115,28 @@ bool mysql_prepare_create_table( for (Key_spec *key : alter_info->key_list) { if (key->type == KEYTYPE_FOREIGN) continue; + if (key->type == KEYTYPE_VECTOR) { +#ifndef NDEBUG + assert(key->columns.size() == 1); + assert(!key->columns[0]->has_expression()); + assert(key->columns[0]->get_field_name() != nullptr); +#endif /* !NDEBUG */ + + if (is_partitioned || create_info->options & HA_LEX_CREATE_TMP_TABLE) { + my_error(ER_NOT_SUPPORTED_YET, MYF(0), + "the VECTOR index in partitioned or temp tables"); + return true; + } + + if (!(create_info->db_type->flags & HTON_SUPPORTS_ATOMIC_DDL)) { + my_error(ER_NOT_SUPPORTED_YET, MYF(0), + "the VECTOR index in engine not supporting atomic DDL"); + return true; + } + + continue; + } + for (size_t j = 0; j < key->columns.size(); ++j) { Key_part_spec *key_part_spec = key->columns[j]; // In the case of procedures, the Key_part_spec may both have an @@ -8248,6 +8309,12 @@ bool mysql_prepare_create_table( /* Sort keys in optimized order */ std::sort(*key_info_buffer, *key_info_buffer + *key_count, sort_keys()); + /* Check if there are multiple VECTOR indexes. */ + if (*key_count >= 2 && (*key_info_buffer)[*key_count - 2].flags & HA_VECTOR) { + my_error(ER_NOT_SUPPORTED_YET, MYF(0), "multiple VECTOR indexes"); + return true; + } + /* Normal keys are done, now prepare foreign keys. @@ -10232,7 +10299,9 @@ bool mysql_create_table(THD *thd, Table_ref *create_table, variable, but rely on logging what really has been done instead. */ if ((create_table->table == nullptr && !create_table->is_view()) && - is_pk_generated) { + (is_pk_generated || thd->m_query_has_vector_column)) { + thd->m_query_has_vector_column = false; + /* Open table to generate CREATE TABLE statement. For non-temporary table we already have exclusive lock here. @@ -10709,7 +10778,9 @@ bool mysql_rename_table(THD *thd, handlerton *base, const char *old_db, to_table_def->set_name(new_name); to_table_def->set_hidden((flags & FN_TO_IS_TMP) ? dd::Abstract_table::HT_HIDDEN_DDL - : dd::Abstract_table::HT_VISIBLE); + : ((flags & VIDX_RENAME) + ? dd::Abstract_table::HT_HIDDEN_HLINDEX + : dd::Abstract_table::HT_VISIBLE)); /* Adjust parent table for self-referencing foreign keys. */ for (dd::Foreign_key *fk : *(to_table_def->foreign_keys())) { @@ -10801,6 +10872,15 @@ bool mysql_rename_table(THD *thd, handlerton *base, const char *old_db, return true; } + /* Rename vidx table if db is changed. the vidx table name is not changed + because the base table id is not changed. */ + if (vidx::dd_table_has_hlindexes(to_table_def) && + my_strcasecmp(table_alias_charset, old_db, new_db) != 0 && + vidx::rename_table(thd, to_table_def, base, new_schema, old_db, new_db, + flags)) { + return true; + } + /* Note that before WL#7743 we have renamed table in the data-dictionary before renaming it in storage engine. However with WL#7743 engines @@ -11979,7 +12059,7 @@ static bool fill_alter_inplace_info(THD *thd, TABLE *table, /* Allocate result buffers. */ if (!(ha_alter_info->index_drop_buffer = - (KEY **)thd->alloc(sizeof(KEY *) * table->s->keys)) || + (KEY **)thd->alloc(sizeof(KEY *) * table->s->total_keys)) || !(ha_alter_info->index_add_buffer = (uint *)thd->alloc(sizeof(uint) * alter_info->key_list.size())) || !(ha_alter_info->index_rename_buffer = (KEY_PAIR *)thd->alloc( @@ -12338,11 +12418,11 @@ static bool fill_alter_inplace_info(THD *thd, TABLE *table, with new table. */ KEY *table_key; - KEY *table_key_end = table->key_info + table->s->keys; + KEY *table_key_end = table->key_info + table->s->total_keys; KEY *new_key; KEY *new_key_end = ha_alter_info->key_info_buffer + ha_alter_info->key_count; - DBUG_PRINT("info", ("index count old: %d new: %d", table->s->keys, + DBUG_PRINT("info", ("index count old: %d new: %d", table->s->total_keys, ha_alter_info->key_count)); /* @@ -12682,7 +12762,7 @@ bool mysql_compare_tables(THD *thd, TABLE *table, Alter_info *alter_info, /* Go through keys and check if they are compatible. */ KEY *table_key; - KEY *table_key_end = table->key_info + table->s->keys; + KEY *table_key_end = table->key_info + table->s->total_keys; KEY *new_key; KEY *new_key_end = key_info_buffer + key_count; @@ -15011,7 +15091,7 @@ bool prepare_fields_and_keys(THD *thd, const dd::Table *src_table, TABLE *table, for which some fields exists. */ - for (uint i = 0; i < table->s->keys; i++, key_info++) { + for (uint i = 0; i < table->s->total_keys; i++, key_info++) { const char *key_name = key_info->name; bool index_column_dropped = false; size_t drop_idx = 0; @@ -15202,7 +15282,11 @@ bool prepare_fields_and_keys(THD *thd, const dd::Table *src_table, TABLE *table, key_type = KEYTYPE_UNIQUE; } else if (key_info->flags & HA_FULLTEXT) key_type = KEYTYPE_FULLTEXT; - else + else if (key_info->flags & HA_VECTOR) { + key_type = KEYTYPE_VECTOR; + key_create_info.vector_m = key_info->vector_m; + key_create_info.vector_distance = key_info->vector_distance; + } else key_type = KEYTYPE_MULTIPLE; /* @@ -16117,7 +16201,7 @@ static bool is_alter_geometry_column_valid(Alter_info *alter_info) { Check if there is a spatial index on this column. If that is the case, reject the change. */ - for (uint i = 0; i < share->keys; ++i) { + for (uint i = 0; i < share->total_keys; ++i) { if (geom_field->key_start.is_set(i) && share->key_info[i].flags & HA_SPATIAL) { my_error(ER_CANNOT_ALTER_SRID_DUE_TO_INDEX, MYF(0), @@ -16197,7 +16281,7 @@ static bool handle_drop_functional_index(THD *thd, Alter_info *alter_info, // the source column as well. for (const Alter_drop *drop : alter_info->drop_list) { if (drop->type == Alter_drop::KEY) { - for (uint j = 0; j < table_list->table->s->keys; j++) { + for (uint j = 0; j < table_list->table->s->total_keys; j++) { const KEY &key_info = table_list->table->s->key_info[j]; if (my_strcasecmp(system_charset_info, key_info.name, drop->name) == 0) { @@ -16251,7 +16335,7 @@ static bool handle_rename_functional_index(THD *thd, Alter_info *alter_info, for (const Alter_rename_key *alter_rename_key : alter_info->alter_rename_key_list) { // Find the matching existing index - for (uint j = 0; j < table_list->table->s->keys; ++j) { + for (uint j = 0; j < table_list->table->s->total_keys; ++j) { const KEY &key = table_list->table->s->key_info[j]; if (my_strcasecmp(system_charset_info, key.name, alter_rename_key->old_name) == 0) { @@ -17434,6 +17518,11 @@ bool mysql_alter_table(THD *thd, const char *new_db, const char *new_name, goto err_new_table_cleanup; } + if (vidx::check_vector_ddl_and_rewrite_sql(thd, alter_info, key_info, + key_count, table)) { + goto err_new_table_cleanup; + } + if (alter_info->requested_algorithm != Alter_info::ALTER_TABLE_ALGORITHM_COPY) { Alter_inplace_info ha_alter_info(create_info, alter_info, @@ -17511,8 +17600,11 @@ bool mysql_alter_table(THD *thd, const char *new_db, const char *new_name, // Ask storage engine whether to use copy or in-place enum_alter_inplace_result inplace_supported = - table->file->check_if_supported_inplace_alter(altered_table, - &ha_alter_info); + ((key_count > 0 && vidx::key_is_vector(key_info + key_count - 1)) || + table->s->hlindexes() > 0) + ? HA_ALTER_INPLACE_NOT_SUPPORTED + : table->file->check_if_supported_inplace_alter(altered_table, + &ha_alter_info); // If INSTANT was requested but it is not supported, report error. if (alter_info->requested_algorithm == @@ -17759,8 +17851,8 @@ bool mysql_alter_table(THD *thd, const char *new_db, const char *new_name, } if (ha_create_table(thd, alter_ctx.get_tmp_path(), alter_ctx.new_db, - alter_ctx.tmp_name, create_info, false, true, - table_def)) + alter_ctx.tmp_name, create_info, false, true, table_def, + key_count == 0 ? nullptr : key_info + key_count - 1)) goto err_new_table_cleanup; /* Mark that we have created table in storage engine. */ diff --git a/sql/sql_table.h b/sql/sql_table.h index 5894f4a9723..d201842eb55 100644 --- a/sql/sql_table.h +++ b/sql/sql_table.h @@ -89,6 +89,9 @@ static const uint NO_FK_RENAME = 1 << 4; /** Don't change generated check constraint names while renaming table. */ static const uint NO_CC_RENAME = 1 << 5; +/** rename aux table of vector index. */ +static const uint VIDX_RENAME = 1 << 6; + handlerton *get_viable_handlerton_for_create(THD *thd, const char *table_name, const HA_CREATE_INFO &ci); diff --git a/sql/sql_tmp_table.cc b/sql/sql_tmp_table.cc index 1a84bf55816..df69e9803ce 100644 --- a/sql/sql_tmp_table.cc +++ b/sql/sql_tmp_table.cc @@ -1253,7 +1253,7 @@ TABLE *create_tmp_table(THD *thd, Temp_table_param *param, if (group) { DBUG_PRINT("info", ("Creating group key in temporary table")); table->group = group; /* Table is grouped by key */ - share->keys = 1; + share->total_keys = share->keys = 1; // Let each group expression know the column which materializes its value for (ORDER *cur_group = group; cur_group; cur_group = cur_group->next) { Field *field = (*cur_group->item)->get_tmp_table_field(); @@ -1321,7 +1321,7 @@ TABLE *create_tmp_table(THD *thd, Temp_table_param *param, in the first 'hidden_null_pack_length' bytes of the row. */ DBUG_PRINT("info", ("hidden_field_count: %d", param->hidden_field_count)); - share->keys = 1; + share->total_keys = share->keys = 1; share->is_distinct = distinct || param->m_operation == Temp_table_param::TTP_INTERSECT || param->m_operation == Temp_table_param::TTP_EXCEPT; @@ -1433,7 +1433,7 @@ TABLE *create_tmp_table(THD *thd, Temp_table_param *param, param->schema_table)) return nullptr; /* purecov: inspected */ - if (table->s->keys == 1 && table->key_info) + if (table->s->total_keys == 1 && table->key_info) table->key_info->algorithm = table->file->get_default_index_algorithm(); table->hidden_field_count = param->hidden_field_count; @@ -1816,7 +1816,7 @@ TABLE *create_duplicate_weedout_tmp_table(THD *thd, uint uniq_tuple_length_arg, KEY *hash_key = keyinfo; KEY_PART_INFO *hash_kpi = key_part_info; - share->keys = 1; + share->total_keys = share->keys = 1; table->key_info = share->key_info = hash_key; hash_key->table = table; hash_key->key_part = hash_kpi; @@ -1825,7 +1825,7 @@ TABLE *create_duplicate_weedout_tmp_table(THD *thd, uint uniq_tuple_length_arg, hash_key->key_length = hash_kpi->store_length; } else { DBUG_PRINT("info", ("Creating group key in temporary table")); - share->keys = 1; + share->total_keys = share->keys = 1; table->key_info = table->s->key_info = keyinfo; keyinfo->key_part = key_part_info; keyinfo->actual_flags = keyinfo->flags = HA_NOSAME; @@ -2326,7 +2326,8 @@ static void trace_tmp_table(Opt_trace_context *trace, const TABLE *table) { trace_tmp.add("in_plan_at_position", tab->idx()); trace_tmp.add("columns", s->fields) .add("row_length", s->reclength) - .add("key_length", table->s->keys > 0 ? table->key_info->key_length : 0) + .add("key_length", + table->s->total_keys > 0 ? table->key_info->key_length : 0) .add("unique_constraint", table->hash_field ? true : false) .add("makes_grouped_rows", table->group != nullptr) .add("cannot_insert_duplicates", s->is_distinct); @@ -2397,7 +2398,7 @@ bool instantiate_tmp_table(THD *thd, TABLE *table) { return true; } - if (share->first_unused_tmp_key < share->keys) { + if (share->first_unused_tmp_key < share->total_keys) { /* Some other clone of this materialized temporary table has defined "possible" keys; as we are here creating the table in the engine, we must @@ -2405,7 +2406,7 @@ bool instantiate_tmp_table(THD *thd, TABLE *table) { now. As the other clone assumes they will be available if the Optimizer chooses them, we make them existing. */ - share->find_first_unused_tmp_key(Key_map(share->keys)); + share->find_first_unused_tmp_key(Key_map(share->total_keys)); } Opt_trace_context *const trace = &thd->opt_trace; diff --git a/sql/sql_truncate.cc b/sql/sql_truncate.cc index 46df886354f..30eb5a9835e 100644 --- a/sql/sql_truncate.cc +++ b/sql/sql_truncate.cc @@ -65,6 +65,7 @@ #include "sql/transaction_info.h" #include "sql_string.h" #include "thr_lock.h" +#include "vidx/vidx_index.h" namespace dd { class Table; @@ -694,6 +695,9 @@ void Sql_cmd_truncate_table::truncate_temporary(THD *thd, // Create a clone of the tdef which can be manipulated by ha_create_table Up_table tdef_clone = Up_table{tdef_holder->clone()}; + + assert(!vidx::dd_table_has_hlindexes(tdef_clone.get())); + m_error = ha_create_table(thd, saved_norm_path.c_str(), table_ref->db, table_ref->table_name, &create_info, true, true, tdef_clone.get()); diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 364e0b016ab..f3f424b16c8 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -2034,7 +2034,7 @@ static void cleanup_tmp_tables(Table_ref *list) { } else { // Clear indexes added during optimization, keep possible unique index TABLE *t = tl->table; - t->s->keys = t->s->is_distinct ? 1 : 0; + t->s->total_keys = t->s->keys = t->s->is_distinct ? 1 : 0; t->s->first_unused_tmp_key = 0; t->keys_in_use_for_query.clear_all(); t->keys_in_use_for_group_by.clear_all(); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 2f12da5b7ca..0542e17220b 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1401,6 +1401,8 @@ void warn_on_deprecated_user_defined_collation( %token URL_SYM 1202 /* MYSQL */ %token GENERATE_SYM 1203 /* MYSQL */ +%token VECTOR_SYM 1215 + /* Precedence rules used to resolve the ambiguity when using keywords as idents in the case e.g.: @@ -1423,6 +1425,10 @@ void warn_on_deprecated_user_defined_collation( /* Toekns for RDS begin from 1300 */ %token REPLICATE_REWRITE_WILD_TABLE 1300 +%token M_SYM 1301 /* MYSQL */ +%token DISTANCE_SYM 1302 /* MYSQL */ +%token EUCLIDEAN_SYM 1303 /* MYSQL */ +%token COSINE_SYM 1304 /* MYSQL */ /* Resolve column attribute ambiguity -- force precedence of "UNIQUE KEY" against @@ -1512,6 +1518,7 @@ void warn_on_deprecated_user_defined_collation( view_check_option signed_num opt_ignore_unknown_user + vector_distance_name %type @@ -1994,10 +2001,11 @@ void warn_on_deprecated_user_defined_collation( %type alter_instance_action -%type key_list key_list_with_expression +%type key_list key_list_with_expression key_part_simple %type opt_index_options index_options opt_fulltext_index_options fulltext_index_options opt_spatial_index_options spatial_index_options + opt_vector_index_options vector_index_options %type opt_index_lock_and_algorithm @@ -2005,6 +2013,7 @@ void warn_on_deprecated_user_defined_collation( spatial_index_option index_type_clause opt_index_type_clause + vector_index_option %type alter_algorithm_option_value alter_algorithm_option @@ -3695,6 +3704,14 @@ create_index_stmt: $11.algo.get_or_default(), $11.lock.get_or_default()); } + | CREATE VECTOR_SYM INDEX_SYM ident ON_SYM table_ident + '(' key_part_simple ')' opt_vector_index_options opt_index_lock_and_algorithm + { + $$= NEW_PTN PT_create_index_stmt(YYMEM_ROOT, KEYTYPE_VECTOR, $4, + NULL, $6, $8, $10, + $11.algo.get_or_default(), + $11.lock.get_or_default()); + } | CREATE SPATIAL_SYM INDEX_SYM ident ON_SYM table_ident '(' key_list_with_expression ')' opt_spatial_index_options opt_index_lock_and_algorithm { @@ -4086,7 +4103,8 @@ sp_fdparam: cs ? cs : thd->variables.collation_database, $3 != nullptr, $2->get_uint_geom_type(), nullptr, nullptr, {}, - dd::Column::enum_hidden_type::HT_VISIBLE)) + dd::Column::enum_hidden_type::HT_VISIBLE, + false, $2->is_vector())) { MYSQL_YYABORT; } @@ -4147,7 +4165,8 @@ sp_pdparam: cs ? cs : thd->variables.collation_database, $4 != nullptr, $3->get_uint_geom_type(), nullptr, nullptr, {}, - dd::Column::enum_hidden_type::HT_VISIBLE)) + dd::Column::enum_hidden_type::HT_VISIBLE, + false, $3->is_vector())) { MYSQL_YYABORT; } @@ -4277,7 +4296,8 @@ sp_decl: cs ? cs : thd->variables.collation_database, $4 != nullptr, $3->get_uint_geom_type(), nullptr, nullptr, {}, - dd::Column::enum_hidden_type::HT_VISIBLE)) + dd::Column::enum_hidden_type::HT_VISIBLE, + false, $3->is_vector())) { MYSQL_YYABORT; } @@ -7024,6 +7044,11 @@ table_constraint_def: $$= NEW_PTN PT_inline_index_definition(KEYTYPE_FULLTEXT, $3, NULL, $5, $7); } + | VECTOR_SYM opt_key_or_index opt_ident '(' key_part_simple ')' + opt_vector_index_options + { + $$= NEW_PTN PT_inline_index_definition(KEYTYPE_VECTOR, $3, NULL, $5, $7); + } | SPATIAL_SYM opt_key_or_index opt_ident '(' key_list_with_expression ')' opt_spatial_index_options { @@ -7197,6 +7222,10 @@ type: { $$= NEW_PTN PT_char_type(Char_type::VARCHAR, $2, &my_charset_bin); } + | VECTOR_SYM field_length opt_vector_field_options + { + $$= NEW_PTN PT_vector_type(YYTHD, $2); + } | YEAR_SYM opt_field_length field_options { if ($2) @@ -7955,6 +7984,40 @@ fulltext_index_option: $$= NEW_PTN PT_fulltext_index_parser_name(to_lex_cstring($3)); } ; +opt_vector_field_options: + %empty + | VARBINARY_SYM field_length + ; + +opt_vector_index_options: + %empty { $$.init(YYMEM_ROOT); } + | vector_index_options + ; + +vector_index_options: + vector_index_option + { + $$.init(YYMEM_ROOT); + if ($$.push_back($1)) + MYSQL_YYABORT; // OOM + } + | vector_index_options vector_index_option + { + if ($1.push_back($2)) + MYSQL_YYABORT; // OOM + $$= $1; + } + ; + +vector_index_option: + common_index_option + | M_SYM opt_equal ulong_num { $$= NEW_PTN PT_index_vector_m($3); } + | DISTANCE_SYM opt_equal vector_distance_name { $$= NEW_PTN PT_index_vector_distance($3); } + ; + +vector_distance_name: + EUCLIDEAN_SYM { $$= 0; } + | COSINE_SYM { $$= 1; } opt_spatial_index_options: %empty { $$.init(YYMEM_ROOT); } @@ -8107,6 +8170,15 @@ key_part: } ; +key_part_simple: + ident + { + $$= NEW_PTN List; + if ($$ == NULL || $$->push_back(NEW_PTN PT_key_part_specification(to_lex_cstring($1), ORDER_NOT_RELEVANT, 0))) + MYSQL_YYABORT; + } + ; + key_list_with_expression: key_list_with_expression ',' key_part_with_expression { @@ -15626,6 +15698,10 @@ ident_keywords_unambiguous: | SECONDARY_UNLOAD_SYM | SECOND_SYM | SECURITY_SYM + | M_SYM + | DISTANCE_SYM + | EUCLIDEAN_SYM + | COSINE_SYM | SERIALIZABLE_SYM | SERIAL_SYM | SERVER_SYM @@ -17840,7 +17916,8 @@ sf_tail: cs ? cs : YYTHD->variables.collation_database, $11 != nullptr, $10->get_uint_geom_type(), nullptr, nullptr, {}, - dd::Column::enum_hidden_type::HT_VISIBLE)) + dd::Column::enum_hidden_type::HT_VISIBLE, + false, $10->is_vector())) { MYSQL_YYABORT; } diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 716b0452698..71e80ee851e 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -139,6 +139,7 @@ #include "sql/xa.h" #include "template_utils.h" // pointer_cast #include "thr_lock.h" +#include "vidx/vidx_common.h" #ifdef _WIN32 #include "sql/named_pipe.h" #endif diff --git a/sql/sys_vars_ext.cc b/sql/sys_vars_ext.cc index 023717db757..25f201c11e7 100644 --- a/sql/sys_vars_ext.cc +++ b/sql/sys_vars_ext.cc @@ -24,12 +24,13 @@ this program; if not, write to the Free Software Foundation, Inc., *****************************************************************************/ -#include "sql/sys_vars.h" #include "sql/duckdb/duckdb_config.h" +#include "sql/duckdb/log.h" #include "sql/rpl_applier_reader.h" #include "sql/rpl_rli.h" -#include "sql/duckdb/log.h" #include "sql/sql_table_ext.h" +#include "sql/sys_vars.h" +#include "vidx/vidx_index.h" /** DuckDB related variables begin. */ static Sys_var_bool Sys_duckdb_require_primary_key( diff --git a/sql/system_variables.h b/sql/system_variables.h index a91d161284a..7aceee19f6b 100644 --- a/sql/system_variables.h +++ b/sql/system_variables.h @@ -34,6 +34,7 @@ #include "my_thread_local.h" // my_thread_id #include "sql/rpl_gtid.h" // Gitd_specification #include "sql/sql_plugin_ref.h" // plugin_ref +#include "vidx/vidx_common.h" class MY_LOCALE; class Time_zone; diff --git a/sql/table.cc b/sql/table.cc index 33ae7d9d05c..d616dd6e2aa 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -79,7 +79,8 @@ #include "sql/dd/types/view.h" // dd::View #include "sql/debug_sync.h" // DEBUG_SYNC #include "sql/derror.h" // ER_THD -#include "sql/error_handler.h" // Strict_error_handler +#include "sql/duckdb/duckdb_config.h" +#include "sql/error_handler.h" // Strict_error_handler #include "sql/field.h" #include "sql/filesort.h" // filesort_free_buffers #include "sql/gis/srid.h" @@ -124,7 +125,7 @@ #include "sql_string.h" #include "template_utils.h" // down_cast #include "thr_mutex.h" -#include "sql/duckdb/duckdb_config.h" +#include "vidx/vidx_hnsw.h" /* INFORMATION_SCHEMA name */ LEX_CSTRING INFORMATION_SCHEMA_NAME = {STRING_WITH_LEN("information_schema")}; @@ -432,6 +433,8 @@ TABLE_SHARE *alloc_table_share(const char *db, const char *table_name, share->mem_root = std::move(mem_root); mysql_mutex_init(key_TABLE_SHARE_LOCK_ha_data, &share->LOCK_ha_data, MY_MUTEX_INIT_FAST); + mysql_mutex_init(key_TABLE_SHARE_LOCK_share, &share->LOCK_share, + MY_MUTEX_INIT_FAST); } return share; } @@ -547,8 +550,16 @@ void TABLE_SHARE::destroy() { ::destroy(m_part_info); m_part_info = nullptr; } + if (hlindex) { + vidx::hnsw::mhnsw_free(this); + hlindex->destroy(); + hlindex = nullptr; + } /* The mutex is initialized only for shares that are part of the TDC */ - if (tmp_table == NO_TMP_TABLE) mysql_mutex_destroy(&LOCK_ha_data); + if (tmp_table == NO_TMP_TABLE) { + mysql_mutex_destroy(&LOCK_ha_data); + mysql_mutex_destroy(&LOCK_share); + } delete m_histograms; m_histograms = nullptr; @@ -738,8 +749,9 @@ void setup_key_part_field(TABLE_SHARE *share, handler *handler_file, if (key_part_n == 0) field->key_start.set_bit(key_n); field->m_indexed = true; - const bool full_length_key_part = - field->key_length() == key_part->length && !field->is_flag_set(BLOB_FLAG); + const bool full_length_key_part = field->key_length() == key_part->length && + !field->is_flag_set(BLOB_FLAG) && + key_n < share->keys; const bool is_spatial_key = Overlaps(keyinfo->flags, HA_SPATIAL); /* part_of_key contains all non-prefix keys, part_of_prefixkey @@ -758,7 +770,7 @@ void setup_key_part_field(TABLE_SHARE *share, handler *handler_file, // R-tree indexes do not allow index scans and therefore cannot be // marked as keys for index only access. if ((handler_file->index_flags(key_n, key_part_n, false) & HA_KEYREAD_ONLY) && - !is_spatial_key) { + !is_spatial_key && key_n < share->keys) { // Set the key as 'keys_for_keyread' even if it is prefix key. share->keys_for_keyread.set_bit(key_n); } @@ -1353,7 +1365,8 @@ static int make_field_from_frm(THD *thd, TABLE_SHARE *share, f_is_zerofill(pack_flag) != 0, f_is_dec(pack_flag) == 0, f_decimals(pack_flag), f_bit_as_char(pack_flag), 0, {}, // Array fields aren't supported in .frm-based tables - false); + // Vector fields aren't supported in .frm-based tables + false, false); if (!reg_field) { // Not supported field type return 4; @@ -1475,6 +1488,7 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, DBUG_PRINT("info", ("default_part_db_type = %u", head[61])); legacy_db_type = (enum legacy_db_type)(uint) * (head + 3); assert(share->db_plugin == nullptr); + assert(share->keys == share->total_keys); /* if the storage engine is dynamic, no point in resolving it by its dynamically allocated legacy_db_type. We will resolve it later by name. @@ -1518,10 +1532,11 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, if (read_string(file, &disk_buff, key_info_length)) goto err; /* purecov: inspected */ if (disk_buff[0] & 0x80) { - share->keys = keys = (disk_buff[1] << 7) | (disk_buff[0] & 0x7f); + share->total_keys = share->keys = keys = + (disk_buff[1] << 7) | (disk_buff[0] & 0x7f); share->key_parts = key_parts = uint2korr(disk_buff + 2); } else { - share->keys = keys = disk_buff[0]; + share->total_keys = share->keys = keys = disk_buff[0]; share->key_parts = key_parts = disk_buff[1]; } share->visible_indexes.init(0); @@ -1896,13 +1911,13 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, DBUG_PRINT("info", ("i_count: %d i_parts: %d index: %d n_length: %d " "int_length: %d com_length: %d gcol_screen_length: %d", - interval_count, interval_parts, share->keys, n_length, - int_length, com_length, gcol_screen_length)); - if (!(field_ptr = (Field **)share->mem_root.Alloc(( - uint)((share->fields + 1) * sizeof(Field *) + - interval_count * sizeof(TYPELIB) + - (share->fields + interval_parts + keys + 3) * sizeof(char *) + - (n_length + int_length + com_length + gcol_screen_length))))) + interval_count, interval_parts, share->total_keys, + n_length, int_length, com_length, gcol_screen_length)); + if (!(field_ptr = (Field **)share->mem_root.Alloc((uint)( + (share->fields + 1) * sizeof(Field *) + + interval_count * sizeof(TYPELIB) + + (share->fields + interval_parts + keys + 3) * sizeof(char *) + + (n_length + int_length + com_length + gcol_screen_length))))) goto err; /* purecov: inspected */ share->field = field_ptr; @@ -2051,7 +2066,7 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, keyinfo = share->key_info; key_part = keyinfo->key_part; - for (uint key = 0; key < share->keys; key++, keyinfo++) { + for (uint key = 0; key < share->total_keys; key++, keyinfo++) { uint usable_parts = 0; keyinfo->name = share->keynames.type_names[key]; /* Fix fulltext keys for old .frm files */ @@ -2227,7 +2242,7 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, if (share->found_next_number_field) { Field *reg_field = *share->found_next_number_field; if ((int)(share->next_number_index = (uint)find_ref_key( - share->key_info, share->keys, share->default_values, + share->key_info, share->total_keys, share->default_values, reg_field, &share->next_number_key_offset, &share->next_number_keypart)) < 0) { /* Wrong field definition */ @@ -2801,22 +2816,22 @@ bool create_key_part_field_with_prefix_length(TABLE *table, MEM_ROOT *root) { assert(share->key_parts); - n_length = - share->keys * sizeof(KEY) + share->key_parts * sizeof(KEY_PART_INFO); + n_length = share->total_keys * sizeof(KEY) + + share->key_parts * sizeof(KEY_PART_INFO); // Allocate new memory for table.key_info if (!(key_info = static_cast(root->Alloc(n_length)))) return true; table->key_info = key_info; - key_part = (reinterpret_cast(key_info + share->keys)); + key_part = (reinterpret_cast(key_info + share->total_keys)); // Copy over the key_info from share to table. - memcpy(key_info, share->key_info, sizeof(*key_info) * share->keys); + memcpy(key_info, share->key_info, sizeof(*key_info) * share->total_keys); memcpy(key_part, share->key_info[0].key_part, (sizeof(*key_part) * share->key_parts)); - for (KEY *key_info_end = key_info + share->keys; key_info < key_info_end; - key_info++) { + for (KEY *key_info_end = key_info + share->total_keys; + key_info < key_info_end; key_info++) { key_info->table = table; key_info->key_part = key_part; @@ -3009,8 +3024,8 @@ int open_table_from_share(THD *thd, TABLE_SHARE *share, const char *alias, if (share->key_parts) { if (create_key_part_field_with_prefix_length(outparam, root)) goto err; KEY *key_info = outparam->key_info; - for (KEY *key_info_end = key_info + share->keys; key_info < key_info_end; - key_info++) { + for (KEY *key_info_end = key_info + share->total_keys; + key_info < key_info_end; key_info++) { /* Set TABLE::fts_doc_id_field for tables with FT KEY */ if ((key_info->flags & HA_FULLTEXT)) outparam->fts_doc_id_field = fts_doc_id_field; @@ -3365,7 +3380,9 @@ int closefrm(TABLE *table, bool free_share) { table->part_info = nullptr; } if (free_share) { - if (table->s->tmp_table == NO_TMP_TABLE) + if (table->s->is_hlindex) { + table->s->decrement_ref_count(); + } else if (table->s->tmp_table == NO_TMP_TABLE) release_table_share(table->s); else free_table_share(table->s); @@ -4280,7 +4297,7 @@ bool TABLE::init_tmp_table(THD *thd, TABLE_SHARE *share, MEM_ROOT *m_root, share->visible_indexes.init(); share->keys_for_keyread.init(); share->keys_in_use.init(); - share->keys = 0; + share->total_keys = share->keys = 0; share->field = field = fld; share->table_charset = charset; set_not_started(); @@ -5998,6 +6015,7 @@ bool TABLE::add_tmp_key(Field_map *key_parts, bool invisible, assert(s->keys < s->max_tmp_keys); sprintf(s->key_names[s->keys].name, "", s->keys); s->keys++; + s->total_keys++; } const uint keyno = s->keys - 1; @@ -6151,7 +6169,7 @@ void TABLE::move_tmp_key(int old_idx, bool modify_share) { void TABLE::drop_unused_tmp_keys(bool modify_share) { if (modify_share) { assert(s->first_unused_tmp_key <= s->keys); - s->keys = s->first_unused_tmp_key; + s->total_keys = s->keys = s->first_unused_tmp_key; s->key_parts = 0; for (uint i = 0; i < s->keys; i++) s->key_parts += s->key_info[i].user_defined_key_parts; @@ -7973,6 +7991,8 @@ int create_table_share_for_upgrade(THD *thd, const char *path, share->tmp_table = NO_TMP_TABLE; mysql_mutex_init(key_TABLE_SHARE_LOCK_ha_data, &share->LOCK_ha_data, MY_MUTEX_INIT_FAST); + mysql_mutex_init(key_TABLE_SHARE_LOCK_share, &share->LOCK_share, + MY_MUTEX_INIT_FAST); int r = read_frm_file(thd, share, frm_context, table_name, is_fix_view_cols_and_deps); @@ -8016,7 +8036,7 @@ bool TABLE::empty_result_table() { void TABLE::update_covering_prefix_keys(Field *field, uint16 key_read_length, Key_map *covering_prefix_keys) { - for (uint keyno = 0; keyno < s->keys; keyno++) + for (uint keyno = 0; keyno < s->total_keys; keyno++) if (covering_prefix_keys->is_set(keyno)) { KEY *key_info = &this->key_info[keyno]; for (KEY_PART_INFO *part = key_info->key_part, diff --git a/sql/table.h b/sql/table.h index 5034da1538d..405bb0d9ac1 100644 --- a/sql/table.h +++ b/sql/table.h @@ -45,7 +45,8 @@ #include "my_table_map.h" #include "mysql/components/services/bits/mysql_mutex_bits.h" #include "mysql/components/services/bits/psi_table_bits.h" -#include "sql/auth/auth_acls.h" // Access_bitmask +#include "sql/auth/auth_acls.h" // Access_bitmask +#include "sql/dd/object_id.h" #include "sql/dd/types/foreign_key.h" // dd::Foreign_key::enum_rule #include "sql/enum_query_type.h" // enum_query_type #include "sql/key.h" @@ -1045,6 +1046,38 @@ struct TABLE_SHARE { enum class Schema_read_only { NOT_SET, RO_OFF, RO_ON }; Schema_read_only schema_read_only{Schema_read_only::NOT_SET}; + bool is_hlindex{false}; + /* for hlindex tables */ + void *hlindex_data{nullptr}; + /* for normal tables */ + TABLE_SHARE *hlindex{nullptr}; + /* Number of keys including vector keys. */ + uint total_keys{0}; + + mysql_mutex_t LOCK_share; /* MariaDB use it to protect TABLE_SHARE. RDS only + protect hlindex and hlindex_data */ + + dd::Object_id m_se_private_id{dd::INVALID_OBJECT_ID}; + + inline void lock_share() { + if (!tmp_table) mysql_mutex_lock(&LOCK_share); + } + + inline void unlock_share() { + if (!tmp_table) mysql_mutex_unlock(&LOCK_share); + } + + inline uint hlindexes() { + assert(total_keys >= keys); + /* The total_keys is not expected as less than keys. This abnormal + situation returns 0 for stability。 */ + return total_keys >= keys ? total_keys - keys : 0; + } + + inline KEY *get_vec_key() { + return hlindexes() ? (key_info + keys) : nullptr; + } + /** Set share's table cache key and update its db and table name appropriately. @@ -1954,7 +1987,7 @@ struct TABLE { column */ inline bool index_contains_some_virtual_gcol(uint index_no) const { - assert(index_no < s->keys); + assert(index_no < s->total_keys); return key_info[index_no].flags & HA_VIRTUAL_GEN_KEY; } void update_const_key_parts(Item *conds); @@ -2414,6 +2447,22 @@ struct TABLE { set or not */ bool should_binlog_drop_if_temp(void) const; + + TABLE *hlindex{nullptr}; /* Vector key table */ + void *context; /* only for hlindexes */ + + int hlindex_open(uint nr); + int hlindex_lock(uint nr); + int reset_hlindexes(); + + int hlindexes_on_insert(); + int hlindexes_on_update(); + int hlindexes_on_delete(const uchar *buf); + int hlindexes_on_delete_all(); + + int hlindex_read_first(uint key, void *item); + int hlindex_read_next(); + int hlindex_read_end(); }; static inline void empty_record(TABLE *table) { diff --git a/sql/table_cache.h b/sql/table_cache.h index 2287a078ae7..dfd23e5dae3 100644 --- a/sql/table_cache.h +++ b/sql/table_cache.h @@ -459,6 +459,7 @@ TABLE *Table_cache::get_table(THD *thd, const char *key, size_t key_length, if ((table = el->free_tables.front())) { assert(!table->in_use); + assert(table->hlindex == nullptr); /* Unlink table from list of unused TABLE objects for this @@ -494,6 +495,14 @@ TABLE *Table_cache::get_table(THD *thd, const char *key, size_t key_length, */ void Table_cache::release_table(THD *thd, TABLE *table) { + if (table->hlindex != nullptr) { + mysql_mutex_lock(&LOCK_open); + intern_close_table(table->hlindex); + mysql_mutex_unlock(&LOCK_open); + + table->hlindex = nullptr; + } + Table_cache_element *el = table->s->cache_element[table_cache_manager.cache_index(this)]; diff --git a/sql/vidx/vidx_field.cc b/sql/vidx/vidx_field.cc new file mode 100644 index 00000000000..5a0d064ae92 --- /dev/null +++ b/sql/vidx/vidx_field.cc @@ -0,0 +1,146 @@ +/* Copyright (c) 2025, 2025, Alibaba and/or its affiliates. All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License, version 2.0, + as published by the Free Software Foundation. + + This program is also distributed with certain software (including + but not limited to OpenSSL) that is licensed under separate terms, + as designated in a particular file or component or in included license + documentation. The authors of MySQL hereby grant you an additional + permission to link the program and your derivative works with the + separately licensed software that they have included with MySQL. + + 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, version 2.0, for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "sql/create_field.h" // Create_field +#include "sql/current_thd.h" // vidx/vidx_index.h +#include "sql/derror.h" // ER_THD +#include "sql/my_decimal.h" // my_decimal +#include "sql/sql_class.h" // THD + +#include "vidx/vidx_field.h" + +namespace vidx { +uint32 Field_vector::get_dimensions() const { + return get_dimensions_low(field_length, VECTOR_PRECISION); +} + +type_conversion_status Field_vector::store(double) { + my_error(ER_DATA_INCOMPATIBLE_WITH_VECTOR, MYF(0), "double", sizeof(double), + get_dimensions()); + return TYPE_ERR_BAD_VALUE; +} + +type_conversion_status Field_vector::store(longlong, bool) { + my_error(ER_DATA_INCOMPATIBLE_WITH_VECTOR, MYF(0), "longlong", + sizeof(longlong), get_dimensions()); + return TYPE_ERR_BAD_VALUE; +} + +type_conversion_status Field_vector::store_decimal(const my_decimal *) { + my_error(ER_DATA_INCOMPATIBLE_WITH_VECTOR, MYF(0), "decimal", + sizeof(my_decimal), get_dimensions()); + return TYPE_ERR_BAD_VALUE; +} + +type_conversion_status Field_vector::store(const char *from, size_t length, + const CHARSET_INFO *cs) { + if (cs != &my_charset_bin) { + THD *thd = current_thd; + ErrConvString err(from, length, cs); + push_warning_printf( + thd, Sql_condition::SL_WARNING, ER_TRUNCATED_WRONG_VALUE_FOR_FIELD, + ER_THD(thd, ER_TRUNCATED_WRONG_VALUE_FOR_FIELD), "vector", err.ptr(), + field_name, thd->get_stmt_da()->current_row_for_condition()); + } + + if (length != field_length) { + /* Validate length should be the same as the field length. */ + wrong_length_return: + my_error(ER_DATA_INCOMPATIBLE_WITH_VECTOR, MYF(0), "string", length, + get_dimensions()); + return TYPE_ERR_BAD_VALUE; + } + + uint32 dimensions = get_dimensions_low(length, VECTOR_PRECISION); + if (dimensions == UINT_MAX32 || dimensions > get_dimensions()) { + goto wrong_length_return; + } + + /* Validate every dimension and abs value of the vector. */ + float abs2 = 0.0f; + for (uint32 i = 0; i < dimensions; i++) { + float to_store = 0; + memcpy(&to_store, from + sizeof(float) * i, sizeof(float)); + if (std::isnan(to_store) || std::isinf(to_store)) { + goto wrong_data_return; + } + float val = get_float(from + sizeof(float) * i); + abs2 += val * val; + } + + if (!std::isfinite(abs2)) { + wrong_data_return: + THD *thd = current_thd; + ErrConvString err(from, length, cs); + my_error(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD, MYF(0), "vector", err.ptr(), + field_name, thd->get_stmt_da()->current_row_for_condition()); + return TYPE_ERR_BAD_VALUE; + } + +#ifdef WORDS_BIGENDIAN + if (value.alloc(length)) { + reset(); + return TYPE_ERR_OOM; + } + for (uint32 i = 0; i < dimensions; i++) { + float to_store = 0; + memcpy(&to_store, from + sizeof(float) * i, sizeof(float)); + float4store(value.ptr() + i * sizeof(float), to_store); + } + from = value.ptr(); +#endif + + return Field_varstring::store(from, length, cs); +} + +uint Field_vector::is_equal(const Create_field *new_field) const { + if (new_field->sql_type != type() || + new_field->max_display_width_in_codepoints() != field_length || + new_field->charset != field_charset) { + return IS_EQUAL_NO; + } + return IS_EQUAL_YES; +} + +String *Field_vector::val_str(String *, String *val_ptr) const { + ASSERT_COLUMN_MARKED_FOR_READ; + + const char *data = pointer_cast(data_ptr()); + if (data == nullptr) { + val_ptr->set("", 0, charset()); // A bit safer than ->length(0) + } else { + uint32 length = data_length(); +#ifdef WORDS_BIGENDIAN + val_ptr->alloc(length); + uint32 dimensions = get_dimensions_low(length, VECTOR_PRECISION); + float *to_store = (float *)(val_ptr->ptr()); + for (uint32 i = 0; i < dimensions; i++) { + to_store[i] = float4get((const uchar *)(data + i * sizeof(float))); + } + val_ptr->length(length); +#else + val_ptr->set(data, length, charset()); +#endif + } + return val_ptr; +} +} // namespace vidx diff --git a/sql/vidx/vidx_func.cc b/sql/vidx/vidx_func.cc new file mode 100644 index 00000000000..9172d7fd3a3 --- /dev/null +++ b/sql/vidx/vidx_func.cc @@ -0,0 +1,358 @@ +/* Copyright (c) 2025, 2025, Alibaba and/or its affiliates. All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License, version 2.0, + as published by the Free Software Foundation. + + This program is also distributed with certain software (including + but not limited to OpenSSL) that is licensed under separate terms, + as designated in a particular file or component or in included license + documentation. The authors of MySQL hereby grant you an additional + permission to link the program and your derivative works with the + separately licensed software that they have included with MySQL. + + 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, version 2.0, for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include // std::isinf, std::isnan + +#include "my_byteorder.h" // get_float +#include "sql/sql_const.h" // MAX_FLOAT_STR_LENGTH +#include "sql_string.h" // String + +#include "sql/item_func.h" +#include "sql/item_strfunc.h" +#include "vidx/vidx_field.h" + +namespace vidx { +static double calc_distance_euclidean(float *v1, float *v2, size_t v_len) { + double d = 0; + for (size_t i = 0; i < v_len; i++, v1++, v2++) { + double dist = get_float(v1) - get_float(v2); + d += dist * dist; + } + return sqrt(d); +} + +static double calc_distance_cosine(float *v1, float *v2, size_t v_len) { + double dotp = 0, abs1 = 0, abs2 = 0; + for (size_t i = 0; i < v_len; i++, v1++, v2++) { + float f1 = get_float(v1), f2 = get_float(v2); + abs1 += f1 * f1; + abs2 += f2 * f2; + dotp += f1 * f2; + } + return 1 - dotp / sqrt(abs1 * abs2); +} + +static distance_kind mhnsw_uses_distance(KEY *keyinfo) { + if (keyinfo->vector_distance == (uint)EUCLIDEAN) return EUCLIDEAN; + return COSINE; +} + +static inline bool from_string_to_vector(const char *input, uint32_t input_len, + char *const output, + uint32_t *max_output_dims) { + if (input == nullptr || input_len == 0 || input[0] != '[' || + input[input_len - 1] != ']') { + *max_output_dims = 0; + return true; + } + + // Check for memory region overlap + size_t output_len = sizeof(float) * (*max_output_dims); + String temp_output(output, output_len, nullptr); + if (output + output_len >= input && input + input_len >= output) { + temp_output = String(output_len); + } + + const char *const input_end = input + input_len - 1; + input = input + 1; + uint32_t dim = 0; + char *end = nullptr; + bool with_success = false; + errno = 0; + for (float fnum = strtof(input, &end); input != end; + fnum = strtof(input, &end)) { + input = end; + if (errno == ERANGE || dim >= *max_output_dims || std::isnan(fnum) || + std::isinf(fnum)) { + errno = 0; + break; + } + memcpy(temp_output.ptr() + dim * sizeof(float), &fnum, sizeof(float)); + + if (*input == ',') { + input = input + 1; + dim++; + } else if (*input == ']' && input == input_end) { + with_success = true; + dim++; + break; + } else { + break; + } + } + + if (temp_output.ptr() != output) { + memcpy(output, temp_output.ptr(), dim * sizeof(float)); + } + + *max_output_dims = dim; + return !with_success; +} + +static inline bool from_vector_to_string(String *input, const uint32 precision, + CHARSET_INFO *cs, String *output) { + assert(input != nullptr && input->ptr() != nullptr); + assert(output != nullptr); + + const uint32 input_dims = get_dimensions_low(input->length(), precision); + + if (input_dims == UINT_MAX32) { + return true; + } + + output->length(0); + output->set_charset(cs); + output->reserve(input_dims * (MAX_FLOAT_STR_LENGTH + 1) + 2); + + if (input_dims == 0) { + return false; + } + + float val; + size_t len; + char buf[MAX_FLOAT_STR_LENGTH + 1]; + auto ptr = (const uchar *)input->ptr(); + + output->append('['); + + for (size_t i = 0; i < input_dims; i++) { + if (i != 0) { + output->append(','); + } + + val = float4get(ptr); + if (std::isinf(val)) + if (val < 0) + output->append(STRING_WITH_LEN("-Inf")); + else + output->append(STRING_WITH_LEN("Inf")); + else if (std::isnan(val)) + output->append(STRING_WITH_LEN("NaN")); + else { + len = my_gcvt(val, MY_GCVT_ARG_FLOAT, MAX_FLOAT_STR_LENGTH, buf, 0); + output->append(buf, len); + } + + ptr += precision; + } + + output->append(']'); + + return false; +} + +bool Item_func_vec_distance::resolve_type(THD *thd) { + switch (kind) { + case EUCLIDEAN: { + calc_distance_func = calc_distance_euclidean; + break; + } + case COSINE: { + calc_distance_func = calc_distance_cosine; + break; + } + case AUTO: { + for (uint fno = 0; fno < 2; fno++) { + if (args[fno]->type() == Item::FIELD_ITEM) { + Field *f = ((Item_field *)args[fno])->field; + KEY *key_info = f->table->s->key_info; + for (uint i = f->table->s->keys; i < f->table->s->total_keys; i++) { + assert(key_info[i].flags & HA_VECTOR); + assert(key_info[i].user_defined_key_parts == 1); + if (f->key_start.is_set(i)) { + kind = mhnsw_uses_distance(key_info + i); + return resolve_type(thd); + } + } + } + } + } + [[fallthrough]]; + default: + my_error(ER_VEC_DISTANCE_TYPE, MYF(0)); + return true; + } + + return Item_real_func::resolve_type(thd); +} + +int Item_func_vec_distance::get_key() { + if (check_args()) { + Field *f = field_arg->field; + String tmp; + String *r = const_arg->val_str(&tmp); + + if (!r || r->length() != f->field_length || r->length() % sizeof(float)) { + my_error(ER_WRONG_ARGUMENTS, MYF(0), func_name()); + return -1; + } + + KEY *keyinfo = f->table->s->key_info; + for (uint i = f->table->s->keys; i < f->table->s->total_keys; i++) { + assert(keyinfo[i].flags & HA_VECTOR); + assert(keyinfo[i].user_defined_key_parts == 1); + + if (f->key_start.is_set(i) && kind == mhnsw_uses_distance(keyinfo + i)) { + return i; + } + } + } + + return -1; +} + +double Item_func_vec_distance::val_real() { + String tmp1, tmp2; + String *r1 = args[0]->val_str(&tmp1); + String *r2 = args[1]->val_str(&tmp2); + + /* If the dimensions of two vectors are not equal, result should be NULL. */ + if (!r1 || !r2 || r1->length() != r2->length() || + r1->length() % sizeof(float)) { + null_value = true; + return 0; + } + + null_value = false; + + float *v1 = (float *)r1->ptr(); + float *v2 = (float *)r2->ptr(); + + return calc_distance_func(v1, v2, (r1->length()) / sizeof(float)); +} + +bool Item_func_vec_distance::check_args() { + assert((field_arg == nullptr) == (const_arg == nullptr)); + + if (field_arg != nullptr) { + return true; + } + + /* MDEV-35922 Server crashes in mhnsw_read_first upon using vector key with + * views */ + if (args[0]->real_item()->type() == Item::FIELD_ITEM && + args[1]->const_for_execution()) { + field_arg = (Item_field *)(args[0]->real_item()); + const_arg = args[1]; + return true; + } + + if (args[1]->real_item()->type() == Item::FIELD_ITEM && + args[0]->const_for_execution()) { + field_arg = (Item_field *)(args[1]->real_item()); + const_arg = args[0]; + return true; + } + + return false; +} + +bool Item_func_vec_fromtext::resolve_type(THD *thd) { + if (Item_str_func::resolve_type(thd)) { + return true; + } + if (args[0]->result_type() != STRING_RESULT || + args[0]->data_type() == MYSQL_TYPE_JSON) { + my_error(ER_WRONG_ARGUMENTS, MYF(0), func_name()); + return true; + } + if (reject_geometry_args(arg_count, args, this)) return true; + set_data_type_vector( + static_cast(Field_vector::dimension_bytes(MAX_DIMENSIONS))); + return false; +} + +String *Item_func_vec_fromtext::val_str(String *str) { + assert(fixed); + null_value = false; + String *res = args[0]->val_str(str); + if (res == nullptr || res->ptr() == nullptr) { + return error_str(); + } + + uint32 output_dims = MAX_DIMENSIONS; + auto dimension_bytes = Field_vector::dimension_bytes(output_dims); + if (buffer.mem_realloc(dimension_bytes)) return error_str(); + + bool err = from_string_to_vector(res->ptr(), res->length(), buffer.ptr(), + &output_dims); + if (err) { + if (output_dims == MAX_DIMENSIONS) { + res->replace(32, 5, "... \0", 5); + my_error(ER_DATA_OUT_OF_RANGE, MYF(0), res->ptr(), func_name()); + } else { + my_error(ER_TO_VECTOR_CONVERSION, MYF(0), res->length(), res->ptr()); + } + return error_str(); + } + + buffer.length(Field_vector::dimension_bytes(output_dims)); + return &buffer; +} + +bool Item_func_vec_totext::resolve_type(THD *thd) { + if (param_type_is_default(thd, 0, 1, MYSQL_TYPE_VARCHAR)) { + return true; + } + bool valid_type = (args[0]->data_type() == MYSQL_TYPE_VARCHAR) || + (args[0]->result_type() == STRING_RESULT && + args[0]->collation.collation == &my_charset_bin); + if (!valid_type) { + my_error(ER_WRONG_ARGUMENTS, MYF(0), func_name()); + return true; + } + set_data_type_string(Item_func_vec_totext::max_output_bytes); + return false; +} + +String *Item_func_vec_totext::val_str(String *str) { + assert(fixed); + String *res = args[0]->val_str(str); + null_value = false; + if (res == nullptr || res->ptr() == nullptr) { + return error_str(); + } + + if (from_vector_to_string(res, VECTOR_PRECISION, &my_charset_numeric, + &buffer)) { + my_error(ER_VECTOR_BINARY_FORMAT_INVALID, MYF(0)); + return error_str(); + } + + return &buffer; +} + +longlong Item_func_vector_dim::val_int() { + assert(fixed); + String *res = args[0]->val_str(&value); + null_value = false; + if (res == nullptr || res->ptr() == nullptr) { + return error_int(); /* purecov: inspected */ + } + uint32 dimensions = get_dimensions_low(res->length(), VECTOR_PRECISION); + if (dimensions == UINT_MAX32) { + my_error(ER_TO_VECTOR_CONVERSION, MYF(0), res->length(), res->ptr()); + return error_int(); /* purecov: inspected */ + } + return (longlong)dimensions; +} +} // namespace vidx diff --git a/sql/vidx/vidx_hnsw.cc b/sql/vidx/vidx_hnsw.cc new file mode 100644 index 00000000000..00a751370de --- /dev/null +++ b/sql/vidx/vidx_hnsw.cc @@ -0,0 +1,1551 @@ +/* Copyright (c) 2025, 2025, Alibaba and/or its affiliates. All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License, version 2.0, + as published by the Free Software Foundation. + + This program is also distributed with certain software (including + but not limited to OpenSSL) that is licensed under separate terms, + as designated in a particular file or component or in included license + documentation. The authors of MySQL hereby grant you an additional + permission to link the program and your derivative works with the + separately licensed software that they have included with MySQL. + + 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, version 2.0, for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "m_ctype.h" // my_hash_sort_bin +#include "my_byteorder.h" // get_float +#include "my_inttypes.h" // uintxx_t +#include "mysql/plugin.h" // THDVAR +#include "scope_guard.h" // Scope_guard +#include "sql/dd/cache/dictionary_client.h" // dd::cache::Dictionary_client +#include "sql/dd/properties.h" // dd::Properties +#include "sql/dd/string_type.h" // dd::String_type +#include "sql/dd/types/index.h" // dd::Index +#include "sql/dd/types/index_element.h" // dd::Index_element +#include "sql/dd/types/schema.h" // dd::Schema +#include "sql/dd/types/table.h" // dd::Table +#include "sql/field.h" // Field +#include "sql/item_strfunc.h" // vidx::Item_func_vec_distance +#include "sql/key.h" // KEY +#include "sql/psi_memory_key.h" // key_memory_vidx_mem +#include "sql/sql_base.h" // get_from_share +#include "sql/sql_class.h" // THD +#include "sql/table.h" // TABLE +#include "vidx/my_atomic_wrapper.h" // Atomic_relaxed +#include "vidx/sql_hset.h" // Hash_set +#include "vidx/sql_queue.h" // Queue + +#include "sql/item_strfunc.h" +#include "vidx/bloom_filters.h" +#include "vidx/vidx_common.h" +#include "vidx/vidx_hnsw.h" + +namespace vidx { +namespace hnsw { +/* -------------------- Macros -------------------- */ +// distance can be a little bit < 0 because of fast math +static constexpr float NEAREST = -1.0f; + +// Algorithm parameters +static constexpr float alpha = 1.1f; +static constexpr uint ef_construction = 10; + +/* simplify and unify my_safe_alloca usage */ +#define MAX_ALLOCA_SZ 4096 + +uint get_ef_search(THD *thd); + +/* -------------------- Structure Definition -------------------- */ +class MHNSW_Share; +class FVectorNode; + +enum Graph_table_fields { FIELD_LAYER, FIELD_TREF, FIELD_VEC, FIELD_NEIGHBORS }; +enum Graph_table_indices { IDX_TREF, IDX_LAYER }; + +/* + One vector, an array of coordinates in ctx->vec_len dimensions +*/ +#pragma pack(push, 1) +struct FVector { + static constexpr size_t data_header = sizeof(float); + static constexpr size_t alloc_header = data_header + sizeof(float); + + float abs2, scale; + int16_t dims[4]; + + uchar *data() const { return (uchar *)(&scale); } + + static size_t data_size(size_t n) { return data_header + n * 2; } + + static size_t data_to_value_size(size_t data_size) { + return (data_size - data_header) * 2; + } + + static const FVector *create(distance_kind metric, void *mem, const void *src, + size_t src_len) { + float scale = 0, *v = (float *)src; + size_t vec_len = src_len / sizeof(float); + for (size_t i = 0; i < vec_len; i++) + scale = std::max(scale, std::abs(get_float(v + i))); + + FVector *vec = align_ptr(mem); + vec->scale = scale ? scale / 32767 : 1; + /* MDEV-37055 */ + if (std::round(scale / vec->scale) > 32767) + vec->scale = std::nextafter(vec->scale, FLT_MAX); + for (size_t i = 0; i < vec_len; i++) + vec->dims[i] = + static_cast(std::round(get_float(v + i) / vec->scale)); + vec->postprocess(vec_len); + if (metric == COSINE) { + /* fix vector length when cosine */ + if (vec->abs2 > 0.0f) vec->scale /= std::sqrt(2 * vec->abs2); + vec->abs2 = 0.5f; + } + return vec; + } + + void postprocess(size_t vec_len) { + fix_tail(vec_len); + abs2 = scale * scale * dot_product(dims, dims, vec_len) / 2; + } + +#ifdef AVX2_IMPLEMENTATION + /************* AVX2 *****************************************************/ + static constexpr size_t AVX2_bytes = 256 / 8; + static constexpr size_t AVX2_dims = AVX2_bytes / sizeof(int16_t); + + AVX2_IMPLEMENTATION + static float dot_product(const int16_t *v1, const int16_t *v2, size_t len) { + typedef float v8f __attribute__((vector_size(AVX2_bytes))); + union { + v8f v; + __m256 i; + } tmp; + __m256i *p1 = (__m256i *)v1; + __m256i *p2 = (__m256i *)v2; + v8f d = {0}; + for (size_t i = 0; i < (len + AVX2_dims - 1) / AVX2_dims; p1++, p2++, i++) { + tmp.i = _mm256_cvtepi32_ps(_mm256_madd_epi16(*p1, *p2)); + d += tmp.v; + } + return d[0] + d[1] + d[2] + d[3] + d[4] + d[5] + d[6] + d[7]; + } + + AVX2_IMPLEMENTATION + static size_t alloc_size(size_t n) { + return alloc_header + MY_ALIGN(n * 2, AVX2_bytes) + AVX2_bytes - 1; + } + + AVX2_IMPLEMENTATION + static FVector *align_ptr(void *ptr) { + return (FVector *)(MY_ALIGN(((intptr)ptr) + alloc_header, AVX2_bytes) - + alloc_header); + } + + AVX2_IMPLEMENTATION + void fix_tail(size_t vec_len) { + bzero(dims + vec_len, (MY_ALIGN(vec_len, AVX2_dims) - vec_len) * 2); + } +#endif + +#ifdef AVX512_IMPLEMENTATION + /************* AVX512 ****************************************************/ + static constexpr size_t AVX512_bytes = 512 / 8; + static constexpr size_t AVX512_dims = AVX512_bytes / sizeof(int16_t); + + AVX512_IMPLEMENTATION + static float dot_product(const int16_t *v1, const int16_t *v2, size_t len) { + __m512i *p1 = (__m512i *)v1; + __m512i *p2 = (__m512i *)v2; + __m512 d = _mm512_setzero_ps(); + for (size_t i = 0; i < (len + AVX512_dims - 1) / AVX512_dims; + p1++, p2++, i++) + d = _mm512_add_ps(d, _mm512_cvtepi32_ps(_mm512_madd_epi16(*p1, *p2))); + return _mm512_reduce_add_ps(d); + } + + AVX512_IMPLEMENTATION + static size_t alloc_size(size_t n) { + return alloc_header + MY_ALIGN(n * 2, AVX512_bytes) + AVX512_bytes - 1; + } + + AVX512_IMPLEMENTATION + static FVector *align_ptr(void *ptr) { + return (FVector *)(MY_ALIGN(((intptr)ptr) + alloc_header, AVX512_bytes) - + alloc_header); + } + + AVX512_IMPLEMENTATION + void fix_tail(size_t vec_len) { + bzero(dims + vec_len, (MY_ALIGN(vec_len, AVX512_dims) - vec_len) * 2); + } +#endif + + /* + ARM NEON implementation. A microbenchmark shows 1.7x dot_product() + performance improvement compared to regular -O2/-O3 builds and 2.4x compared + to builds with auto-vectorization disabled. + + There seem to be no performance difference between vmull+vmull_high and + vmull+vmlal2_high implementations. + */ + +#ifdef NEON_IMPLEMENTATION + static constexpr size_t NEON_bytes = 128 / 8; + static constexpr size_t NEON_dims = NEON_bytes / sizeof(int16_t); + + static float dot_product(const int16_t *v1, const int16_t *v2, size_t len) { + int64_t d = 0; + for (size_t i = 0; i < (len + NEON_dims - 1) / NEON_dims; i++) { + int16x8_t p1 = vld1q_s16(v1); + int16x8_t p2 = vld1q_s16(v2); + d += vaddlvq_s32(vmull_s16(vget_low_s16(p1), vget_low_s16(p2))) + + vaddlvq_s32(vmull_high_s16(p1, p2)); + v1 += NEON_dims; + v2 += NEON_dims; + } + return static_cast(d); + } + + static size_t alloc_size(size_t n) { + return alloc_header + MY_ALIGN(n * 2, NEON_bytes) + NEON_bytes - 1; + } + + static FVector *align_ptr(void *ptr) { + return (FVector *)(MY_ALIGN(((intptr)ptr) + alloc_header, NEON_bytes) - + alloc_header); + } + + void fix_tail(size_t vec_len) { + bzero(dims + vec_len, (MY_ALIGN(vec_len, NEON_dims) - vec_len) * 2); + } +#endif + + /************* no-SIMD default ******************************************/ +#ifdef DEFAULT_IMPLEMENTATION + DEFAULT_IMPLEMENTATION + static float dot_product(const int16_t *v1, const int16_t *v2, size_t len) { + int64_t d = 0; + for (size_t i = 0; i < len; i++) d += int32_t(v1[i]) * int32_t(v2[i]); + return static_cast(d); + } + + DEFAULT_IMPLEMENTATION + static size_t alloc_size(size_t n) { return alloc_header + n * 2; } + + DEFAULT_IMPLEMENTATION + static FVector *align_ptr(void *ptr) { return (FVector *)ptr; } + + DEFAULT_IMPLEMENTATION + void fix_tail(size_t) {} +#endif + + float distance_to(const FVector *other, size_t vec_len) const { + return abs2 + other->abs2 - + scale * other->scale * dot_product(dims, other->dims, vec_len); + } +}; +#pragma pack(pop) + +/* + An array of pointers to graph nodes + + It's mainly used to store all neighbors of a given node on a given layer. + + An array is fixed size, 2*M for the zero layer, M for other layers + see MHNSW_Share::max_neighbors(). + + Number of neighbors is zero-padded to multiples of 8 (for SIMD Bloom filter). + + Also used as a simply array of nodes in search_layer, the array size + then is defined by ef or efConstruction. +*/ +struct Neighborhood { + FVectorNode **links; + size_t num; + FVectorNode **init(FVectorNode **ptr, size_t n) { + num = 0; + links = ptr; + n = MY_ALIGN(n, 8); + bzero(ptr, n * sizeof(*ptr)); + return ptr + n; + } +}; + +/* + One node in a graph = one row in the graph table + + stores a vector itself, ref (= position) in the graph (= hlindex) + table, a ref in the main table, and an array of Neighborhood's, one + per layer. + + It's lazily initialized, may know only gref, everything else is + loaded on demand. + + On the other hand, on INSERT the new node knows everything except + gref - which only becomes known after ha_write_row. + + Allocated on memroot in two chunks. One is the same size for all nodes + and stores FVectorNode object, gref, tref, and vector. The second + stores neighbors, all Neighborhood's together, its size depends + on the number of layers this node is on. + + There can be millions of nodes in the cache and the cache size + is constrained by max_cache_size, so every byte matters here +*/ +#pragma pack(push, 1) +class FVectorNode { + private: + MHNSW_Share *ctx; + + const FVector *make_vec(const void *v); + int alloc_neighborhood(uint8_t layer); + + public: + const FVector *vec = nullptr; + Neighborhood *neighbors = nullptr; + uint8_t max_layer; + bool stored : 1, deleted : 1; + + FVectorNode(MHNSW_Share *ctx_, const void *gref_); + FVectorNode(MHNSW_Share *ctx_, const void *tref_, uint8_t layer, + const void *vec_); + float distance_to(const FVector *other) const; + int load(TABLE *graph); + int load_from_record(TABLE *graph); + int save(TABLE *graph); + size_t tref_len() const; + size_t gref_len() const; + uchar *gref() const; + uchar *tref() const; + void push_neighbor(size_t layer, FVectorNode *v); + + static const uchar *get_key(const void *elem, size_t *key_len, my_bool); +}; +#pragma pack(pop) + +/* + Shared algorithm context. The graph. + + Stored in TABLE_SHARE and on TABLE_SHARE::mem_root. + Stores the complete graph in MHNSW_Share::root, + The mapping gref->FVectorNode is in the node_cache. + Both root and node_cache are protected by a cache_lock, but it's + needed when loading nodes and is not used when the whole graph is in memory. + Graph can be traversed concurrently by different threads, as traversal + changes neither nodes nor the ctx. + Nodes can be loaded concurrently by different threads, this is protected + by a partitioned node_lock. + reference counter allows flushing the graph without interrupting + concurrent searches. + MyISAM automatically gets exclusive write access because of the TL_WRITE, + but InnoDB has to use a dedicated ctx->commit_lock for that +*/ +class MHNSW_Share { + mysql_mutex_t cache_lock; + mysql_mutex_t node_lock[8]; + + void cache_internal(FVectorNode *node) { + assert(node->stored); + node_cache.insert(node); + } + void *alloc_node_internal() { + return root.Alloc(sizeof(FVectorNode) + gref_len + tref_len + + FVector::alloc_size(vec_len)); + } + + protected: + std::atomic refcnt{0}; + MEM_ROOT root; + Hash_set node_cache{key_memory_vidx_mem, FVectorNode::get_key}; + + public: + ulonglong version = 0; // protected by commit_lock + mysql_rwlock_t commit_lock; + size_t vec_len = 0; + size_t byte_len = 0; + Atomic_relaxed ef_power{0.6}; // for the bloom filter size heuristic + Atomic_relaxed diameter{0}; // for the generosity heuristic + FVectorNode *start = 0; + const uint tref_len; + const uint gref_len; + const uint M; + distance_kind metric; + + MHNSW_Share(TABLE *t) + : tref_len(t->file->ref_length), + gref_len(t->hlindex->file->ref_length), + M(static_cast(t->s->key_info[t->s->keys].vector_m)), + metric((distance_kind)t->s->key_info[t->s->keys].vector_distance) { + mysql_rwlock_init(PSI_INSTRUMENT_ME, &commit_lock); + mysql_mutex_init(PSI_INSTRUMENT_ME, &cache_lock, MY_MUTEX_INIT_FAST); + for (uint i = 0; i < array_elements(node_lock); i++) + mysql_mutex_init(PSI_INSTRUMENT_ME, node_lock + i, MY_MUTEX_INIT_SLOW); + init_sql_alloc(key_memory_vidx_mem, &root, 1024 * 1024); + } + + virtual ~MHNSW_Share() { + /* No need to call free_root(&root, MYF(0)), because MEM_ROOT::Clear() will + be called by MEM_ROOT::~MEM_ROOT() */ + mysql_rwlock_destroy(&commit_lock); + mysql_mutex_destroy(&cache_lock); + for (size_t i = 0; i < array_elements(node_lock); i++) + mysql_mutex_destroy(node_lock + i); + } + + uint lock_node(FVectorNode *ptr) { + ulong nr1 = 1, nr2 = 4; + my_hash_sort_bin(0, (const uchar *)&ptr, sizeof(ptr), &nr1, &nr2); + uint ticket = nr1 % array_elements(node_lock); + mysql_mutex_lock(node_lock + ticket); + return ticket; + } + + void unlock_node(uint ticket) { mysql_mutex_unlock(node_lock + ticket); } + + uint max_neighbors(size_t layer) const { + return (layer ? 1 : 2) * M; // heuristic from the paper + } + + void set_lengths(size_t len) { + byte_len = len; + vec_len = len / sizeof(float); + } + + static int acquire(MHNSW_Share **ctx, TABLE *table, bool for_update); + static MHNSW_Share *get_from_share(TABLE_SHARE *share, TABLE *table); + + virtual void reset(TABLE_SHARE *share) { + share->lock_share(); + if (static_cast(share->hlindex->hlindex_data) == this) { + share->hlindex->hlindex_data = nullptr; + --refcnt; + } + share->unlock_share(); + } + + void release(TABLE *table) { + return release(table->file->has_transactions(), table->s); + } + + virtual void release(bool can_commit, TABLE_SHARE *share) { + if (can_commit) mysql_rwlock_unlock(&commit_lock); + if (root.allocated_size() > max_cache_size) reset(share); + if (--refcnt == 0) this->~MHNSW_Share(); // XXX reuse + } + + virtual MHNSW_Share *dup(bool can_commit) { + refcnt++; + if (can_commit) mysql_rwlock_rdlock(&commit_lock); + return this; + } + + FVectorNode *get_node(const void *gref) { + mysql_mutex_lock(&cache_lock); + FVectorNode *node = node_cache.find(gref, gref_len); + if (!node) { + node = new (alloc_node_internal()) FVectorNode(this, gref); + cache_internal(node); + } + mysql_mutex_unlock(&cache_lock); + return node; + } + + /* used on INSERT, gref isn't known, so cannot cache the node yet */ + void *alloc_node() { + mysql_mutex_lock(&cache_lock); + auto p = alloc_node_internal(); + mysql_mutex_unlock(&cache_lock); + return p; + } + + /* explicitly cache the node after alloc_node() */ + void cache_node(FVectorNode *node) { + mysql_mutex_lock(&cache_lock); + cache_internal(node); + mysql_mutex_unlock(&cache_lock); + } + + /* find the node without creating, only used on merging trx->ctx */ + FVectorNode *find_node(const void *gref) { + mysql_mutex_lock(&cache_lock); + FVectorNode *node = node_cache.find(gref, gref_len); + mysql_mutex_unlock(&cache_lock); + return node; + } + + void *alloc_neighborhood(size_t max_layer) { + mysql_mutex_lock(&cache_lock); + auto p = root.Alloc(sizeof(Neighborhood) * (max_layer + 1) + + sizeof(FVectorNode *) * + (MY_ALIGN(M, 4) * 2 + MY_ALIGN(M, 8) * max_layer)); + mysql_mutex_unlock(&cache_lock); + return p; + } +}; + +/* + This is a non-shared context that exists within one transaction. + + At the end of the transaction it's either discarded (on rollback) + or merged into the shared ctx (on commit). + + trx's are stored in thd->ha_data[] in a single-linked list, + one instance of trx per TABLE_SHARE and allocated on the + thd->transaction->mem_root +*/ +class MHNSW_Trx : public MHNSW_Share { + public: + MDL_ticket *table_id; + bool list_of_nodes_is_lost = false; + MHNSW_Trx *next = nullptr; + + MHNSW_Trx(TABLE *table) : MHNSW_Share(table), table_id(table->mdl_ticket) {} + void reset(TABLE_SHARE *) override { + node_cache.clear(); + root.Clear(); + start = 0; + list_of_nodes_is_lost = true; + } + void release(bool, TABLE_SHARE *) override { + if (--refcnt == 0 && root.allocated_size() > max_cache_size) reset(nullptr); + } + + virtual MHNSW_Share *dup(bool) override { + refcnt++; + return this; + } + + static MHNSW_Trx *get_from_thd(TABLE *table, bool for_update); + + // it's okay in a transaction-local cache, there's no concurrent access + Hash_set &get_cache() { return node_cache; } + + /* fake handlerton to use thd->ha_data and to get notified of commits */ + static struct MHNSW_hton : public handlerton { + MHNSW_hton() { + db_type = DB_TYPE_HLINDEX_HELPER; + flags = HTON_NOT_USER_SELECTABLE | HTON_HIDDEN; + /* savepoint_offset will be set in setup_transaction_participant(). */ + savepoint_offset = 0; + savepoint_set = [](handlerton *, THD *, void *) { return 0; }; + savepoint_rollback_can_release_mdl = [](handlerton *, THD *) { + return true; + }; + savepoint_rollback = do_savepoint_rollback; + commit = do_commit; + rollback = do_rollback; + } + static int do_commit(handlerton *, THD *thd, bool); + static int do_rollback(handlerton *, THD *thd, bool); + static int do_savepoint_rollback(handlerton *, THD *thd, void *); + } hnsw_hton; +}; + +/* one visited node during the search. caches the distance to target */ +struct Visited { + FVectorNode *node; + const float distance_to_target; + Visited(FVectorNode *n, float d) : node(n), distance_to_target(d) {} + static int cmp(void *, uchar *a_, uchar *b_) { + const Visited *a = (const Visited *)a_; + const Visited *b = (const Visited *)b_; + return a->distance_to_target < b->distance_to_target ? -1 + : a->distance_to_target > b->distance_to_target ? 1 + : 0; + } +}; + +/* + a factory to create Visited and keep track of already seen nodes + + note that PatternedSimdBloomFilter works in blocks of 8 elements, + so on insert they're accumulated in nodes[], on search the caller + provides 8 addresses at once. we record 0x0 as "seen" so that + the caller could pad the input with nullptr's +*/ +class VisitedSet { + MEM_ROOT *root; + const FVector *target; + PatternedSimdBloomFilter map; + const FVectorNode *nodes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + size_t idx = 1; // to record 0 in the filter + public: + uint count = 0; + VisitedSet(MEM_ROOT *root, const FVector *target, uint size) + : root(root), target(target), map(size, 0.01f) {} + Visited *create(FVectorNode *node) { + auto *v = new (root) Visited(node, node->distance_to(target)); + insert(node); + count++; + return v; + } + void insert(const FVectorNode *n) { + nodes[idx++] = n; + if (idx == 8) flush(); + } + void flush() { + if (idx) map.Insert(nodes); + idx = 0; + } + uint8_t seen(FVectorNode **nodes) { return map.Query(nodes); } +}; + +struct Search_context { + Neighborhood found; + MHNSW_Share *ctx; + const FVector *target; + ulonglong ctx_version; + size_t pos = 0; + float threshold = NEAREST / 2; + Search_context(Neighborhood *n, MHNSW_Share *s, const FVector *v) + : found(*n), ctx(s->dup(false)), target(v), ctx_version(ctx->version) {} +}; + +/* -------------------- External Vars Definition -------------------- */ +MHNSW_Trx::MHNSW_hton MHNSW_Trx::hnsw_hton; + +void *trx_handler = &MHNSW_Trx::hnsw_hton; + +ulonglong max_cache_size = DEF_CACHE_SIZE; + +/* -------------------- Static Functions Definition -------------------- */ +template +static void copy_option(dd::Properties *to, dd::Properties *from, + const char *key) { + if (from->exists(key)) { + T value; + from->get(key, &value); + to->set(key, value); + } +} + +static dd::Column *fill_dd_add_columns( + dd::Table *hlindex_dd, const char *name, const char *type_name, + dd::enum_column_types type, size_t char_length, bool nullable, + uint numeric_precision, const CHARSET_INFO *charset, + bool is_explicit_collation, bool is_numeric_scale_null, + size_t default_value_len, uint nr [[maybe_unused]]) { + dd::Column *col = hlindex_dd->add_column(); + assert(col->ordinal_position() == nr + 1); + dd::Properties *options = &col->options(); + col->set_name(name); + col->set_column_type_utf8(type_name); + col->set_type(type); + col->set_char_length(char_length); + col->set_numeric_precision(numeric_precision); + col->set_hidden(dd::Column::enum_hidden_type::HT_VISIBLE); + col->set_collation_id(charset->number); + col->set_is_explicit_collation(is_explicit_collation); + if (!is_numeric_scale_null) { + col->set_numeric_scale(0); + } + col->set_nullable(nullable); + col->set_has_no_default(!nullable); + col->set_default_value_null(nullable); + if (!nullable) { + assert(default_value_len > 0); + + char *default_value = new char[default_value_len]; + + memset(default_value, 0, default_value_len); + col->set_default_value(dd::String_type{default_value, default_value_len}); + + delete[] default_value; + } + + options->set("interval_count", 0); + return col; +} + +static dd::Index *fill_dd_add_indexes(dd::Table *hlindex_dd, const char *name, + bool is_unique, uint nr, dd::Column *col, + const uint64_t length) { + dd::Index *index = hlindex_dd->add_index(); + index->set_name(name); + index->set_algorithm(dd::Index::IA_BTREE); + index->set_algorithm_explicit(false); + index->set_visible(true); + index->set_type(is_unique ? dd::Index::IT_UNIQUE : dd::Index::IT_MULTIPLE); + index->set_ordinal_position(nr + 1); + index->set_generated(false); + index->set_engine(hlindex_dd->engine()); + index->options().set("flags", 0); + + col->set_column_key(is_unique ? dd::Column::CK_UNIQUE + : dd::Column::CK_MULTIPLE); + + dd::Index_element *index_elem = index->add_element(col); + index_elem->set_length(length); + + return index; +} + +/* + selects best neighbors from the list of candidates plus one extra candidate + + one extra candidate is specified separately to avoid appending it to + the Neighborhood candidates, which might be already at its max size. +*/ +static int select_neighbors(MHNSW_Share *, TABLE *graph, size_t layer, + FVectorNode &target, const Neighborhood &candidates, + FVectorNode *extra_candidate, + size_t max_neighbor_connections) { + Queue pq; // working queue + + if (pq.init(max_ef, false, Visited::cmp)) return HA_ERR_OUT_OF_MEM; + + MEM_ROOT *const root = graph->in_use->mem_root; + auto discarded = (Visited **)my_safe_alloca( + sizeof(Visited **) * max_neighbor_connections, MAX_ALLOCA_SZ); + size_t discarded_num = 0; + Neighborhood &neighbors = target.neighbors[layer]; + + for (size_t i = 0; i < candidates.num; i++) { + FVectorNode *node = candidates.links[i]; + if (int err = node->load(graph)) return err; + pq.push(new (root) Visited(node, node->distance_to(target.vec))); + } + if (extra_candidate) + pq.push(new (root) Visited(extra_candidate, + extra_candidate->distance_to(target.vec))); + + assert(pq.elements()); + neighbors.num = 0; + + while (pq.elements() && neighbors.num < max_neighbor_connections) { + Visited *vec = pq.pop(); + FVectorNode *const node = vec->node; + const float target_dista = + std::max(32 * FLT_EPSILON, vec->distance_to_target / alpha); + bool discard = false; + for (size_t i = 0; i < neighbors.num; i++) + if ((discard = + node->distance_to(neighbors.links[i]->vec) <= target_dista)) + break; + if (!discard) + target.push_neighbor(layer, node); + else if (discarded_num + neighbors.num < max_neighbor_connections) + discarded[discarded_num++] = vec; + } + + for (size_t i = 0; + i < discarded_num && neighbors.num < max_neighbor_connections; i++) + target.push_neighbor(layer, discarded[i]->node); + + my_safe_afree(discarded, sizeof(Visited **) * max_neighbor_connections, + MAX_ALLOCA_SZ); + return 0; +} + +static int update_second_degree_neighbors(MHNSW_Share *ctx, TABLE *graph, + size_t layer, FVectorNode *node) { + const uint max_neighbors = ctx->max_neighbors(layer); + // it seems that one could update nodes in the gref order + // to avoid InnoDB deadlocks, but it produces no noticeable effect + for (size_t i = 0; i < node->neighbors[layer].num; i++) { + FVectorNode *neigh = node->neighbors[layer].links[i]; + Neighborhood &neighneighbors = neigh->neighbors[layer]; + if (neighneighbors.num < max_neighbors) + neigh->push_neighbor(layer, node); + else if (int err = select_neighbors(ctx, graph, layer, *neigh, + neighneighbors, node, max_neighbors)) + return err; + if (int err = neigh->save(graph)) return err; + } + return 0; +} + +static inline float generous_furthest(const Queue &q, float maxd, + float g) { + float d0 = maxd * g / 2; + float d = q.top()->distance_to_target; + float k = 5; + float x = (d - d0) / d0; + float sigmoid = + k * x / std::sqrt(1 + (k * k - 1) * x * x); // or any other sigmoid + return d * (1 + (g - 1) / 2 * (1 - sigmoid)); +} + +/* + @param[in/out] inout in: start nodes, out: result nodes +*/ +static int search_layer(MHNSW_Share *ctx, TABLE *graph, const FVector *target, + float threshold, uint result_size, size_t layer, + Neighborhood *inout, bool construction) { + assert(inout->num > 0); + + MEM_ROOT *const root = graph->in_use->mem_root; + Queue candidates, best; + bool skip_deleted; + uint ef = result_size; + float generosity = 1.1f + ctx->M / 500.0f; + + if (construction) { + skip_deleted = false; + if (ef > 1) ef = std::max(ef_construction, ef); + } else { + skip_deleted = layer == 0; + if (ef > 1 || layer == 0) ef = std::max(get_ef_search(graph->in_use), ef); + } + + // WARNING! heuristic here + const double est_heuristic = 8 * std::sqrt(ctx->max_neighbors(layer)); + const uint est_size = + static_cast(est_heuristic * std::pow(ef, ctx->ef_power)); + VisitedSet visited(root, target, est_size); + + candidates.init(max_ef, false, Visited::cmp); + best.init(ef, true, Visited::cmp); + + assert(inout->num <= result_size); + float max_distance = ctx->diameter; + for (size_t i = 0; i < inout->num; i++) { + Visited *v = visited.create(inout->links[i]); + max_distance = std::max(max_distance, v->distance_to_target); + candidates.safe_push(v); /* MDEV-35745 */ + if ((skip_deleted && v->node->deleted) || threshold > NEAREST) continue; + best.push(v); + } + + float furthest_best = best.is_empty() + ? FLT_MAX + : generous_furthest(best, max_distance, generosity); + while (candidates.elements()) { + const Visited &cur = *candidates.pop(); + if (cur.distance_to_target > furthest_best && best.is_full()) + break; // All possible candidates are worse than what we have + + visited.flush(); + + Neighborhood &neighbors = cur.node->neighbors[layer]; + FVectorNode **links = neighbors.links, **end = links + neighbors.num; + for (; links < end; links += 8) { + uint8_t res = visited.seen(links); + if (res == 0xff) continue; + + for (size_t i = 0; i < 8; i++) { + if (res & (1 << i)) continue; + if (int err = links[i]->load(graph)) return err; + Visited *v = visited.create(links[i]); + if (v->distance_to_target <= threshold) continue; + if (!best.is_full()) { + max_distance = std::max(max_distance, v->distance_to_target); + candidates.safe_push(v); /* MDEV-35745 */ + if (skip_deleted && v->node->deleted) continue; + best.push(v); + furthest_best = generous_furthest(best, max_distance, generosity); + } else if (v->distance_to_target < furthest_best) { + candidates.safe_push(v); + if (skip_deleted && v->node->deleted) continue; + if (v->distance_to_target < best.top()->distance_to_target) { + best.replace_top(v); + furthest_best = generous_furthest(best, max_distance, generosity); + } + } + } + } + } + set_if_bigger(ctx->diameter, max_distance); // not atomic, but it's ok + if (ef > 1 && visited.count * 2 > est_size) { + double ef_power = + std::log(visited.count * 2 / est_heuristic) / std::log(ef); + set_if_bigger(ctx->ef_power, ef_power); // not atomic, but it's ok + } + + while (best.elements() > result_size) best.pop(); + + inout->num = best.elements(); + for (FVectorNode **links = inout->links + inout->num; best.elements();) + *--links = best.pop()->node; + + return 0; +} + +/* -------------------- Class Functions Definition -------------------- */ +int MHNSW_Trx::MHNSW_hton::do_savepoint_rollback(handlerton *, THD *thd, + void *) { + for (auto trx = static_cast(thd_get_ha_data(thd, &hnsw_hton)); + trx; trx = trx->next) + trx->reset(nullptr); + return 0; +} + +int MHNSW_Trx::MHNSW_hton::do_rollback(handlerton *ht, THD *thd, bool all) { + /* MDEV-37068 Can't find record in 't1' on INSERT to Vector table */ + if (!all && thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) + return do_savepoint_rollback(ht, thd, nullptr); + + MHNSW_Trx *trx_next; + for (auto trx = static_cast(thd_get_ha_data(thd, &hnsw_hton)); + trx; trx = trx_next) { + trx_next = trx->next; + trx->~MHNSW_Trx(); + } + thd_set_ha_data(current_thd, &hnsw_hton, nullptr); + return 0; +} + +int MHNSW_Trx::MHNSW_hton::do_commit(handlerton *, THD *thd, bool all) { + /* MDEV-37068 Can't find record in 't1' on INSERT to Vector table */ + if (!all && thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) + return 0; + + MHNSW_Trx *trx_next; + + for (auto trx = static_cast(thd_get_ha_data(thd, &hnsw_hton)); + trx; trx = trx_next) { + trx_next = trx->next; + if (trx->table_id) { + const MDL_key *key = trx->table_id->get_key(); + mysql_mutex_lock(&LOCK_open); + TABLE_SHARE *share = get_table_share(thd, key->db_name(), key->name(), + (const char *)key->ptr() + 1, + key->length() - 1, false); + mysql_mutex_unlock(&LOCK_open); + + if (share) { + auto ctx = share->hlindex ? MHNSW_Share::get_from_share(share, nullptr) + : nullptr; + if (ctx) { + mysql_rwlock_wrlock(&ctx->commit_lock); + ctx->version++; + if (trx->list_of_nodes_is_lost) + ctx->reset(share); + else { + // consider copying nodes from trx to shared cache when it makes + // sense. for ann_benchmarks it does not. + // also, consider flushing only changed nodes (a flag in the node) + for (FVectorNode &from : trx->get_cache()) + if (FVectorNode *node = ctx->find_node(from.gref())) + node->vec = nullptr; + ctx->start = nullptr; + } + ctx->release(true, share); + } + + mysql_mutex_lock(&LOCK_open); + release_table_share(share); + mysql_mutex_unlock(&LOCK_open); + } + } + + trx->~MHNSW_Trx(); + } + thd_set_ha_data(current_thd, &hnsw_hton, nullptr); + return 0; +} + +MHNSW_Trx *MHNSW_Trx::get_from_thd(TABLE *table, bool for_update) { + if (!table->file->has_transactions()) return NULL; + + THD *thd = table->in_use; + auto trx = static_cast(thd_get_ha_data(thd, &hnsw_hton)); + if (!for_update && !trx) return NULL; + + while (trx && trx->table_id != table->mdl_ticket) trx = trx->next; + if (!trx) { + trx = new (thd->get_transaction()->transaction_memroot()) MHNSW_Trx(table); + trx->next = static_cast(thd_get_ha_data(thd, &hnsw_hton)); + thd_set_ha_data(thd, &hnsw_hton, trx); + if (!trx->next) { + /* MDEV-37068 Can't find record in 't1' on INSERT to Vector table */ + if (thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) + trans_register_ha(thd, true, &hnsw_hton, 0); + trans_register_ha(thd, false, &hnsw_hton, 0); + } + } + trx->refcnt++; + return trx; +} + +MHNSW_Share *MHNSW_Share::get_from_share(TABLE_SHARE *share, TABLE *table) { + share->lock_share(); + auto ctx = static_cast(share->hlindex->hlindex_data); + if (!ctx && table) { + ctx = new (&share->hlindex->mem_root) MHNSW_Share(table); + if (!ctx) return nullptr; + share->hlindex->hlindex_data = ctx; + ctx->refcnt++; + } + if (ctx) ctx->refcnt++; + share->unlock_share(); + return ctx; +} + +int MHNSW_Share::acquire(MHNSW_Share **ctx, TABLE *table, bool for_update) { + TABLE *graph = table->hlindex; + + if (!(*ctx = MHNSW_Trx::get_from_thd(table, for_update))) { + *ctx = MHNSW_Share::get_from_share(table->s, table); + if (table->file->has_transactions()) + mysql_rwlock_rdlock(&(*ctx)->commit_lock); + } + + if ((*ctx)->start) return 0; + + if (int err = graph->file->ha_index_init(IDX_LAYER, 1)) return err; + + int err = graph->file->ha_index_last(graph->record[0]); + graph->file->ha_index_end(); + if (err) return err; + + graph->file->position(graph->record[0]); + (*ctx)->set_lengths( + FVector::data_to_value_size(graph->field[FIELD_VEC]->data_length())); + + /* MDEV-35834 Server crash in FVector::distance_to upon concurrent SELECT */ + auto node = (*ctx)->get_node(graph->file->ref); + if ((err = node->load_from_record(graph))) return err; + + (*ctx)->start = node; // set the shared start only when node is fully loaded + return 0; +} + +/* copy the vector, preprocessed as needed */ +const FVector *FVectorNode::make_vec(const void *v) { + return FVector::create(ctx->metric, tref() + tref_len(), v, ctx->byte_len); +} + +FVectorNode::FVectorNode(MHNSW_Share *ctx_, const void *gref_) + : ctx(ctx_), stored(true), deleted(false) { + memcpy(gref(), gref_, gref_len()); +} + +FVectorNode::FVectorNode(MHNSW_Share *ctx_, const void *tref_, uint8_t layer, + const void *vec_) + : ctx(ctx_), stored(false), deleted(false) { + assert(tref_); + memset(gref(), 0xff, gref_len()); // important: larger than any real gref + memcpy(tref(), tref_, tref_len()); + vec = make_vec(vec_); + + alloc_neighborhood(layer); +} + +float FVectorNode::distance_to(const FVector *other) const { + return vec->distance_to(other, ctx->vec_len); +} + +int FVectorNode::alloc_neighborhood(uint8_t layer) { + if (neighbors) return 0; + max_layer = layer; + neighbors = (Neighborhood *)ctx->alloc_neighborhood(layer); + auto ptr = (FVectorNode **)(neighbors + (layer + 1)); + for (size_t i = 0; i <= layer; i++) + ptr = neighbors[i].init(ptr, ctx->max_neighbors(i)); + return 0; +} + +int FVectorNode::load(TABLE *graph) { + if (likely(vec)) return 0; + + assert(stored); + // trx: consider loading nodes from shared, when it makes sense + // for ann_benchmarks it does not + if (int err = graph->file->ha_rnd_pos(graph->record[0], gref())) return err; + return load_from_record(graph); +} + +int FVectorNode::load_from_record(TABLE *graph) { + assert(ctx->byte_len); + + uint ticket = ctx->lock_node(this); + Scope_guard guard{[this, ticket]() { ctx->unlock_node(ticket); }}; + + if (vec) return 0; + + String buf, *v = graph->field[FIELD_TREF]->val_str(&buf); + deleted = graph->field[FIELD_TREF]->is_null(); + if (!deleted) { + if (unlikely(v->length() != tref_len())) return HA_ERR_CRASHED; + memcpy(tref(), v->ptr(), v->length()); + } + + v = graph->field[FIELD_VEC]->val_str(&buf); + if (unlikely(!v)) return HA_ERR_CRASHED; + + if (v->length() != FVector::data_size(ctx->vec_len)) return HA_ERR_CRASHED; + FVector *vec_ptr = FVector::align_ptr(tref() + tref_len()); + memcpy(vec_ptr->data(), v->ptr(), v->length()); + vec_ptr->postprocess(ctx->vec_len); + + longlong layer = graph->field[FIELD_LAYER]->val_int(); + if (layer > 100) // 10e30 nodes at M=2, more at larger M's + return HA_ERR_CRASHED; + + if (int err = alloc_neighborhood(static_cast(layer))) return err; + + v = graph->field[FIELD_NEIGHBORS]->val_str(&buf); + if (unlikely(!v)) return HA_ERR_CRASHED; + + // ... ...etc... + uchar *ptr = (uchar *)v->ptr(), *end = ptr + v->length(); + for (size_t i = 0; i <= max_layer; i++) { + if (unlikely(ptr >= end)) return HA_ERR_CRASHED; + size_t grefs = *ptr++; + if (unlikely(ptr + grefs * gref_len() > end)) return HA_ERR_CRASHED; + neighbors[i].num = grefs; + for (size_t j = 0; j < grefs; j++, ptr += gref_len()) + neighbors[i].links[j] = ctx->get_node(ptr); + } + vec = vec_ptr; // must be done at the very end + return 0; +} + +void FVectorNode::push_neighbor(size_t layer, FVectorNode *other) { + assert(neighbors[layer].num < ctx->max_neighbors(layer)); + neighbors[layer].links[neighbors[layer].num++] = other; +} + +size_t FVectorNode::tref_len() const { return ctx->tref_len; } +size_t FVectorNode::gref_len() const { return ctx->gref_len; } +uchar *FVectorNode::gref() const { return (uchar *)(this + 1); } +uchar *FVectorNode::tref() const { return gref() + gref_len(); } + +const uchar *FVectorNode::get_key(const void *elem, size_t *key_len, my_bool) { + *key_len = static_cast(elem)->gref_len(); + return static_cast(elem)->gref(); +} + +int FVectorNode::save(TABLE *graph) { + assert(vec); + assert(neighbors); + + restore_record(graph, s->default_values); + graph->field[FIELD_LAYER]->store(max_layer, false); + if (deleted) + graph->field[FIELD_TREF]->set_null(); + else { + graph->field[FIELD_TREF]->set_notnull(); + graph->field[FIELD_TREF]->store((const char *)tref(), tref_len(), + &my_charset_bin); + } + graph->field[FIELD_VEC]->store((const char *)vec->data(), + FVector::data_size(ctx->vec_len), + &my_charset_bin); + + size_t total_size = 0; + for (size_t i = 0; i <= max_layer; i++) + total_size += 1 + gref_len() * neighbors[i].num; + + uchar *neighbor_blob = + static_cast(my_safe_alloca(total_size, MAX_ALLOCA_SZ)); + uchar *ptr = neighbor_blob; + for (size_t i = 0; i <= max_layer; i++) { + *ptr++ = (uchar)(neighbors[i].num); + for (size_t j = 0; j < neighbors[i].num; j++, ptr += gref_len()) + memcpy(ptr, neighbors[i].links[j]->gref(), gref_len()); + } + graph->field[FIELD_NEIGHBORS]->store((const char *)neighbor_blob, total_size, + &my_charset_bin); + + int err; + if (stored) { + if (!(err = graph->file->ha_rnd_pos(graph->record[1], gref()))) { + err = graph->file->ha_update_row(graph->record[1], graph->record[0]); + if (err == HA_ERR_RECORD_IS_THE_SAME) err = 0; + } + } else { + err = graph->file->ha_write_row(graph->record[0]); + graph->file->position(graph->record[0]); + memcpy(gref(), graph->file->ref, gref_len()); + stored = true; + ctx->cache_node(this); + } + my_safe_afree(neighbor_blob, total_size, MAX_ALLOCA_SZ); + return err; +} + +/* -------------------- External Functions Definition -------------------- */ +std::unique_ptr create_dd_table(THD *thd, const char *table_name, + KEY *key, dd::Table *dd_table, + TABLE *table, const char *db_name, + const uint tref_len) { + assert(key->flags & HA_VECTOR); + assert(key->user_defined_key_parts == 1); + + const dd::Schema *schema = nullptr; + if (thd->dd_client()->acquire(db_name, &schema)) { + return nullptr; // Error is reported by the dictionary subsystem. + } + + if (schema == nullptr) { + my_error(ER_BAD_DB_ERROR, MYF(0), db_name); + return nullptr; + } + + std::unique_ptr tab_obj(schema->create_table(thd)); + dd::Table *hlindex_dd = tab_obj.get(); + + /* Basic */ + hlindex_dd->set_name(table_name); + hlindex_dd->set_hidden(dd::Abstract_table::HT_HIDDEN_HLINDEX); + hlindex_dd->set_engine(dd_table->engine()); + hlindex_dd->set_comment( + dd::String_type(key->comment.str, key->comment.length)); + hlindex_dd->set_row_format(dd_table->row_format()); + hlindex_dd->set_partition_type(dd::Table::PT_NONE); + hlindex_dd->set_subpartition_type(dd::Table::ST_NONE); + /* some properties have been set in Schema_impl::create_table(). */ + + /* Options */ + dd::Properties *hlindex_options = &hlindex_dd->options(); + dd::Properties *table_options = &dd_table->options(); + + hlindex_options->set("pack_record", true); + hlindex_options->set("avg_row_length", 0); + hlindex_options->set("stats_sample_pages", 0); + hlindex_options->set("keys_disabled", 0); + hlindex_options->set("stats_auto_recalc", HA_STATS_AUTO_RECALC_DEFAULT); + + copy_option(hlindex_options, table_options, "compress"); + copy_option(hlindex_options, table_options, "encrypt_type"); + copy_option(hlindex_options, table_options, "storage"); + copy_option(hlindex_options, table_options, "key_block_size"); + + /* Options for vector */ + hlindex_options->set("__vector_m__", key->vector_m); + hlindex_options->set("__vector_distance__", key->vector_distance); + /* fieldnr is started from 0 during creating. but we record the number of + ordinal_position in dd::Index_element */ + hlindex_options->set("__vector_column__", key->key_part->fieldnr + 1); + + /* Columns */ + char type_tref[255]; + snprintf(type_tref, sizeof(type_tref), "varbinary(%d)", tref_len); + const char *name_layer = "layer"; + const char *name_tref = "tref"; + dd::Column *col_layer = fill_dd_add_columns( + hlindex_dd, name_layer, "tinyint", dd::enum_column_types::TINY, 4, false, + 3, &my_charset_utf8mb4_0900_ai_ci, false, false, 1, FIELD_LAYER); + dd::Column *col_tref = fill_dd_add_columns( + hlindex_dd, name_tref, type_tref, dd::enum_column_types::VARCHAR, + tref_len, true, 0, &my_charset_bin, true, true, 0, FIELD_TREF); + fill_dd_add_columns(hlindex_dd, "vec", "blob", dd::enum_column_types::BLOB, + 65535, false, 0, &my_charset_bin, true, true, + 2 + portable_sizeof_char_ptr, FIELD_VEC); + fill_dd_add_columns(hlindex_dd, "neighbors", "blob", + dd::enum_column_types::BLOB, 65535, false, 0, + &my_charset_bin, true, true, 2 + portable_sizeof_char_ptr, + FIELD_NEIGHBORS); + /* system columns like ROW_ID will be added in storage engine. */ + + /* Indexes */ + fill_dd_add_indexes(hlindex_dd, name_tref, true, IDX_TREF, col_tref, + tref_len); + fill_dd_add_indexes(hlindex_dd, name_layer, false, IDX_LAYER, col_layer, 1); + /* Primary key will be added in storage engine. */ + + /* Add the InnoDB system columns DB_ROW_ID, DB_TRX_ID, DB_ROLL_PTR. */ + if (table->file->get_extra_columns_and_keys(nullptr, nullptr, nullptr, 0, + hlindex_dd)) { + return nullptr; + } + + return tab_obj; +} + +int mhnsw_insert(TABLE *table, KEY *keyinfo) { + THD *thd = table->in_use; + TABLE *graph = table->hlindex; + /* For ASSERT_COLUMN_MARKED_FOR_READ in val_str() */ + my_bitmap_map *old_map = dbug_tmp_use_all_columns(table, table->read_set); + Field *vec_field = keyinfo->key_part->field; + String buf, *res = vec_field->val_str(&buf); + MHNSW_Share *ctx; + + /* metadata are checked on open */ + assert(graph); + assert(keyinfo->flags & HA_VECTOR); + assert(vec_field->binary()); + assert(vec_field->cmp_type() == STRING_RESULT); + assert(res); // ER_INDEX_CANNOT_HAVE_NULL + assert(table->file->ref_length <= graph->field[FIELD_TREF]->field_length); + assert(res->length() > 0 && res->length() % 4 == 0); + + table->file->position(table->record[0]); + + int err = MHNSW_Share::acquire(&ctx, table, true); + Scope_guard guard_ctx{[ctx, table]() { ctx->release(table); }}; + + DBUG_EXECUTE_IF("failed_before_vidx_dml", { + my_error(ER_VECTOR_INDEX_USAGE, MYF(0), "debug failed before vidx dml."); + err = 1; + }); + + if (err) { + if (err != HA_ERR_END_OF_FILE) { + func_end: + dbug_tmp_restore_column_map(table->read_set, old_map); + + return err; + } + + // First insert! + ctx->set_lengths(res->length()); + FVectorNode *target = new (ctx->alloc_node()) + FVectorNode(ctx, table->file->ref, 0, res->ptr()); + if (!((err = target->save(graph)))) ctx->start = target; + goto func_end; + } + + if (ctx->byte_len != res->length()) return HA_ERR_CRASHED; + + MEM_ROOT temp_root(key_memory_vidx_mem, MEM_ROOT_BLOCK_SIZE); + MEM_ROOT *saved_mem_root = thd->mem_root; + thd->mem_root = &temp_root; + + Scope_guard guard_mem{ + [thd, saved_mem_root]() { thd->mem_root = saved_mem_root; }}; + + const size_t max_found = ctx->max_neighbors(0); + Neighborhood candidates; + candidates.init(new (thd->mem_root) FVectorNode *[max_found + 7], max_found); + candidates.links[candidates.num++] = ctx->start; + + const double NORMALIZATION_FACTOR = 1 / std::log(ctx->M); + double log = -std::log(my_rnd(&thd->rand)) * NORMALIZATION_FACTOR; + const uint8_t max_layer = candidates.links[0]->max_layer; + uint8_t target_layer = + std::min(static_cast(std::floor(log)), max_layer + 1); + int cur_layer; + + FVectorNode *target = new (ctx->alloc_node()) + FVectorNode(ctx, table->file->ref, target_layer, res->ptr()); + + if ((err = graph->file->ha_rnd_init(0)) > 0) goto func_end; + Scope_guard guard_graph{[graph]() { graph->file->ha_rnd_end(); }}; + + for (cur_layer = max_layer; cur_layer > target_layer; cur_layer--) { + if ((err = search_layer(ctx, graph, target->vec, NEAREST, 1, cur_layer, + &candidates, false)) > 0) + goto func_end; + } + + for (; cur_layer >= 0; cur_layer--) { + uint max_neighbors = ctx->max_neighbors(cur_layer); + if ((err = search_layer(ctx, graph, target->vec, NEAREST, max_neighbors, + cur_layer, &candidates, true)) > 0) + goto func_end; + + if ((err = select_neighbors(ctx, graph, cur_layer, *target, candidates, 0, + max_neighbors)) > 0) + goto func_end; + } + + if ((err = target->save(graph)) > 0) goto func_end; + + if (target_layer > max_layer) ctx->start = target; + + for (cur_layer = target_layer; cur_layer >= 0; cur_layer--) { + if ((err = update_second_degree_neighbors(ctx, graph, cur_layer, target)) > + 0) + goto func_end; + } + + goto func_end; +} + +int mhnsw_read_first(TABLE *table, KEY *, Item *dist) { + THD *thd = table->in_use; + TABLE *graph = table->hlindex; + auto *fun = static_cast(dist->real_item()); + ulonglong limit = fun->get_limit(); + assert(fun); + + limit = std::min(limit, max_ef); + + String buf, *res = fun->get_const_arg()->val_str(&buf); + MHNSW_Share *ctx; + + /* removed into IndexScanIterator::Init() */ + /* if (int err = table->file->ha_rnd_init(0)) return err; */ + + int err = MHNSW_Share::acquire(&ctx, table, false); + Scope_guard guard{[ctx, table]() { ctx->release(table); }}; + if (err) return err; + + Neighborhood candidates; + candidates.init(new (thd->mem_root) FVectorNode *[limit + 7], limit); + + // one could put all max_layer nodes in candidates + // but it has no effect on the recall or speed + candidates.links[candidates.num++] = ctx->start; + + /* the length of const_arg has been checked in + Item_func_vec_distance::get_key() */ + assert(res != nullptr); + assert(ctx->byte_len == res->length()); + + const longlong max_layer = candidates.links[0]->max_layer; + auto target = FVector::create( + ctx->metric, thd_alloc(thd, FVector::alloc_size(ctx->vec_len)), + res->ptr(), res->length()); + + if ((err = graph->file->ha_rnd_init(0)) > 0) return err; + + for (size_t cur_layer = max_layer; cur_layer > 0; cur_layer--) { + if ((err = search_layer(ctx, graph, target, NEAREST, 1, cur_layer, + &candidates, false)) > 0) { + graph->file->ha_rnd_end(); + return err; + } + } + + if ((err = search_layer(ctx, graph, target, NEAREST, static_cast(limit), + 0, &candidates, false)) > 0) { + graph->file->ha_rnd_end(); + return err; + } + + auto result = new (thd->mem_root) Search_context(&candidates, ctx, target); + graph->context = result; + + return mhnsw_read_next(table); +} + +int mhnsw_read_next(TABLE *table) { + auto result = static_cast(table->hlindex->context); + if (result->pos < result->found.num) { + uchar *ref = result->found.links[result->pos++]->tref(); + return table->file->ha_rnd_pos(table->record[0], ref); + } + if (!result->found.num) return HA_ERR_END_OF_FILE; + + TABLE *graph = table->hlindex; + MHNSW_Share *ctx = result->ctx->dup(table->file->has_transactions()); + Scope_guard guard_ctx{[&ctx, table]() { ctx->release(table); }}; + + if (ctx->version != result->ctx_version) { + // oops, shared ctx was modified, need to switch to MHNSW_Trx + MHNSW_Share *trx; + graph->file->ha_rnd_end(); + int err = MHNSW_Share::acquire(&trx, table, true); + Scope_guard guard_trx{[&trx, table]() { trx->release(table); }}; + if (int err2 = graph->file->ha_rnd_init(0)) err = err ? err : err2; + if (err) return err; + for (size_t i = 0; i < result->found.num; i++) { + FVectorNode *node = trx->get_node(result->found.links[i]->gref()); + if (!node) return HA_ERR_OUT_OF_MEM; + if ((err = node->load(graph))) return err; + result->found.links[i] = node; + } + ctx->release(false, table->s); // release shared ctx + result->ctx = trx->dup(false); // replace it with trx + result->ctx_version = trx->version; + std::swap(trx, ctx); // free shared ctx in this scope, keep trx + } + + float new_threshold = + result->found.links[result->found.num - 1]->distance_to(result->target); + + if (int err = search_layer(ctx, graph, result->target, result->threshold, + static_cast(result->pos), 0, &result->found, + false)) + return err; + result->pos = 0; + result->threshold = new_threshold + FLT_EPSILON; + return mhnsw_read_next(table); +} + +int mhnsw_read_end(TABLE *table) { + auto result = static_cast(table->hlindex->context); + result->ctx->release(false, table->s); + table->hlindex->context = 0; + table->hlindex->file->ha_index_or_rnd_end(); + return 0; +} + +void mhnsw_free(TABLE_SHARE *share) { + TABLE_SHARE *graph_share = share->hlindex; + if (!graph_share->hlindex_data) return; + + static_cast(graph_share->hlindex_data)->~MHNSW_Share(); + graph_share->hlindex_data = nullptr; +} + +int mhnsw_invalidate(TABLE *table, const uchar *rec, + KEY *keyinfo [[maybe_unused]]) { + TABLE *graph = table->hlindex; + handler *h = table->file; + MHNSW_Share *ctx; + + int err = MHNSW_Share::acquire(&ctx, table, true); + Scope_guard guard_ctx{[ctx, table]() { ctx->release(table); }}; + + DBUG_EXECUTE_IF("failed_before_vidx_dml", { + my_error(ER_VECTOR_INDEX_USAGE, MYF(0), "debug failed before vidx dml."); + return 1; + }); + + if (err) return err; + + /* metadata are checked on open */ + assert(graph); + assert(keyinfo->flags & HA_VECTOR); + assert(h->ref_length <= graph->field[FIELD_TREF]->field_length); + + // target record: + h->position(rec); + graph->field[FIELD_TREF]->set_notnull(); + graph->field[FIELD_TREF]->store((const char *)h->ref, h->ref_length, + &my_charset_bin); + + uchar *key = (uchar *)alloca(graph->key_info[IDX_TREF].key_length); + key_copy(key, graph->record[0], &graph->key_info[IDX_TREF], + graph->key_info[IDX_TREF].key_length); + + if ((err = graph->file->ha_index_read_idx_map( + graph->record[1], IDX_TREF, key, HA_WHOLE_KEY, HA_READ_KEY_EXACT)) > + 0) + return err; + + restore_record(graph, record[1]); + graph->field[FIELD_TREF]->set_null(); + if ((err = graph->file->ha_update_row(graph->record[1], graph->record[0])) > + 0) + return err; + + graph->file->position(graph->record[0]); + FVectorNode *node = ctx->get_node(graph->file->ref); + node->deleted = true; + + return 0; +} + +int mhnsw_delete_all(TABLE *table, KEY *keyinfo [[maybe_unused]]) { + TABLE *graph = table->hlindex; + + /* metadata are checked on open */ + assert(graph); + assert(keyinfo->flags & HA_VECTOR); + + DBUG_EXECUTE_IF("failed_before_vidx_dml", { + my_error(ER_VECTOR_INDEX_USAGE, MYF(0), "debug failed before vidx dml."); + return 1; + }); + + if (int err = graph->file->delete_all_rows()) return err; + + MHNSW_Share *ctx; + if (!MHNSW_Share::acquire(&ctx, table, true)) { + ctx->reset(table->s); + } + + /* MDEV-36758: always release ctx in mhnsw_delete_all */ + ctx->release(table); + + return 0; +} +} // namespace hnsw +} // namespace vidx diff --git a/sql/vidx/vidx_index.cc b/sql/vidx/vidx_index.cc new file mode 100644 index 00000000000..636d1255ee6 --- /dev/null +++ b/sql/vidx/vidx_index.cc @@ -0,0 +1,1162 @@ +/* Copyright (c) 2025, 2025, Alibaba and/or its affiliates. All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License, version 2.0, + as published by the Free Software Foundation. + + This program is also distributed with certain software (including + but not limited to OpenSSL) that is licensed under separate terms, + as designated in a particular file or component or in included license + documentation. The authors of MySQL hereby grant you an additional + permission to link the program and your derivative works with the + separately licensed software that they have included with MySQL. + + 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, version 2.0, for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include +#include "mysql/plugin.h" // MYSQL_DAEMON_PLUGIN, ... +#include "scope_guard.h" // Scope_guard +#include "sql/dd/cache/dictionary_client.h" // dd::cache::Dictionary_client +#include "sql/dd/dd_table.h" // dd::table_exists, ... +#include "sql/dd/dictionary.h" // dd::release_mdl +#include "sql/dd/string_type.h" // dd::String_type +#include "sql/dd/types/index.h" // dd::Index +#include "sql/dd/types/index_element.h" // dd::Index_element +#include "sql/dd_table_share.h" // open_table_def +#include "sql/field.h" // Field +#include "sql/handler.h" // setup_transaction_participant +#include "sql/item_strfunc.h" // vidx::Item_func_vec_distance +#include "sql/join_optimizer/access_path.h" // AccessPath +#include "sql/mysqld.h" // reg_ext_length +#include "sql/sql_base.h" // EXTRA_RECORD +#include "sql/sql_class.h" // THD +#include "sql/sql_lex.h" // LEX +#include "sql/sql_plugin_ref.h" // st_plugin_int +#include "sql/sql_select.h" // JOIN_TAB +#include "sql/sql_table.h" // mysql_rename_table + +#include "vidx/vidx_hnsw.h" +#include "vidx/vidx_index.h" + +namespace vidx { +/* -------------------- Macros -------------------- */ +#define VIDX_NAME "vidx_%016lx_%02x" +static constexpr uint VIDX_NAME_LEN = 4 + 1 + 16 + 1 + 2 + 1; +static constexpr uint vidx_num = 0; + +#define TL_FIRST_WRITE TL_WRITE_ALLOW_WRITE + +static constexpr uint32_t SCAN_COST = 4; + +/* -------------------- External Vars Definition -------------------- */ +st_plugin_int *vidx_plugin; +bool feature_disabled = false; + +/* -------------------- Static Vars Definition -------------------- */ +static TYPELIB distances = {array_elements(distance_names) - 1, "", + distance_names, nullptr}; + +static MYSQL_SYSVAR_BOOL(disabled, feature_disabled, PLUGIN_VAR_RQCMDARG, + "Whether to enable vector index feature", nullptr, + nullptr, true); + +static MYSQL_THDVAR_ENUM(default_distance, PLUGIN_VAR_RQCMDARG, + "Distance function to build the vector index for", + nullptr, nullptr, EUCLIDEAN, &distances); + +static MYSQL_THDVAR_UINT( + hnsw_default_m, PLUGIN_VAR_RQCMDARG, + "Larger values mean slower SELECTs and INSERTs, larger index size " + "and higher memory consumption but more accurate results", + nullptr, nullptr, hnsw::M_DEF, hnsw::M_MIN, hnsw::M_MAX, 1); + +static MYSQL_THDVAR_UINT( + hnsw_ef_search, PLUGIN_VAR_RQCMDARG, + "Larger values mean slower SELECTs but more accurate results. " + "Defines the minimal number of result candidates to look for in the " + "vector index for ORDER BY ... LIMIT N queries. The search will never " + "search for less rows than that, even if LIMIT is smaller", + nullptr, nullptr, 20, 1, hnsw::max_ef, 1); + +static MYSQL_SYSVAR_ULONGLONG(hnsw_cache_size, hnsw::max_cache_size, + PLUGIN_VAR_RQCMDARG, + "Upper limit for one HNSW vector index cache", + nullptr, nullptr, hnsw::DEF_CACHE_SIZE, + 1024 * 1024, ULONG_LONG_MAX, 1); + +static SYS_VAR *sys_vars[] = { + MYSQL_SYSVAR(disabled), MYSQL_SYSVAR(default_distance), + MYSQL_SYSVAR(hnsw_default_m), MYSQL_SYSVAR(hnsw_ef_search), + MYSQL_SYSVAR(hnsw_cache_size), nullptr}; + +static struct st_mysql_storage_engine daemon = {MYSQL_DAEMON_INTERFACE_VERSION}; + +/* -------------------- Static Functions Definition -------------------- */ +static int plugin_init(void *p) { + vidx_plugin = (st_plugin_int *)p; + vidx_plugin->data = hnsw::trx_handler; + + if (setup_transaction_participant(vidx_plugin)) return 1; + + return 0; +} + +static int plugin_deinit(void *) { return 0; } + +/* Get the string value in the dd table's option "__hlindexes__". +@param[in] dd_table the dd table +@param[out] hlindexes the value of the option "__hlindexes__" */ +static inline void dd_table_get_hlindexes(const dd::Table *dd_table, + dd::String_type *hlindexes) { + assert(hlindexes != nullptr); + assert(dd_table_has_hlindexes(dd_table)); + + dd_table->options().get("__hlindexes__", hlindexes); + assert(!hlindexes->empty()); +} + +/* Set the string value in the dd table's option "__hlindexes__". +@param[in] dd_table the dd table +@param[in] hlindexes the value of the option "__hlindexes__" */ +static inline void dd_table_set_hlindexes(dd::Table *dd_table, + dd::String_type hlindexes) { + dd_table->options().set("__hlindexes__", hlindexes); +} + +static inline uint get_tref_len(TABLE *table) { + assert(table->s->keys == 0 || + strcmp(table->key_info[0].name, primary_key_name) != 0 || + table->key_info[0].flags & HA_NOSAME); + + return (table->s->keys == 0 || + strcmp(table->key_info[0].name, primary_key_name) != 0) + ? DATA_ROW_ID_LEN + : table->key_info[0].key_length; +} + +static const char *build_name(THD *thd, const uint64_t base, const uint num, + std::string &error_message) { + /* The length of vector index table name should be shorter than 64 because + the `name` of `tables` is varchar(64). See also Tables::Tables() in + sql/dd/impl/tables/tables.cc */ + static_assert(VIDX_NAME_LEN <= 64); + + char *name = reinterpret_cast(thd->mem_root->Alloc(VIDX_NAME_LEN)); + + if (name == nullptr) { + error_message = "Failed to allocate memory for table name."; + } else { + snprintf(name, VIDX_NAME_LEN, VIDX_NAME, base, num); + } + + return reinterpret_cast(name); +} + +static bool request_mdl_lock(THD *thd, const char *db_name, + const char *table_name, enum_mdl_type mdl_type, + enum_mdl_duration lock_duration, + std::string &error_message, + MDL_request *mdl_request = nullptr) { + if (mdl_request == nullptr) { + mdl_request = new (thd->mem_root) MDL_request; + + if (mdl_request == nullptr) { + error_message = "Failed to allocate memory for mdl_request."; + return true; + } + } + + MDL_REQUEST_INIT(mdl_request, MDL_key::TABLE, db_name, table_name, mdl_type, + lock_duration); + if (thd->mdl_context.acquire_lock(mdl_request, + thd->variables.lock_wait_timeout)) { + error_message = "Failed to acquire DML lock."; + return true; + } + + return false; +} + +static const dd::Table *open_hlindex_dd(THD *thd, const char *hlindex_name, + const char *db_name, + std::string &error_message) { + /* Acquire the dd table */ + const dd::Table *hlindex_dd = nullptr; + dd::cache::Dictionary_client::Auto_releaser releaser(thd->dd_client()); + + if (thd->dd_client()->acquire(db_name, hlindex_name, &hlindex_dd)) { + error_message = "Failed to acquire vector dd table."; + return nullptr; + } + + if (hlindex_dd == nullptr || !dd_table_is_hlindex(hlindex_dd)) { + assert(false); + + error_message = "Can't find vector table in dd."; + return nullptr; + } + + assert(hlindex_dd->hidden() == dd::Abstract_table::HT_HIDDEN_HLINDEX || + hlindex_dd->hidden() == dd::Abstract_table::HT_HIDDEN_DDL); + assert(dd_table_is_hlindex(hlindex_dd)); + + return hlindex_dd; +} + +static std::string sql_regex_replacement( + const std::string &sql, const std::regex &pattern, + std::string (*replacement)(const std::string &)) { + std::string result; + size_t last_pos = 0; + std::sregex_iterator end; + + for (std::sregex_iterator it(sql.begin(), sql.end(), pattern); it != end; + ++it) { + std::smatch match = *it; + if (!match[1].matched) break; + + result += sql.substr(last_pos, match.position() - last_pos); + result += replacement(match[1].str()); + last_pos = match.position() + match.length(); + } + + if (last_pos == 0) { + /* No match */ + return sql; + } + + return result + sql.substr(last_pos); +} + +static void rewrite_sql(THD *thd, const std::string &result) { + /* Reset the thd's query string */ + char *new_query = + strmake_root(thd->mem_root, result.c_str(), result.length()); + + if (new_query == nullptr) { + my_error(ER_DA_OOM, MYF(0)); + assert(false); + + return; + } + + thd->set_query(new_query, strlen(new_query)); +} + +static std::string replacement_vector(const std::string &catching) { + return std::string(RDS_COMMENT_VIDX_START "vector(") + catching + + std::string(")" RDS_COMMENT_VIDX_END " varbinary(") + + std::to_string(4 * stoi(catching)) + std::string(")"); +} + +// Rewrite the sql string. Replace vector(X) to +// /*!99999 vector(X) */ varbinary(4 * X) +// But avoid double replacement like: +// /*!99999 vector(X) */ varbinary(4 * X) => +// /*!99999 /*!99999 vector(X) */ varbinary(4 * X) */ varbinary(4 * X) +static void rewrite_sql_of_vector_column(THD *thd) { + /* Don't use '\b' after '\)' because it will not match space. */ + /* First check if the query already contains the processed format */ + std::string query_str = to_string(thd->query()); + + /* Pattern to match already processed vector declarations */ + std::regex processed_pattern( + R"(/\*!99999 vector\(\d+\) \*/ varbinary\(\d+\))"); + + /* If not contain processed format, process the query */ + if (!std::regex_search(query_str, processed_pattern)) { + rewrite_sql( + thd, sql_regex_replacement(query_str, + std::regex{R"(\bvector\s*\(\s*(\d+)\s*\))", + std::regex_constants::icase}, + replacement_vector)); + } + + thd->m_query_has_vector_column = false; + /* TODO: There is little possible that user use vector(x) as the name of + table or other objects. */ +} + +/* Check if in one ddl query, other operations is performed while alter a +vector index. there are 3 results: +0: alter vector index, and there are other operations performed in one query. + --> set my_error and return true. +1: alter vector index, and there are not other operations performed. + --> Replace the whole query string to be inside comment with version 99999. +2: not alter vector index, thus the keywords of vector column must be parsed. + --> rewrite the keywords of vector column in the query. +*/ +static uint check_alter_vector_ddl(THD *thd, Alter_info *alter_info, + const uint key_count, + const uint old_key_count, KEY *old_vidx, + KEY *new_vidx) { + assert(old_vidx == nullptr || old_vidx->flags & HA_VECTOR); + assert(new_vidx == nullptr || new_vidx->flags & HA_VECTOR); + + if (old_vidx == nullptr) { + assert(new_vidx != nullptr); + + if (alter_info->flags == Alter_info::ALTER_ADD_INDEX) { + /* ADD a vector index. */ + assert(!thd->m_query_has_vector_column); + assert(key_count > old_key_count); + + if ((key_count - old_key_count) == 1) { + /* There are not other operations performed. */ + return 1; + } + } + } else if (new_vidx == nullptr) { + assert(old_vidx != nullptr); + + if (alter_info->flags == Alter_info::ALTER_DROP_INDEX) { + /* DROP a vector index. */ + assert(!thd->m_query_has_vector_column); + assert(old_key_count > key_count); + + if ((old_key_count - key_count) == 1) { + /* There are not other operations performed. */ + return 1; + } + } + } else if (my_strcasecmp(system_charset_info, new_vidx->name, + old_vidx->name) != 0) { + /* RENAME a vector index. */ + if (alter_info->flags == Alter_info::ALTER_RENAME_INDEX && + alter_info->alter_rename_key_list.size() == 1) { + /* There are not other operations performed. */ + assert(!thd->m_query_has_vector_column); + assert(my_strcasecmp(system_charset_info, + alter_info->alter_rename_key_list[0]->old_name, + old_vidx->name) == 0); + assert(my_strcasecmp(system_charset_info, + alter_info->alter_rename_key_list[0]->new_name, + new_vidx->name) == 0); + + return 1; + } + } else { + /* The vector index is not modified. */ + /* Attention, ALTER_INDEX_VISIBILITY is not supported for the vector index. + */ + return 2; + } + + /* There are other operations performed with the vector index in the same + ddl query. */ + return 0; +} + +/* Return true if the vector field in the rec is NULL. +Otherwise, return false. */ +static bool check_vector_is_null(TABLE *table, const uchar *rec, KEY *vec_key) { + const ptrdiff_t offset = rec - table->record[0]; + Field *field = vec_key->key_part->field; + + assert(field->is_vector()); + + return field->is_real_null(offset); +} + +/* -------------------- External Functions Definition -------------------- */ +bool check_vector_ddl_and_rewrite_sql(THD *thd, Alter_info *alter_info, + KEY *key_info, const uint key_count, + TABLE *table) { + KEY *old_vidx = table->s->get_vec_key(); + KEY *new_vidx = nullptr; + + if (key_count > 0 && vidx::key_is_vector(key_info + key_count - 1)) { + /* key_info is already sorted in mysql_prepare_create_table() */ + new_vidx = key_info + key_count - 1; + } + + if (old_vidx == nullptr && new_vidx == nullptr) { + rewrite_vector_column: + if (thd->m_query_has_vector_column) { + rewrite_sql_of_vector_column(thd); + } + + return false; + } + + switch (check_alter_vector_ddl(thd, alter_info, key_count, + table->s->total_keys, old_vidx, new_vidx)) { + case 1: + /* The DDL query only alter the vector index. */ + rewrite_sql(thd, RDS_COMMENT_VIDX_START + to_string(thd->query()) + + RDS_COMMENT_VIDX_END); + return false; + + case 2: + /* The DDL query does not alter the vector index. */ + goto rewrite_vector_column; + + default: + assert(0); + [[fallthrough]]; + + case 0: + /* The DDL query not only alter the vector index, which is not + supported yet. */ + my_error(ER_NOT_SUPPORTED_YET, MYF(0), + "perform other operations while alter a vector index"); + return true; + } +} + +namespace hnsw { +uint get_ef_search(THD *thd) { return THDVAR(thd, hnsw_ef_search); } + +uint index_options_print(const uint distance, const uint m, char *buf, + uint buf_len) { + assert(validate_index_option_distance(distance)); + assert(validate_index_option_m(m)); + + uint len = snprintf(buf, buf_len, " M=%d DISTANCE=%s" RDS_COMMENT_VIDX_END, m, + distance_names[distance]); + + if (len >= buf_len) { + return buf_len - 1; + } + + return len; +} + +bool copy_index_option_m(THD *thd, uint *to, const uint from) { + if (from == UINT_MAX) { + /* distance is not set. */ + *to = THDVAR(thd, hnsw_default_m); + return false; + } + + if (!validate_index_option_m(from)) { + return true; + } + + *to = from; + return false; +} +} // namespace hnsw + +bool copy_index_option_distance(THD *thd, uint *to, const uint from) { + if (from == UINT_MAX) { + /* distance is not set. */ + *to = THDVAR(thd, default_distance); + return false; + } + + assert(validate_index_option_distance(from)); + + *to = from; + return false; +} + +bool create_table(THD *thd, KEY *key, dd::Table *dd_table, TABLE *table, + const char *db_name, const uint64_t old_table_id) { + assert(key_is_vector(key)); + assert(dd_table->engine() == "InnoDB"); + + std::string error_message; + + /* 1. Build table name and path */ + const char *hlindex_name = + build_name(thd, dd_table->se_private_id(), vidx_num, error_message); + if (hlindex_name == nullptr) { + error_end: + my_error(ER_VECTOR_INDEX_FAILED, MYF(0), + thd_sql_command(thd) == SQLCOM_TRUNCATE ? "Truncate" : "Create", + key->name, db_name, dd_table->name().c_str(), + (hlindex_name == nullptr ? "?" : hlindex_name), + error_message.c_str()); + return true; + } + + char path[FN_REFLEN + 1]; + bool was_truncated; + build_table_filename(path, sizeof(path) - 1 - reg_ext_length, db_name, + hlindex_name, "", 0, &was_truncated); + // Check truncation, will lead to overflow when adding extension + if (was_truncated) { + my_error(ER_IDENT_CAUSES_TOO_LONG_PATH, MYF(0), sizeof(path) - 1, path); + return true; + } + + DBUG_EXECUTE_IF("crash_before_vidx_ddl", DBUG_SUICIDE();); + DBUG_EXECUTE_IF("failed_before_vidx_ddl", { + error_message = "debug failed before vidx ddl."; + goto error_end; + }); + + /* 2. Request MDL X lock */ + if (request_mdl_lock(thd, db_name, hlindex_name, MDL_EXCLUSIVE, + MDL_TRANSACTION, error_message)) { + goto error_end; + } + + /* 3. Check if the hlindex name exists. */ + bool exists; + if (dd::table_exists(thd->dd_client(), db_name, hlindex_name, &exists)) { + return true; // Error is already reported. + } + + if (!exists && + ha_check_if_table_exists(thd, db_name, hlindex_name, &exists)) { + /* Table doesn't exist. Check if some engine can provide it. */ + my_printf_error(ER_OUT_OF_RESOURCES, + "Failed to open '%-.64s', error while " + "unpacking from engine", + MYF(0), hlindex_name); + return true; + } + + if (exists) { + error_message = "Vector table name exists."; + goto error_end; + } + + if (old_table_id == dd::INVALID_OBJECT_ID) { + /* CREATE TABLE */ + /* 4. Create dd table and store it */ + std::unique_ptr hlindex_dd_ptr = hnsw::create_dd_table( + thd, hlindex_name, key, dd_table, table, db_name, get_tref_len(table)); + + if (!hlindex_dd_ptr) { + return true; // Error is already reported. + } + + if (thd->dd_client()->store(hlindex_dd_ptr.get())) { + error_message = "Failed to store vector dd table."; + goto error_end; + } + } else { + /* TRUNCATE TABLE */ + assert(old_table_id != dd_table->se_private_id()); + + /* 4. Rename old table. */ + dd::cache::Dictionary_client::Auto_releaser releaser(thd->dd_client()); + const dd::Schema *schema = nullptr; + if (thd->dd_client()->acquire(db_name, &schema) || schema == nullptr) { + error_message = "Failed to acquire schema."; + goto error_end; + } + + const char *old_name = + build_name(thd, old_table_id, vidx_num, error_message); + if (old_name == nullptr || + request_mdl_lock(thd, db_name, old_name, MDL_EXCLUSIVE, MDL_TRANSACTION, + error_message)) { + goto error_end; + } + + if (mysql_rename_table(thd, table->file->ht, db_name, old_name, db_name, + old_name, *schema, db_name, hlindex_name, + NO_DD_COMMIT | VIDX_RENAME)) { + return true; + } + } + + /* 5. Get dd table. */ + dd::Table *hlindex_dd = nullptr; + + if (thd->dd_client()->acquire_for_modification(db_name, hlindex_name, + &hlindex_dd) || + hlindex_dd == nullptr) { + error_message = "Failed to acquire_for_modification vector dd table."; + goto error_end; + } + + if (!dd_table_is_hlindex(hlindex_dd)) { + error_message = "hlindex's name may be used by other tables."; + goto error_end; + } + + /* 6. Create table */ + HA_CREATE_INFO unused; + if (ha_create_table(thd, path, db_name, hlindex_name, &unused, true, false, + hlindex_dd) != 0) { + return true; // Error is already reported. + } + + /* 7. Update dd table */ + if (thd->dd_client()->update(hlindex_dd)) { + error_message = "Failed to update vector dd table."; + goto error_end; + } + + /* 8. Set hlindexes name of base dd table */ + vidx::dd_table_set_hlindexes(dd_table, key->name); + + return false; +} + +bool delete_table(THD *thd, const dd::Table *dd_table, const char *db_name) { + assert(dd_table_has_hlindexes(dd_table)); + assert(dd_table->engine() == "InnoDB"); + + std::string error_message; + + /* 1. Build name and path. */ + const char *hlindex_name = + build_name(thd, dd_table->se_private_id(), vidx_num, error_message); + if (hlindex_name == nullptr) { + error_end: + dd::String_type key_name; + dd_table_get_hlindexes(dd_table, &key_name); + + my_error(ER_VECTOR_INDEX_FAILED, MYF(0), "Drop", key_name.c_str(), db_name, + dd_table->name().c_str(), + (hlindex_name == nullptr ? "?" : hlindex_name), + error_message.c_str()); + return true; + } + + char path[FN_REFLEN + 1]; + bool was_truncated; + build_table_filename(path, sizeof(path) - 1 - reg_ext_length, db_name, + hlindex_name, "", 0, &was_truncated); + // Check truncation, will lead to overflow when adding extension + if (was_truncated) { + my_error(ER_IDENT_CAUSES_TOO_LONG_PATH, MYF(0), sizeof(path) - 1, path); + return true; + } + + DBUG_EXECUTE_IF("crash_before_vidx_ddl", DBUG_SUICIDE();); + DBUG_EXECUTE_IF("failed_before_vidx_ddl", { + error_message = "debug failed before vidx ddl."; + goto error_end; + }); + + /* 2. Acquire the dd table with X mdl. */ + if (request_mdl_lock(thd, db_name, hlindex_name, MDL_EXCLUSIVE, + MDL_TRANSACTION, error_message)) { + goto error_end; + } + + const dd::Table *hlindex_dd = + open_hlindex_dd(thd, hlindex_name, db_name, error_message); + + if (hlindex_dd == nullptr) { + goto error_end; + } + + /* 3. Drop table */ + handlerton *hton{nullptr}; + + if (dd::table_storage_engine(thd, hlindex_dd, &hton)) { + return true; + } + + if (ha_delete_table(thd, hton, path, db_name, hlindex_name, hlindex_dd, + false)) { + return true; + } + + /* 4. remove the "__hlindexes__" option in base dd table. The base dd + table may be used later in acquire_uncached_table() to build the base + table share */ + ((dd::Table *)dd_table)->options().remove("__hlindexes__"); + + /* 5. Drop dd table */ + return dd::drop_table(thd, db_name, hlindex_name, *hlindex_dd); +} + +bool rename_table(THD *thd, dd::Table *dd_table, handlerton *base, + const dd::Schema &new_schema, const char *old_db, + const char *new_db, uint flags) { + assert(dd_table_has_hlindexes(dd_table)); + assert(dd_table->engine() == "InnoDB"); + + std::string error_message; + + /* 1. Build table name */ + const char *hlindex_name = + build_name(thd, dd_table->se_private_id(), vidx_num, error_message); + + if (hlindex_name == nullptr) { + error_end: + dd::String_type key_name; + dd_table_get_hlindexes(dd_table, &key_name); + + my_error(ER_VECTOR_INDEX_FAILED, MYF(0), "Rename", key_name.c_str(), new_db, + dd_table->name().c_str(), + (hlindex_name == nullptr ? "?" : hlindex_name), + error_message.c_str()); + return true; + } + + DBUG_EXECUTE_IF("crash_before_vidx_ddl", DBUG_SUICIDE();); + DBUG_EXECUTE_IF("failed_before_vidx_ddl", { + error_message = "debug failed before vidx ddl."; + goto error_end; + }); + + /* 2. Request MDL X lock */ + if (request_mdl_lock(thd, new_db, hlindex_name, MDL_EXCLUSIVE, + MDL_TRANSACTION, error_message) || + request_mdl_lock(thd, old_db, hlindex_name, MDL_EXCLUSIVE, + MDL_TRANSACTION, error_message)) { + goto error_end; + } + + /* 3. Rename table */ + return mysql_rename_table(thd, base, old_db, hlindex_name, old_db, + hlindex_name, new_schema, new_db, hlindex_name, + flags | VIDX_RENAME); +} + +bool build_hlindex_key(THD *thd, TABLE_SHARE *table_share, + const dd::Table *dd_table, const uint nr) { + assert(dd_table_has_hlindexes(dd_table)); + assert(table_share->hlindex == nullptr); + assert(table_share->hlindex_data == nullptr); + assert(table_share->hlindexes() == 1); + assert(nr == table_share->keys); + + std::string error_message; + + /* 1. Build name. */ + dd::String_type key_name; + dd_table_get_hlindexes(dd_table, &key_name); + + const char *hlindex_name = + build_name(thd, dd_table->se_private_id(), vidx_num, error_message); + if (hlindex_name == nullptr) { + error_end: + my_error(ER_VECTOR_INDEX_FAILED, MYF(0), "Show", key_name.c_str(), + table_share->db.str, table_share->table_name.str, + (hlindex_name == nullptr ? "?" : hlindex_name), + error_message.c_str()); + return true; + } + + /* 2. Acquire the dd table with S mdl. */ + MDL_request mdl_request; + if (request_mdl_lock(thd, table_share->db.str, hlindex_name, MDL_SHARED, + MDL_EXPLICIT, error_message, &mdl_request)) { + goto error_end; + } + + Scope_guard guard{[thd, &mdl_request]() { + if (mdl_request.ticket != nullptr) dd::release_mdl(thd, mdl_request.ticket); + }}; + + const dd::Table *hlindex_dd = + open_hlindex_dd(thd, hlindex_name, table_share->db.str, error_message); + + if (hlindex_dd == nullptr) { + goto error_end; + } + + /* 3. Build the key info. Do fill_index_from_dd() and + fill_index_elements_from_dd(). */ + KEY *vec_key = &(table_share->key_info[nr]); + KEY_PART_INFO *key_part = vec_key->key_part; + MEM_ROOT *mem_root = &(table_share->mem_root); + + /* Don't assert table_share is not temp table, because the vector index may be + in a temp table during the copy ddl. */ + + vec_key->flags = HA_VECTOR; + vec_key->name = + strmake_root(mem_root, key_name.c_str(), key_name.length() + 1); + vec_key->algorithm = HA_KEY_ALG_BTREE; + vec_key->is_algorithm_explicit = false; + vec_key->is_visible = true; + vec_key->user_defined_key_parts = 1; + vec_key->parser = nullptr; + vec_key->engine_attribute.length = 0; + vec_key->engine_attribute.str = nullptr; + vec_key->secondary_engine_attribute.length = 0; + vec_key->secondary_engine_attribute.str = nullptr; + + dd::String_type comment = hlindex_dd->comment(); + if (comment.length() > 0) { + vec_key->comment.length = comment.length(); + vec_key->comment.str = + strmake_root(mem_root, comment.c_str(), comment.length() + 1); + vec_key->flags |= HA_USES_COMMENT; + } else { + vec_key->comment.length = 0; + } + + hlindex_dd->options().get("__vector_m__", &(vec_key->vector_m)); + hlindex_dd->options().get("__vector_distance__", &(vec_key->vector_distance)); + hlindex_dd->options().get("__vector_column__", &(key_part->fieldnr)); + Field *field = key_part->field = table_share->field[key_part->fieldnr - 1]; + key_part->key_part_flag = 0; + key_part->length = field->key_length(); + key_part->offset = field->offset(table_share->default_values); + key_part->type = field->key_type(); + key_part->bin_cmp = ((field->real_type() != MYSQL_TYPE_VARCHAR && + field->real_type() != MYSQL_TYPE_STRING) || + (field->charset()->state & MY_CS_BINSORT)); + + vec_key->key_length = key_part->length; + table_share->keynames.type_names[nr] = vec_key->name; + table_share->keys_in_use.set_bit(nr); + table_share->visible_indexes.set_bit(nr); + + return false; +} + +bool test_if_cheaper_vector_ordering(JOIN_TAB *tab, ORDER *order, ha_rows limit, + int *order_idx) { + if (order == nullptr || order->next != nullptr || + order->direction != ORDER_ASC || + !is_function_of_type(*order->item, Item_func::VECTOR_DISTANCE_FUNC)) { + return false; + } + + Item_func_vec_distance *item = + down_cast(*order->item); + int item_idx = item->get_key(); + ha_rows rows; + + if (item_idx == -1) { + /* args in function are not one vector column and one const value. */ + return false; + } + + assert(item_idx >= 0); + assert((uint)item_idx >= tab->table()->s->keys); + assert((uint)item_idx < tab->table()->s->total_keys); + + if (tab->table()->force_index_order) { + /* Handle the hint about force index. */ + if (tab->table()->keys_in_use_for_order_by.is_set(item_idx)) { + if (limit == HA_POS_ERROR || limit > tab->table()->file->stats.records) { + limit = tab->table()->file->stats.records; + } + + goto use_vector_index; + } else { + return false; + } + } + + if (limit == HA_POS_ERROR && limit >= tab->table()->file->stats.records) { + return false; + } + + switch (tab->type()) { + case JT_RANGE: + rows = tab->range_scan()->num_output_rows(); + break; + + case JT_ALL: + case JT_INDEX_SCAN: + rows = tab->table()->file->stats.records; + break; + + default: + return false; + } + + static_assert(SCAN_COST > 1); + + if (tab->index() == 0) { + /* PRIMARY index scanning vs vector index scanning */ + if (limit > rows / SCAN_COST) { + return false; + } + } else if (limit >= rows) { + /* Secondary index scanning vs vector index scanning */ + return false; + } + +use_vector_index: + assert(limit <= tab->table()->file->stats.records); + assert(limit != HA_POS_ERROR); + + *order_idx = item_idx; + item->set_limit(limit); + + tab->set_type(JT_INDEX_SCAN); + tab->ref().key = item_idx; + tab->ref().key_parts = 0; + tab->set_index(item_idx); + tab->set_vec_func(item); + + return true; +} +} // namespace vidx + +using namespace vidx; +using namespace vidx::hnsw; + +int TABLE::hlindex_open(uint nr) { + assert(s->hlindexes() == 1); + assert(nr == s->keys); + + if (in_use->tx_isolation != ISO_READ_COMMITTED) { + my_error(ER_NOT_SUPPORTED_YET, MYF(0), + "other transaction isolation levels except READ COMMITTED for the " + "vector index"); + return 1; + } + + if (hlindex == nullptr) { + std::string error_message; + KEY *vec_key = s->key_info + nr; + char path[FN_REFLEN + 1]; + + /* 1.Build name. */ + const char *hlindex_name = + build_name(in_use, s->m_se_private_id, vidx_num, error_message); + + if (hlindex_name == nullptr) { + error_end: + assert(0); + my_error(ER_VECTOR_INDEX_FAILED, MYF(0), "Open", vec_key->name, s->db.str, + s->table_name.str, + (hlindex_name == nullptr ? "?" : hlindex_name), + error_message.c_str()); + return 1; + } + + /* 2. Acquire the dd table with S mdl. */ + if (request_mdl_lock(in_use, s->db.str, hlindex_name, MDL_SHARED_READ, + MDL_TRANSACTION, error_message)) { + goto error_end; + } + + const dd::Table *hlindex_dd = + open_hlindex_dd(in_use, hlindex_name, s->db.str, error_message); + + if (hlindex_dd == nullptr) { + goto error_end; + } + + /* 3. Open the shared hlindex */ + s->lock_share(); + Scope_guard guard{[this]() { s->unlock_share(); }}; + + if (s->hlindex == nullptr) { + /* Build the table key. */ + MDL_key dml_key{MDL_key::TABLE, s->db.str, hlindex_name}; + size_t key_length = dml_key.length() - 1; + const char *key = (const char *)dml_key.ptr() + 1; + + /* Open the table hlindex */ + if (s->tmp_table != NO_TMP_TABLE) { + /* Base table is temp. */ + bool was_truncated; + build_table_filename(path, sizeof(path) - 1 - reg_ext_length, s->db.str, + hlindex_name, "", 0, &was_truncated); + + s->hlindex = reinterpret_cast( + in_use->mem_root->Alloc(sizeof(TABLE_SHARE))); + + init_tmp_table_share(in_use, s->hlindex, key, key_length, + strend(key) + 1, path, nullptr); + } else if ((s->hlindex = alloc_table_share(s->db.str, hlindex_name, key, + key_length, false)) == + nullptr) { + /* Base table is normal. */ + error_message = "Failed to alloc_table_share."; + goto error_end; + } + + if (open_table_def(in_use, s->hlindex, *hlindex_dd)) { + error_message = "Failed to open_table_def."; + goto error_end; + } + + s->hlindex->is_hlindex = true; + + assert(s->hlindex->hlindex_data == nullptr); + assert(s->hlindex->hlindex == nullptr); + } + + /* 4. Open a new hlindex */ + hlindex = + (TABLE *)my_malloc(key_memory_TABLE, sizeof(*hlindex), MYF(MY_WME)); + + if (hlindex == nullptr) { + error_message = "Failed to my_malloc hlindex table."; + goto error_end; + } + + if (s->hlindex->tmp_table == NO_TMP_TABLE) { + mysql_mutex_lock(&LOCK_open); + s->hlindex->increment_ref_count(); + mysql_mutex_unlock(&LOCK_open); + } + + int error = open_table_from_share(in_use, s->hlindex, hlindex_name, + (uint)(HA_OPEN_KEYFILE | HA_OPEN_RNDFILE | + HA_GET_INDEX | HA_TRY_READ_ONLY), + EXTRA_RECORD, in_use->open_options, + hlindex, false, hlindex_dd); + + if (error != 0 || hlindex == nullptr) { + error_message = "Failed to open_table_from_share."; + goto error_end; + } + + hlindex->in_use = nullptr; + } + + return 0; +} + +int TABLE::hlindex_lock(uint nr [[maybe_unused]]) { + assert(s->hlindexes() == 1); + assert(nr == s->keys); + assert(hlindex); + + if (hlindex->in_use != in_use) { + hlindex->file->rebind_psi(); + hlindex->file->ha_extra(HA_EXTRA_RESET_STATE); + + hlindex->reset(); + hlindex->set_created(); + hlindex->use_all_columns(); + + /* mark in use for this query */ + hlindex->in_use = in_use; + /* use the main table's lock_descriptor. */ + hlindex->pos_in_table_list = pos_in_table_list; + + assert(hlindex->file->lock_count() <= 1); + + return hlindex->file->ha_external_lock( + in_use, reginfo.lock_type < TL_WRITE_ALLOW_WRITE ? F_RDLCK : F_WRLCK); + } + + return 0; +} + +int TABLE::reset_hlindexes() { + if (hlindex && hlindex->in_use) { + hlindex->in_use = nullptr; + hlindex->pos_in_table_list = nullptr; + } + + return 0; +} + +int TABLE::hlindexes_on_insert() { + assert(s->hlindexes() == 1 || s->hlindexes() == 0); + + for (uint key = s->keys; key < s->total_keys; key++) { + if (vidx::check_vector_is_null(this, record[0], key_info + key)) { + continue; + } + + int err; + + if ((err = hlindex_open(key)) || (err = hlindex_lock(key)) || + (err = mhnsw_insert(this, key_info + key))) { + return err; + } + } + + return 0; +} + +int TABLE::hlindexes_on_update() { + assert(s->hlindexes() == 1 || s->hlindexes() == 0); + + for (uint key = s->keys; key < s->total_keys; key++) { + const bool old_is_null = + vidx::check_vector_is_null(this, record[1], key_info + key); + const bool new_is_null = + vidx::check_vector_is_null(this, record[0], key_info + key); + + if (old_is_null && new_is_null) { + continue; + } + + // TODO: if tref and vector are not changed, update should be all skipped. + + int err; + + if ((err = hlindex_open(key)) || (err = hlindex_lock(key)) || + (err = old_is_null + ? 0 + : mhnsw_invalidate(this, record[1], key_info + key)) || + (err = new_is_null ? 0 : mhnsw_insert(this, key_info + key))) { + return err; + } + } + + return 0; +} + +int TABLE::hlindexes_on_delete(const uchar *buf) { + assert(s->hlindexes() == 1 || s->hlindexes() == 0); + assert(buf == record[0] || buf == record[1]); // note: REPLACE + + for (uint key = s->keys; key < s->total_keys; key++) { + if (vidx::check_vector_is_null(this, buf, key_info + key)) { + continue; + } + + int err; + + if ((err = hlindex_open(key)) || (err = hlindex_lock(key)) || + (err = mhnsw_invalidate(this, buf, key_info + key))) { + return err; + } + } + + return 0; +} + +int TABLE::hlindexes_on_delete_all() { + assert(s->hlindexes() == 1 || s->hlindexes() == 0); + + for (uint key = s->keys; key < s->total_keys; key++) { + int err; + + if ((err = hlindex_open(key)) || (err = hlindex_lock(key)) || + (err = mhnsw_delete_all(this, key_info + key))) { + return err; + } + } + + return 0; +} + +int TABLE::hlindex_read_first(uint key, void *item) { + assert(s->hlindexes() == 1); + assert(key == s->keys); + + int err; + + if ((err = hlindex_open(key)) || (err = hlindex_lock(key)) || + (err = mhnsw_read_first(this, key_info + key, (Item *)item))) { + return err; + } + + return 0; +} + +int TABLE::hlindex_read_next() { return mhnsw_read_next(this); } + +int TABLE::hlindex_read_end() { return mhnsw_read_end(this); } + +mysql_declare_plugin(vidx){ + MYSQL_DAEMON_PLUGIN, + &vidx::daemon, + "vidx", + "AliCloud", + "A plugin for vector index algorithm", /* Plugin name */ + PLUGIN_LICENSE_GPL, + vidx::plugin_init, /* Plugin Init */ + nullptr, + vidx::plugin_deinit, /* Plugin Deinit */ + 0x0100, /* Plugin Version: major.minor */ + nullptr, /* status variables */ + vidx::sys_vars, /* system variables */ + nullptr, /* config options */ + 0, /* flags */ +} mysql_declare_plugin_end; diff --git a/storage/innobase/dict/dict0dd.cc b/storage/innobase/dict/dict0dd.cc index b87e4963e51..f0a64836e95 100644 --- a/storage/innobase/dict/dict0dd.cc +++ b/storage/innobase/dict/dict0dd.cc @@ -80,6 +80,9 @@ Data dictionary interface */ #include "univ.i" // Using OS_PATH_SEPARATOR #endif /* !UNIV_HOTBACKUP */ +#include "vidx/vidx_index.h" +static_assert(DATA_ROW_ID_LEN == vidx::DATA_ROW_ID_LEN); + const char *DD_instant_col_val_coder::encode(const byte *stream, size_t in_len, size_t *out_len) { cleanup(); @@ -337,25 +340,26 @@ int acquire_uncached_table(THD *thd, dd::cache::Dictionary_client *client, TABLE_SHARE *ts, TABLE *td) { int error = 0; dd::Schema *schema; - const char *table_cache_key; - size_t table_cache_key_len; + const char *db_name_ptr; + char db_name[NAME_LEN + 1]; if (name != nullptr) { schema = nullptr; - table_cache_key = name; - table_cache_key_len = dict_get_db_name_len(name); + size_t db_name_len = dict_get_db_name_len(name); + strncpy(db_name, name, db_name_len); + db_name[db_name_len] = '\0'; + db_name_ptr = db_name; } else { error = client->acquire_uncached(dd_table->schema_id(), &schema); if (error != 0) { return (error); } - table_cache_key = schema->name().c_str(); - table_cache_key_len = schema->name().size(); + db_name_ptr = schema->name().c_str(); } - init_tmp_table_share(thd, ts, table_cache_key, table_cache_key_len, - dd_table->name().c_str(), "" /* file name */, nullptr); + init_tmp_table_share(thd, ts, db_name_ptr, 0, dd_table->name().c_str(), + "" /* file name */, nullptr); error = open_table_def_suppress_invalid_meta_data(thd, ts, dd_table->table()); diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 8a8fbed02df..806bf18a060 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -10455,6 +10455,9 @@ int ha_innobase::change_active_index( active_index = keynr; + ut_ad(active_index == MAX_KEY || table_share->keys == 0 || + active_index < table_share->keys); + m_prebuilt->index = innobase_get_index(keynr); if (m_prebuilt->index == nullptr) { diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc index 919d2db1d7a..0d11fba2725 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -1692,6 +1692,11 @@ static dberr_t row_insert_for_mysql_using_ins_graph(const byte *mysql_rec, with a latch. */ dict_table_n_rows_inc(table); + /* vidx: Save row id as gref or tref for hlindex table. */ + if (prebuilt->clust_index_was_generated) { + ut_memcpy(prebuilt->row_id, node->row_id_buf, DATA_ROW_ID_LEN); + } + row_update_statistics_if_needed(table); trx->op_info = ""; diff --git a/storage/ndb/plugin/ndb_dd_upgrade_table.cc b/storage/ndb/plugin/ndb_dd_upgrade_table.cc index 2392c627565..bad3834d450 100644 --- a/storage/ndb/plugin/ndb_dd_upgrade_table.cc +++ b/storage/ndb/plugin/ndb_dd_upgrade_table.cc @@ -42,6 +42,9 @@ #include "storage/ndb/plugin/ndb_table_guard.h" #include "storage/ndb/plugin/ndb_thd.h" // get_thd_ndb #include "storage/ndb/plugin/ndb_thd_ndb.h" // Thd_ndb +#ifndef NDEBUG +#include "vidx/vidx_index.h" +#endif /* !NDEBUG */ namespace dd { class Schema; @@ -465,7 +468,7 @@ bool migrate_table_to_dd(THD *thd, Ndb_dd_client *dd_client, thd, schema_name.c_str(), table_name.c_str(), &create_info, &alter_info, file, true, // NDB tables are auto-partitoned. &key_info_buffer, &key_count, &dummy_fk_key_info, &dummy_fk_key_count, - nullptr, 0, nullptr, 0, 0, false /* No FKs here. */)) { + nullptr, 0, nullptr, 0, 0, false /* No FKs or vector keys here. */)) { return false; } @@ -576,6 +579,9 @@ bool migrate_table_to_dd(THD *thd, Ndb_dd_client *dd_client, thd, *schema_def, to_table_name, &create_info, alter_info.create_list, key_info_buffer, key_count, Alter_info::ENABLE, nullptr, 0, nullptr, table.file); + + assert(!vidx::dd_table_has_hlindexes(table_def.get())); + if (!table_def) { thd_ndb->push_warning(ER_DD_ERROR_CREATING_ENTRY, "Error in Creating DD entry for %s.%s", diff --git a/strings/ctype-bin.cc b/strings/ctype-bin.cc index d79c9e4d7d5..810597277c3 100644 --- a/strings/ctype-bin.cc +++ b/strings/ctype-bin.cc @@ -276,9 +276,8 @@ static void my_hash_sort_8bit_bin(const CHARSET_INFO *cs [[maybe_unused]], *nr2 = tmp2; } -static void my_hash_sort_bin(const CHARSET_INFO *cs [[maybe_unused]], - const uchar *key, size_t len, uint64 *nr1, - uint64 *nr2) { +void my_hash_sort_bin(const CHARSET_INFO *cs [[maybe_unused]], const uchar *key, + size_t len, uint64 *nr1, uint64 *nr2) { const uchar *pos = key; uint64 tmp1; uint64 tmp2; diff --git a/wiki/vidx/pic/hnsw.png b/wiki/vidx/pic/hnsw.png new file mode 100644 index 0000000000000000000000000000000000000000..85e2315365cf797f69d3ad730c6024157a8899cc GIT binary patch literal 353523 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


;(-oGLvd@2$1kNgjVALJAFAn z?-_#9?L(8p)!Fbq2O;^zSOWfUSN;V8Px3jYEReFZ07{EfaD%E;DxN4{mm8Ae-A+Hh z5G#IC=vglff0x0&A0Tbq5Bqwlj{IJb?M4865%;}f(^>x&;)l+Yr^;Y3T7d;LR!-}e zv~Qw$N*-)gXoLJfTRAWOJ`_r~y`L6Rj)cY3OJf}WgVuclOPAsgNeE+Knw7o{@`4zY zL{3O$&ev#UqVGWZEtfIJKnYC6^4TUd%~Cy=#(D$*i~A;3U7LRM(jChC@4$Q!!%x;h z1$GOx>gJf4hajF)Q&Y1Vy()py&U?O9!vYRNBaFsvX%Y_3RyB8dR-+`tHUzxT-3TYK zJEp(!XCyl&Q@jF)+MA=1pdE&ImCw-RjS*-lZ4*UFBB;sN=C zq|FEgr=B4Y8~%2@Qy;dWsi&vs6i%28j-vP=KUPdtvAR6@wr~FjY)Br8;44t2F^Qj+ zqTLh{xRcxpOO8Sc9 zd;_ddE>0FyAUWxpvnXl@q^IAFNG23sZ{axuTo+L`7`mk_nYtOQ@7mfuGZKJu`-%p`D tx$893O8!6J`St&O!PLw6zk5U@JXd{qG}T|(-5{TKR9@*|{DHqO{C}lFlal}d literal 0 HcmV?d00001 diff --git a/wiki/vidx/pic/vidx_architecture.png b/wiki/vidx/pic/vidx_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..77b4be02960651e8b1e4bef3aad2cc3cb1f69b6c GIT binary patch literal 5549670 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�YOJU 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

)40JQ*&&$V~KZ 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

8P~nsa9v% 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�h8Bv!4JeDqhE* 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

4_{tUWA?0?x7}74K>GKdQKIWGTQJWQA*)nIi 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

qQ=hHooxZ&%#oAehf?p|q14S#9tKeaY* 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
-~pM0j*4r624~ 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⪙1`PnvZtu2HI0C8( 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