To write a user-defined function in MariaDB that calculates cosine similarity between a given vector and a vector stored in a BLOB field, you can use the following code: ``` sql DELIMITER $$ CREATE FUNCTION cosine_similarity(vector VARCHAR(255), blob_field BLOB) RETURNS FLOAT DETERMINISTIC BEGIN -- Deserialize the BLOB field into a vector SET @serialized_vector = blob_field; SET @vector_type = 'float'; -- Change this to 'double' if the vector contains 64-bit values SET @vector_size = LENGTH(@serialized_vector) / (@vector_type_size := IF(@vector_type = 'float', 4, 8)); SET @values = ''; FOR i IN 0..(@vector_size - 1) DO SET @value = SUBSTRING(@serialized_vector, i * @vector_type_size + 1, @vector_type_size); IF @vector_type = 'float' THEN SET @value = CONVERT(@value, FLOAT); ELSE SET @value = CONVERT(@value, DOUBLE); END IF; SET @values = CONCAT(@values, ',', @value); END FOR; SET @vector = CONCAT('[', SUBSTRING(@values, 2), ']'); -- Calculate the cosine similarity SET @dot_product = 0; SET @norm_a = 0; SET @norm_b = 0; FOR i IN 1..JSON_LENGTH(vector) DO SET @a_i = JSON_EXTRACT(vector, CONCAT('$[', i - 1, ']')); SET @b_i = JSON_EXTRACT(@vector, CONCAT('$[', i - 1, ']')); SET @dot_product = @dot_product + @a_i * @b_i; SET @norm_a = @norm_a + @a_i * @a_i; SET @norm_b = @norm_b + @b_i * @b_i; END FOR; SET @similarity = NULLIF(@dot_product / SQRT(@norm_a * @norm_b), 0); RETURN @similarity; END$$ DELIMITER ; ``` This function takes two parameters: a JSON-formatted vector and a BLOB field containing a serialized vector. It deserializes the BLOB field into a vector, and then calculates the cosine similarity between the two vectors using the dot product and unit vectors formula. The function returns the cosine similarity as a floating-point value. To use this function, you can call it like any other SQL function: ``` sql SELECT cosine_similarity('[1, 2, 3]', blob_field) FROM my_table; ```