Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions include/my_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,10 +105,11 @@ enum ha_key_alg {
SEs default algorithm for keys in mysql_prepare_create_table().
*/
HA_KEY_ALG_SE_SPECIFIC = 0,
HA_KEY_ALG_BTREE = 1, /* B-tree. */
HA_KEY_ALG_RTREE = 2, /* R-tree, for spatial searches */
HA_KEY_ALG_HASH = 3, /* HASH keys (HEAP, NDB). */
HA_KEY_ALG_FULLTEXT = 4 /* FULLTEXT. */
HA_KEY_ALG_BTREE = 1, /* B-tree. */
HA_KEY_ALG_RTREE = 2, /* R-tree, for spatial searches */
HA_KEY_ALG_HASH = 3, /* HASH keys (HEAP, NDB). */
HA_KEY_ALG_FULLTEXT = 4, /* FULLTEXT. */
HA_KEY_ALG_VECTOR = 5 /* VECTOR. */
};

/* Storage media types */
Expand Down Expand Up @@ -521,14 +522,16 @@ enum ha_base_keytype {
#define HA_USES_COMMENT (1 << 12)
/** Key was automatically created to support Foreign Key constraint. */
#define HA_GENERATED_KEY (1 << 13)
/** Vector key (Percona). */
#define HA_VECTOR (1 << 30)
/** TokuDB CLUSTERING key */
#define HA_CLUSTERING (1 << 31)

/* 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_CLUSTERING)
HA_VECTOR | HA_CLUSTERING)

/** Fulltext index uses [pre]parser */
#define HA_USES_PARSER (1 << 14)
Expand Down Expand Up @@ -845,7 +848,7 @@ is the global server default. */
have been disabled.

The most important parameters set here is records per key on
all indexes. block_size and primary key ref_length.
all indexes. block_size and primar key ref_length.

For each index there is an array of rec_per_key.
As an example if we have an index with three attributes a,b and c
Expand Down
136 changes: 136 additions & 0 deletions mysql-test/suite/percona/r/vector_index_syntax.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
CREATE TABLE t1 (
id BIGINT UNSIGNED PRIMARY KEY,
v1 VECTOR( 1234 ),
VECTOR KEY( v1 ) SECONDARY_ENGINE_ATTRIBUTE '{ "type" : "hnsw", "M" : 6 }'
);
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`id` bigint unsigned NOT NULL,
`v1` vector(1234) DEFAULT NULL,
PRIMARY KEY (`id`),
VECTOR KEY `v1` (`v1`) /*!80021 SECONDARY_ENGINE_ATTRIBUTE '{"M": 6, "type": "hnsw"}' */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
SHOW INDEXES FROM t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Visible Expression
t1 0 PRIMARY 1 id A 0 NULL NULL BTREE YES NULL
t1 1 v1 1 v1 A 0 1 NULL YES VECTOR YES NULL
ALTER TABLE t1 DROP PRIMARY KEY;
ERROR HY000: Vector index can only be created in tables with a BIGINT UNSIGNED primary key.
ALTER TABLE t1 DROP INDEX v1;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`id` bigint unsigned NOT NULL,
`v1` vector(1234) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
SHOW INDEXES FROM t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Visible Expression
t1 0 PRIMARY 1 id A 0 NULL NULL BTREE YES NULL
DROP TABLE t1;
CREATE TABLE t1 (
id BIGINT UNSIGNED PRIMARY KEY,
v1 VECTOR( 1234 )
);
CREATE VECTOR INDEX v1 ON t1( v1 ) SECONDARY_ENGINE_ATTRIBUTE '{ "type" : "hnsw", "M" : 6 }';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`id` bigint unsigned NOT NULL,
`v1` vector(1234) DEFAULT NULL,
PRIMARY KEY (`id`),
VECTOR KEY `v1` (`v1`) /*!80021 SECONDARY_ENGINE_ATTRIBUTE '{"M": 6, "type": "hnsw"}' */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
SHOW INDEXES FROM t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Visible Expression
t1 0 PRIMARY 1 id A 0 NULL NULL BTREE YES NULL
t1 1 v1 1 v1 A 0 1 NULL YES VECTOR YES NULL
ALTER TABLE t1 DROP INDEX v1;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`id` bigint unsigned NOT NULL,
`v1` vector(1234) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
SHOW INDEXES FROM t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Visible Expression
t1 0 PRIMARY 1 id A 0 NULL NULL BTREE YES NULL
DROP TABLE t1;
CREATE TABLE t1 (
id BIGINT UNSIGNED PRIMARY KEY,
v1 VECTOR( 1234 ),
VECTOR KEY( v1 )
);
ERROR HY000: Invalid json attribute, error: "Validation failed for vector index options: type" at pos 1: '#'
CREATE TABLE t1 (
id BIGINT UNSIGNED PRIMARY KEY,
v1 VECTOR( 1234 ),
VECTOR KEY( v1 ) SECONDARY_ENGINE_ATTRIBUTE '{ "type" : "hnsw", "M" : "6" }'
);
ERROR HY000: Invalid json attribute, error: "Validation failed for vector index options: type" at pos 3: '#/M'
CREATE TABLE t1 (
id BIGINT UNSIGNED PRIMARY KEY,
v1 VECTOR( 1234 ),
VECTOR KEY( v1 ) SECONDARY_ENGINE_ATTRIBUTE '{ "type" : "hnsw", "M" : 6.0 }'
);
ERROR HY000: Invalid json attribute, error: "Validation failed for vector index options: type" at pos 3: '#/M'
CREATE TABLE t1 (
id BIGINT UNSIGNED PRIMARY KEY,
v1 VECTOR( 1234 ),
VECTOR KEY( v1 ) SECONDARY_ENGINE_ATTRIBUTE '{ "type" : "hnsw", "M" : [] }'
);
ERROR HY000: Invalid json attribute, error: "Validation failed for vector index options: type" at pos 3: '#/M'
CREATE TABLE t1 (
id BIGINT UNSIGNED PRIMARY KEY,
v1 VECTOR( 1234 ),
VECTOR KEY( v1 ) SECONDARY_ENGINE_ATTRIBUTE '{ "type" : "hnsw", "no such" : "key" }'
);
ERROR HY000: Invalid json attribute, error: "Validation failed for vector index options: additionalProperties" at pos 11: '#/no%20such'
CREATE TABLE t1 (
id BIGINT UNSIGNED PRIMARY KEY,
v1 VECTOR( 1234 ),
VECTOR KEY( v1 ) SECONDARY_ENGINE_ATTRIBUTE '{ "type" : "hnsw", "M" : 6, "no such" : "key" }'
);
ERROR HY000: Invalid json attribute, error: "Validation failed for vector index options: additionalProperties" at pos 11: '#/no%20such'
CREATE TABLE t1 (
id BIGINT UNSIGNED PRIMARY KEY,
v1 VECTOR( 1234 )
);
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`id` bigint unsigned NOT NULL,
`v1` vector(1234) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
CREATE VECTOR INDEX idx_v1 ON t1 (v1) SECONDARY_ENGINE_ATTRIBUTE '{ "type" : "hnsw", "M" : "6" }';
ERROR HY000: Invalid json attribute, error: "Validation failed for vector index options: type" at pos 3: '#/M'
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`id` bigint unsigned NOT NULL,
`v1` vector(1234) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
SHOW INDEXES FROM t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Visible Expression
t1 0 PRIMARY 1 id A 0 NULL NULL BTREE YES NULL
CREATE VECTOR INDEX idx_v1 ON t1 (v1)
SECONDARY_ENGINE_ATTRIBUTE '{ "type" : "hnsw", "M" : 1, "ef_construction" : 2, "max_elements" : 3 }';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`id` bigint unsigned NOT NULL,
`v1` vector(1234) DEFAULT NULL,
PRIMARY KEY (`id`),
VECTOR KEY `idx_v1` (`v1`) /*!80021 SECONDARY_ENGINE_ATTRIBUTE '{"M": 1, "type": "hnsw", "max_elements": 3, "ef_construction": 2}' */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
SHOW INDEXES FROM t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Visible Expression
t1 0 PRIMARY 1 id A 0 NULL NULL BTREE YES NULL
t1 1 idx_v1 1 v1 A 0 1 NULL YES VECTOR YES NULL
ALTER TABLE t1 DROP PRIMARY KEY;
ERROR HY000: Vector index can only be created in tables with a BIGINT UNSIGNED primary key.
DROP TABLE t1;
96 changes: 96 additions & 0 deletions mysql-test/suite/percona/t/vector_index_syntax.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
CREATE TABLE t1 (
id BIGINT UNSIGNED PRIMARY KEY,
v1 VECTOR( 1234 ),
VECTOR KEY( v1 ) SECONDARY_ENGINE_ATTRIBUTE '{ "type" : "hnsw", "M" : 6 }'
);
SHOW CREATE TABLE t1;
SHOW INDEXES FROM t1;

--error ER_VECTOR_INDEX_NEEDS_PK
ALTER TABLE t1 DROP PRIMARY KEY;

ALTER TABLE t1 DROP INDEX v1;
SHOW CREATE TABLE t1;
SHOW INDEXES FROM t1;

DROP TABLE t1;


CREATE TABLE t1 (
id BIGINT UNSIGNED PRIMARY KEY,
v1 VECTOR( 1234 )
);

CREATE VECTOR INDEX v1 ON t1( v1 ) SECONDARY_ENGINE_ATTRIBUTE '{ "type" : "hnsw", "M" : 6 }';
SHOW CREATE TABLE t1;
SHOW INDEXES FROM t1;

ALTER TABLE t1 DROP INDEX v1;
SHOW CREATE TABLE t1;
SHOW INDEXES FROM t1;

DROP TABLE t1;

--error ER_INVALID_JSON_ATTRIBUTE
CREATE TABLE t1 (
id BIGINT UNSIGNED PRIMARY KEY,
v1 VECTOR( 1234 ),
VECTOR KEY( v1 )
);


--error ER_INVALID_JSON_ATTRIBUTE
CREATE TABLE t1 (
id BIGINT UNSIGNED PRIMARY KEY,
v1 VECTOR( 1234 ),
VECTOR KEY( v1 ) SECONDARY_ENGINE_ATTRIBUTE '{ "type" : "hnsw", "M" : "6" }'
);

--error ER_INVALID_JSON_ATTRIBUTE
CREATE TABLE t1 (
id BIGINT UNSIGNED PRIMARY KEY,
v1 VECTOR( 1234 ),
VECTOR KEY( v1 ) SECONDARY_ENGINE_ATTRIBUTE '{ "type" : "hnsw", "M" : 6.0 }'
);

--error ER_INVALID_JSON_ATTRIBUTE
CREATE TABLE t1 (
id BIGINT UNSIGNED PRIMARY KEY,
v1 VECTOR( 1234 ),
VECTOR KEY( v1 ) SECONDARY_ENGINE_ATTRIBUTE '{ "type" : "hnsw", "M" : [] }'
);

--error ER_INVALID_JSON_ATTRIBUTE
CREATE TABLE t1 (
id BIGINT UNSIGNED PRIMARY KEY,
v1 VECTOR( 1234 ),
VECTOR KEY( v1 ) SECONDARY_ENGINE_ATTRIBUTE '{ "type" : "hnsw", "no such" : "key" }'
);

--error ER_INVALID_JSON_ATTRIBUTE
CREATE TABLE t1 (
id BIGINT UNSIGNED PRIMARY KEY,
v1 VECTOR( 1234 ),
VECTOR KEY( v1 ) SECONDARY_ENGINE_ATTRIBUTE '{ "type" : "hnsw", "M" : 6, "no such" : "key" }'
);

CREATE TABLE t1 (
id BIGINT UNSIGNED PRIMARY KEY,
v1 VECTOR( 1234 )
);
SHOW CREATE TABLE t1;

--error ER_INVALID_JSON_ATTRIBUTE
CREATE VECTOR INDEX idx_v1 ON t1 (v1) SECONDARY_ENGINE_ATTRIBUTE '{ "type" : "hnsw", "M" : "6" }';
SHOW CREATE TABLE t1;
SHOW INDEXES FROM t1;

CREATE VECTOR INDEX idx_v1 ON t1 (v1)
SECONDARY_ENGINE_ATTRIBUTE '{ "type" : "hnsw", "M" : 1, "ef_construction" : 2, "max_elements" : 3 }';
SHOW CREATE TABLE t1;
SHOW INDEXES FROM t1;

--error ER_VECTOR_INDEX_NEEDS_PK
ALTER TABLE t1 DROP PRIMARY KEY;

DROP TABLE t1;
6 changes: 6 additions & 0 deletions share/messages_to_clients.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11043,6 +11043,12 @@ ER_LOG_NAME_NOT_MATCHING_SEC_LOG_PATH_CLIENT
# Start of Percona Server 8.4/9.7 error messages to be sent to client
#

ER_VECTOR_INDEX_NEEDS_PK
eng "Vector index can only be created in tables with a BIGINT UNSIGNED primary key."

ER_ONLY_SINGLE_VECTOR_INDEX_ALLOWED
eng "A table can have at most one vector index."

start-error-number 7100

#
Expand Down
8 changes: 3 additions & 5 deletions sql/create_field.cc
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

#include "sql/create_field.h"

#include "field_types.h"
#include "m_string.h"
#include "mysql/strings/dtoa.h"
#include "sql-common/my_decimal.h"
Expand Down Expand Up @@ -774,7 +775,8 @@ size_t Create_field::key_length() const {
case MYSQL_TYPE_JSON:
case MYSQL_TYPE_VAR_STRING:
case MYSQL_TYPE_STRING:
case MYSQL_TYPE_VARCHAR: {
case MYSQL_TYPE_VARCHAR:
case MYSQL_TYPE_VECTOR: {
return std::min(max_display_width_in_bytes(),
static_cast<size_t>(MAX_FIELD_BLOBLENGTH));
}
Expand All @@ -788,10 +790,6 @@ size_t Create_field::key_length() const {
}
return pack_length() + (max_display_width_in_bytes() & 7 ? 1 : 0);
}
/* LCOV_EXCL_START */
case MYSQL_TYPE_VECTOR:
assert(false); // Key on VECTOR type column is not supported.
/* LCOV_EXCL_STOP */
default: {
return pack_length(is_array);
}
Expand Down
6 changes: 6 additions & 0 deletions sql/dd/dd_table.cc
Original file line number Diff line number Diff line change
Expand Up @@ -812,6 +812,9 @@ static dd::Index::enum_index_algorithm dd_get_new_index_algorithm_type(

case HA_KEY_ALG_FULLTEXT:
return dd::Index::IA_FULLTEXT;

case HA_KEY_ALG_VECTOR:
return dd::Index::IA_VECTOR;
}

/* purecov: begin deadcode */
Expand All @@ -823,6 +826,8 @@ static dd::Index::enum_index_algorithm dd_get_new_index_algorithm_type(
}

static dd::Index::enum_index_type dd_get_new_index_type(const KEY *key) {
if (key->flags & HA_VECTOR) return dd::Index::IT_VECTOR;

if (key->flags & HA_FULLTEXT) return dd::Index::IT_FULLTEXT;

if (key->flags & HA_SPATIAL) return dd::Index::IT_SPATIAL;
Expand Down Expand Up @@ -907,6 +912,7 @@ static void fill_dd_index_elements_from_key_parts(
case dd::Index::IT_MULTIPLE:
case dd::Index::IT_FULLTEXT:
case dd::Index::IT_SPATIAL:
case dd::Index::IT_VECTOR:
if (key_part == key_parts)
const_cast<dd::Column *>(key_col_obj)
->set_column_key(dd::Column::CK_MULTIPLE);
Expand Down
6 changes: 4 additions & 2 deletions sql/dd/impl/tables/indexes.cc
Original file line number Diff line number Diff line change
Expand Up @@ -62,15 +62,17 @@ Indexes::Indexes() {
" 'UNIQUE',\n"
" 'MULTIPLE',\n"
" 'FULLTEXT',\n"
" 'SPATIAL'\n"
" 'SPATIAL',\n"
" 'VECTOR'\n"
") NOT NULL");
m_target_def.add_field(FIELD_ALGORITHM, "FIELD_ALGORITHM",
"algorithm ENUM(\n"
" 'SE_SPECIFIC',\n"
" 'BTREE',\n"
" 'RTREE',\n"
" 'HASH',\n"
" 'FULLTEXT'\n"
" 'FULLTEXT',\n"
" 'VECTOR'\n"
") NOT NULL");
m_target_def.add_field(FIELD_IS_ALGORITHM_EXPLICIT,
"FIELD_IS_ALGORITHM_EXPLICIT",
Expand Down
6 changes: 4 additions & 2 deletions sql/dd/types/index.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ class Index : virtual public Entity_object {
IT_UNIQUE,
IT_MULTIPLE,
IT_FULLTEXT,
IT_SPATIAL
IT_SPATIAL,
IT_VECTOR
};

enum enum_index_algorithm // similar to ha_key_alg
Expand All @@ -70,7 +71,8 @@ class Index : virtual public Entity_object {
IA_BTREE,
IA_RTREE,
IA_HASH,
IA_FULLTEXT
IA_FULLTEXT,
IA_VECTOR
};

public:
Expand Down
Loading