Skip to content

Commit 20d99f3

Browse files
MDEV-32627 Distinguish between absence of a keyword and empty value for the keyword
Distinguish them in two place: when constructing connection key in create_conn_key and spider_create_conn for both ordinary queries and spider_direct_sql For spider_create_conn and spider_udf_direct_sql_create_conn, the created conn gets assigned a field from the source object if and only if source->field is non-null. For spider_create_conn_keys and spider_udf_direct_sql_create_conn_key, we update the encoding so that absence of keyword and keyword with an empty value result in different keys. More specifically, if the i-th keyword has a value, the corresponding part in the conn key begins with the char \i, followed by the possibly empty value and ends with a \0. If the i-th keyword is not specified, then it does not get a mention in the conn key. As part of this change, we also update table param / option parsing to recognise a singleton empty string when creating an string list, instead of writing it off as NULL.
1 parent 6f3baec commit 20d99f3

File tree

4 files changed

+169
-323
lines changed

4 files changed

+169
-323
lines changed

storage/spider/spd_conn.cc

Lines changed: 66 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,19 @@ void spider_free_conn_from_trx(
397397
DBUG_VOID_RETURN;
398398
}
399399

400+
static inline void spider_memcpy_or_null(char **dest, char *alloced,
401+
char *src, uint *dest_len,
402+
uint tgt_len)
403+
{
404+
*dest_len= tgt_len;
405+
if (src)
406+
{
407+
*dest= alloced;
408+
memcpy(*dest, src, tgt_len);
409+
} else
410+
*dest= NULL;
411+
}
412+
400413
SPIDER_CONN *spider_create_conn(
401414
SPIDER_SHARE *share,
402415
ha_spider *spider,
@@ -474,106 +487,62 @@ SPIDER_CONN *spider_create_conn(
474487
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
475488
conn->conn_key_hash_value = share->conn_keys_hash_value[link_idx];
476489
#endif
477-
conn->tgt_host_length = share->tgt_hosts_lengths[link_idx];
478-
conn->tgt_host = tmp_host;
479-
memcpy(conn->tgt_host, share->tgt_hosts[link_idx],
480-
share->tgt_hosts_lengths[link_idx]);
481-
482-
conn->tgt_username_length = share->tgt_usernames_lengths[link_idx];
483-
conn->tgt_username = tmp_username;
484-
if (conn->tgt_username_length)
485-
memcpy(conn->tgt_username, share->tgt_usernames[link_idx],
486-
share->tgt_usernames_lengths[link_idx]);
487-
488-
conn->tgt_password_length = share->tgt_passwords_lengths[link_idx];
489-
conn->tgt_password = tmp_password;
490-
if (conn->tgt_password_length)
491-
memcpy(conn->tgt_password, share->tgt_passwords[link_idx],
492-
share->tgt_passwords_lengths[link_idx]);
493-
494-
conn->tgt_socket_length = share->tgt_sockets_lengths[link_idx];
495-
conn->tgt_socket = tmp_socket;
496-
if (conn->tgt_socket_length)
497-
memcpy(conn->tgt_socket, share->tgt_sockets[link_idx],
498-
share->tgt_sockets_lengths[link_idx]);
499-
500-
conn->tgt_wrapper_length = share->tgt_wrappers_lengths[link_idx];
501-
conn->tgt_wrapper = tmp_wrapper;
502-
memcpy(conn->tgt_wrapper, share->tgt_wrappers[link_idx],
503-
share->tgt_wrappers_lengths[link_idx]);
490+
spider_memcpy_or_null(&conn->tgt_host, tmp_host,
491+
share->tgt_hosts[link_idx], &conn->tgt_host_length,
492+
share->tgt_hosts_lengths[link_idx]);
493+
spider_memcpy_or_null(&conn->tgt_username, tmp_username,
494+
share->tgt_usernames[link_idx],
495+
&conn->tgt_username_length,
496+
share->tgt_usernames_lengths[link_idx]);
497+
spider_memcpy_or_null(&conn->tgt_password, tmp_password,
498+
share->tgt_passwords[link_idx],
499+
&conn->tgt_password_length,
500+
share->tgt_passwords_lengths[link_idx]);
501+
spider_memcpy_or_null(&conn->tgt_socket, tmp_socket,
502+
share->tgt_sockets[link_idx],
503+
&conn->tgt_socket_length,
504+
share->tgt_sockets_lengths[link_idx]);
505+
spider_memcpy_or_null(&conn->tgt_wrapper, tmp_wrapper,
506+
share->tgt_wrappers[link_idx],
507+
&conn->tgt_wrapper_length,
508+
share->tgt_wrappers_lengths[link_idx]);
504509
if (!tables_on_different_db_are_joinable)
505510
{
506-
conn->tgt_db_length = share->tgt_dbs_lengths[link_idx];
507-
conn->tgt_db = tmp_db;
508-
memcpy(conn->tgt_db, share->tgt_dbs[link_idx],
509-
share->tgt_dbs_lengths[link_idx]);
511+
spider_memcpy_or_null(&conn->tgt_db, tmp_db, share->tgt_dbs[link_idx],
512+
&conn->tgt_db_length,
513+
share->tgt_dbs_lengths[link_idx]);
510514
}
511-
conn->tgt_ssl_ca_length = share->tgt_ssl_cas_lengths[link_idx];
512-
if (conn->tgt_ssl_ca_length)
513-
{
514-
conn->tgt_ssl_ca = tmp_ssl_ca;
515-
memcpy(conn->tgt_ssl_ca, share->tgt_ssl_cas[link_idx],
516-
share->tgt_ssl_cas_lengths[link_idx]);
517-
} else
518-
conn->tgt_ssl_ca = NULL;
519-
conn->tgt_ssl_capath_length = share->tgt_ssl_capaths_lengths[link_idx];
520-
if (conn->tgt_ssl_capath_length)
521-
{
522-
conn->tgt_ssl_capath = tmp_ssl_capath;
523-
memcpy(conn->tgt_ssl_capath, share->tgt_ssl_capaths[link_idx],
524-
share->tgt_ssl_capaths_lengths[link_idx]);
525-
} else
526-
conn->tgt_ssl_capath = NULL;
527-
conn->tgt_ssl_cert_length = share->tgt_ssl_certs_lengths[link_idx];
528-
if (conn->tgt_ssl_cert_length)
529-
{
530-
conn->tgt_ssl_cert = tmp_ssl_cert;
531-
memcpy(conn->tgt_ssl_cert, share->tgt_ssl_certs[link_idx],
532-
share->tgt_ssl_certs_lengths[link_idx]);
533-
} else
534-
conn->tgt_ssl_cert = NULL;
535-
conn->tgt_ssl_cipher_length = share->tgt_ssl_ciphers_lengths[link_idx];
536-
if (conn->tgt_ssl_cipher_length)
537-
{
538-
conn->tgt_ssl_cipher = tmp_ssl_cipher;
539-
memcpy(conn->tgt_ssl_cipher, share->tgt_ssl_ciphers[link_idx],
540-
share->tgt_ssl_ciphers_lengths[link_idx]);
541-
} else
542-
conn->tgt_ssl_cipher = NULL;
543-
conn->tgt_ssl_key_length = share->tgt_ssl_keys_lengths[link_idx];
544-
if (conn->tgt_ssl_key_length)
545-
{
546-
conn->tgt_ssl_key = tmp_ssl_key;
547-
memcpy(conn->tgt_ssl_key, share->tgt_ssl_keys[link_idx],
548-
share->tgt_ssl_keys_lengths[link_idx]);
549-
} else
550-
conn->tgt_ssl_key = NULL;
551-
conn->tgt_default_file_length = share->tgt_default_files_lengths[link_idx];
552-
if (conn->tgt_default_file_length)
553-
{
554-
conn->tgt_default_file = tmp_default_file;
555-
memcpy(conn->tgt_default_file, share->tgt_default_files[link_idx],
556-
share->tgt_default_files_lengths[link_idx]);
557-
} else
558-
conn->tgt_default_file = NULL;
559-
conn->tgt_default_group_length =
560-
share->tgt_default_groups_lengths[link_idx];
561-
if (conn->tgt_default_group_length)
562-
{
563-
conn->tgt_default_group = tmp_default_group;
564-
memcpy(conn->tgt_default_group, share->tgt_default_groups[link_idx],
565-
share->tgt_default_groups_lengths[link_idx]);
566-
} else
567-
conn->tgt_default_group = NULL;
568-
conn->tgt_dsn_length =
569-
share->tgt_dsns_lengths[link_idx];
570-
if (conn->tgt_dsn_length)
571-
{
572-
conn->tgt_dsn = tmp_dsn;
573-
memcpy(conn->tgt_dsn, share->tgt_dsns[link_idx],
574-
share->tgt_dsns_lengths[link_idx]);
575-
} else
576-
conn->tgt_dsn = NULL;
515+
spider_memcpy_or_null(&conn->tgt_ssl_ca, tmp_ssl_ca,
516+
share->tgt_ssl_cas[link_idx],
517+
&conn->tgt_ssl_ca_length,
518+
share->tgt_ssl_cas_lengths[link_idx]);
519+
spider_memcpy_or_null(&conn->tgt_ssl_capath, tmp_ssl_capath,
520+
share->tgt_ssl_capaths[link_idx],
521+
&conn->tgt_ssl_capath_length,
522+
share->tgt_ssl_capaths_lengths[link_idx]);
523+
spider_memcpy_or_null(&conn->tgt_ssl_cert, tmp_ssl_cert,
524+
share->tgt_ssl_certs[link_idx],
525+
&conn->tgt_ssl_cert_length,
526+
share->tgt_ssl_certs_lengths[link_idx]);
527+
spider_memcpy_or_null(&conn->tgt_ssl_cipher, tmp_ssl_cipher,
528+
share->tgt_ssl_ciphers[link_idx],
529+
&conn->tgt_ssl_cipher_length,
530+
share->tgt_ssl_ciphers_lengths[link_idx]);
531+
spider_memcpy_or_null(&conn->tgt_ssl_key, tmp_ssl_key,
532+
share->tgt_ssl_keys[link_idx],
533+
&conn->tgt_ssl_key_length,
534+
share->tgt_ssl_keys_lengths[link_idx]);
535+
spider_memcpy_or_null(&conn->tgt_default_file, tmp_default_file,
536+
share->tgt_default_files[link_idx],
537+
&conn->tgt_default_file_length,
538+
share->tgt_default_files_lengths[link_idx]);
539+
spider_memcpy_or_null(&conn->tgt_default_group, tmp_default_group,
540+
share->tgt_default_groups[link_idx],
541+
&conn->tgt_default_group_length,
542+
share->tgt_default_groups_lengths[link_idx]);
543+
spider_memcpy_or_null(&conn->tgt_dsn, tmp_dsn, share->tgt_dsns[link_idx],
544+
&conn->tgt_dsn_length,
545+
share->tgt_dsns_lengths[link_idx]);
577546
conn->tgt_port = share->tgt_ports[link_idx];
578547
conn->tgt_ssl_vsc = share->tgt_ssl_vscs[link_idx];
579548
conn->dbton_id = share->sql_dbton_ids[link_idx];

storage/spider/spd_direct_sql.cc

Lines changed: 50 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -219,23 +219,23 @@ int spider_udf_direct_sql_create_conn_key(
219219
tables_on_different_db_are_joinable();
220220
direct_sql->conn_key_length
221221
= 1
222-
+ direct_sql->tgt_wrapper_length + 1
223-
+ direct_sql->tgt_host_length + 1
224-
+ 5 + 1
225-
+ direct_sql->tgt_socket_length + 1
226-
+ (tables_on_different_db_are_joinable ?
227-
0 : direct_sql->tgt_default_db_name_length + 1)
228-
+ direct_sql->tgt_username_length + 1
229-
+ direct_sql->tgt_password_length + 1
230-
+ direct_sql->tgt_ssl_ca_length + 1
231-
+ direct_sql->tgt_ssl_capath_length + 1
232-
+ direct_sql->tgt_ssl_cert_length + 1
233-
+ direct_sql->tgt_ssl_cipher_length + 1
234-
+ direct_sql->tgt_ssl_key_length + 1
235-
+ 1 + 1
236-
+ direct_sql->tgt_default_file_length + 1
237-
+ direct_sql->tgt_default_group_length + 1
238-
+ direct_sql->tgt_dsn_length;
222+
+ (direct_sql->tgt_wrapper ? direct_sql->tgt_wrapper_length + 2 : 0)
223+
+ (direct_sql->tgt_host ? direct_sql->tgt_host_length + 2 : 0)
224+
+ 5 + 2
225+
+ (direct_sql->tgt_socket ? direct_sql->tgt_socket_length + 2 : 0)
226+
+ (!tables_on_different_db_are_joinable && direct_sql->tgt_default_db_name ?
227+
direct_sql->tgt_default_db_name_length + 2 : 0)
228+
+ (direct_sql->tgt_username ? direct_sql->tgt_username_length + 2 : 0)
229+
+ (direct_sql->tgt_password ? direct_sql->tgt_password_length + 2 : 0)
230+
+ (direct_sql->tgt_ssl_ca ? direct_sql->tgt_ssl_ca_length + 2 : 0)
231+
+ (direct_sql->tgt_ssl_capath ? direct_sql->tgt_ssl_capath_length + 2 : 0)
232+
+ (direct_sql->tgt_ssl_cert ? direct_sql->tgt_ssl_cert_length + 2 : 0)
233+
+ (direct_sql->tgt_ssl_cipher ? direct_sql->tgt_ssl_cipher_length + 2 : 0)
234+
+ (direct_sql->tgt_ssl_key ? direct_sql->tgt_ssl_key_length + 2 : 0)
235+
+ 1 + 2
236+
+ (direct_sql->tgt_default_file ? direct_sql->tgt_default_file_length + 2 : 0)
237+
+ (direct_sql->tgt_default_group ? direct_sql->tgt_default_group_length + 2 : 0)
238+
+ (direct_sql->tgt_dsn ? direct_sql->tgt_dsn_length + 2 : 0);
239239
if (!(direct_sql->conn_key = (char *)
240240
spider_malloc(spider_current_trx, SPD_MID_UDF_DIRECT_SQL_CREATE_CONN_KEY_1, direct_sql->conn_key_length + 1,
241241
MYF(MY_WME | MY_ZEROFILL)))
@@ -245,96 +245,36 @@ int spider_udf_direct_sql_create_conn_key(
245245
*direct_sql->conn_key = '0' + 48 - direct_sql->connection_channel;
246246
else
247247
*direct_sql->conn_key = '0' + direct_sql->connection_channel;
248-
DBUG_PRINT("info",("spider tgt_wrapper=%s", direct_sql->tgt_wrapper));
249-
tmp_name = strmov(direct_sql->conn_key + 1, direct_sql->tgt_wrapper);
250-
DBUG_PRINT("info",("spider tgt_host=%s", direct_sql->tgt_host));
251-
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_host);
248+
int counter= 0;
249+
tmp_name= direct_sql->conn_key + 1;
250+
spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_wrapper);
251+
spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_host);
252252
my_sprintf(port_str, (port_str, "%05ld", direct_sql->tgt_port));
253-
DBUG_PRINT("info",("spider port_str=%s", port_str));
254-
tmp_name = strmov(tmp_name + 1, port_str);
255-
if (direct_sql->tgt_socket)
253+
spider_create_conn_key_add_one(&counter, &tmp_name, port_str);
254+
spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_socket);
255+
counter++;
256+
if (!tables_on_different_db_are_joinable && direct_sql->tgt_default_db_name)
256257
{
257-
DBUG_PRINT("info",("spider tgt_socket=%s", direct_sql->tgt_socket));
258-
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_socket);
259-
} else
258+
*tmp_name= (char) counter;
259+
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_default_db_name);
260260
tmp_name++;
261-
if (!tables_on_different_db_are_joinable)
262-
{
263-
if (direct_sql->tgt_default_db_name)
264-
{
265-
DBUG_PRINT("info",("spider tgt_default_db_name=%s",
266-
direct_sql->tgt_default_db_name));
267-
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_default_db_name);
268-
} else
269-
tmp_name++;
270261
}
271-
if (direct_sql->tgt_username)
272-
{
273-
DBUG_PRINT("info",("spider tgt_username=%s", direct_sql->tgt_username));
274-
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_username);
275-
} else
276-
tmp_name++;
277-
if (direct_sql->tgt_password)
278-
{
279-
DBUG_PRINT("info",("spider tgt_password=%s", direct_sql->tgt_password));
280-
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_password);
281-
} else
282-
tmp_name++;
283-
if (direct_sql->tgt_ssl_ca)
284-
{
285-
DBUG_PRINT("info",("spider tgt_ssl_ca=%s", direct_sql->tgt_ssl_ca));
286-
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_ssl_ca);
287-
} else
288-
tmp_name++;
289-
if (direct_sql->tgt_ssl_capath)
290-
{
291-
DBUG_PRINT("info",("spider tgt_ssl_capath=%s",
292-
direct_sql->tgt_ssl_capath));
293-
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_ssl_capath);
294-
} else
295-
tmp_name++;
296-
if (direct_sql->tgt_ssl_cert)
297-
{
298-
DBUG_PRINT("info",("spider tgt_ssl_cert=%s", direct_sql->tgt_ssl_cert));
299-
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_ssl_cert);
300-
} else
301-
tmp_name++;
302-
if (direct_sql->tgt_ssl_cipher)
303-
{
304-
DBUG_PRINT("info",("spider tgt_ssl_cipher=%s",
305-
direct_sql->tgt_ssl_cipher));
306-
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_ssl_cipher);
307-
} else
308-
tmp_name++;
309-
if (direct_sql->tgt_ssl_key)
310-
{
311-
DBUG_PRINT("info",("spider tgt_ssl_key=%s", direct_sql->tgt_ssl_key));
312-
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_ssl_key);
313-
} else
314-
tmp_name++;
315-
tmp_name++;
316-
*tmp_name = '0' + ((char) direct_sql->tgt_ssl_vsc);
317-
if (direct_sql->tgt_default_file)
318-
{
319-
DBUG_PRINT("info",("spider tgt_default_file=%s",
320-
direct_sql->tgt_default_file));
321-
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_default_file);
322-
} else
323-
tmp_name++;
324-
if (direct_sql->tgt_default_group)
325-
{
326-
DBUG_PRINT("info",("spider tgt_default_group=%s",
327-
direct_sql->tgt_default_group));
328-
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_default_group);
329-
} else
330-
tmp_name++;
331-
if (direct_sql->tgt_dsn)
332-
{
333-
DBUG_PRINT("info",("spider tgt_dsn=%s",
334-
direct_sql->tgt_dsn));
335-
tmp_name = strmov(tmp_name + 1, direct_sql->tgt_dsn);
336-
} else
337-
tmp_name++;
262+
spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_username);
263+
spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_password);
264+
spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_ssl_ca);
265+
spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_ssl_capath);
266+
spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_ssl_cert);
267+
spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_ssl_cipher);
268+
spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_ssl_key);
269+
counter++;
270+
*tmp_name= (char) counter;
271+
tmp_name++;
272+
*tmp_name = '0' + ((char) direct_sql->tgt_ssl_vsc);
273+
tmp_name++;
274+
spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_default_file);
275+
spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_default_group);
276+
spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_dsn);
277+
tmp_name++;
338278
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
339279
direct_sql->conn_key_hash_value = my_calc_hash(&spider_open_connections,
340280
(uchar*) direct_sql->conn_key, direct_sql->conn_key_length);
@@ -350,7 +290,7 @@ static inline void spider_maybe_memcpy_string(
350290
uint src_len)
351291
{
352292
*dest_len= src_len;
353-
if (src_len)
293+
if (src)
354294
{
355295
*dest= tmp;
356296
memcpy(*dest, src, src_len);
@@ -416,13 +356,12 @@ SPIDER_CONN *spider_udf_direct_sql_create_conn(
416356
conn->conn_key_length = direct_sql->conn_key_length;
417357
conn->conn_key = tmp_name;
418358
memcpy(conn->conn_key, direct_sql->conn_key, direct_sql->conn_key_length);
419-
conn->tgt_wrapper_length = direct_sql->tgt_wrapper_length;
420-
conn->tgt_wrapper = tmp_wrapper;
421-
memcpy(conn->tgt_wrapper, direct_sql->tgt_wrapper,
422-
direct_sql->tgt_wrapper_length);
423-
conn->tgt_host_length = direct_sql->tgt_host_length;
424-
conn->tgt_host = tmp_host;
425-
memcpy(conn->tgt_host, direct_sql->tgt_host, direct_sql->tgt_host_length);
359+
spider_maybe_memcpy_string(
360+
&conn->tgt_wrapper, direct_sql->tgt_wrapper, tmp_wrapper,
361+
&conn->tgt_wrapper_length, direct_sql->tgt_wrapper_length);
362+
spider_maybe_memcpy_string(
363+
&conn->tgt_host, direct_sql->tgt_host, tmp_host,
364+
&conn->tgt_host_length, direct_sql->tgt_host_length);
426365
conn->tgt_port = direct_sql->tgt_port;
427366
spider_maybe_memcpy_string(
428367
&conn->tgt_socket, direct_sql->tgt_socket, tmp_socket,

0 commit comments

Comments
 (0)