@@ -305,7 +305,7 @@ innodb_api_write_int(
305
305
{
306
306
ib_col_meta_t col_meta ;
307
307
ib_col_meta_t * m_col = & col_meta ;
308
- void * src ;
308
+ void * src = NULL ;
309
309
310
310
ib_cb_col_get_meta (tpl , field , m_col );
311
311
@@ -355,7 +355,7 @@ innodb_api_write_int(
355
355
}
356
356
}
357
357
358
- ib_cb_col_set_value (tpl , field , src , m_col -> type_len );
358
+ ib_cb_col_set_value (tpl , field , src , m_col -> type_len , true );
359
359
return (DB_SUCCESS );
360
360
}
361
361
@@ -546,7 +546,7 @@ innodb_api_search(
546
546
srch_crsr = crsr ;
547
547
}
548
548
549
- err = ib_cb_col_set_value (key_tpl , 0 , (char * ) key , len );
549
+ err = ib_cb_col_set_value (key_tpl , 0 , (char * ) key , len , true );
550
550
551
551
ib_cb_cursor_set_match_mode (srch_crsr , IB_EXACT_MATCH );
552
552
@@ -762,7 +762,7 @@ innodb_api_set_multi_cols(
762
762
if (value [0 ] == * sep ) {
763
763
err = ib_cb_col_set_value (
764
764
tpl , col_info [i ].field_id ,
765
- NULL , IB_SQL_NULL );
765
+ NULL , IB_SQL_NULL , true );
766
766
i ++ ;
767
767
768
768
if (err != DB_SUCCESS ) {
@@ -780,11 +780,11 @@ innodb_api_set_multi_cols(
780
780
if (!col_val ) {
781
781
err = ib_cb_col_set_value (
782
782
tpl , col_info [i ].field_id ,
783
- NULL , IB_SQL_NULL );
783
+ NULL , IB_SQL_NULL , true );
784
784
} else {
785
785
err = ib_cb_col_set_value (
786
786
tpl , col_info [i ].field_id ,
787
- col_val , strlen (col_val ));
787
+ col_val , strlen (col_val ), true );
788
788
789
789
if (table ) {
790
790
handler_rec_setup_str (
@@ -801,7 +801,7 @@ innodb_api_set_multi_cols(
801
801
for (; i < meta_info -> n_extra_col ; i ++ ) {
802
802
err = ib_cb_col_set_value (
803
803
tpl , col_info [i ].field_id ,
804
- NULL , IB_SQL_NULL );
804
+ NULL , IB_SQL_NULL , true );
805
805
806
806
if (err != DB_SUCCESS ) {
807
807
break ;
@@ -858,12 +858,13 @@ innodb_api_set_tpl(
858
858
uint64_t exp , /*!< in: expiration */
859
859
uint64_t flag , /*!< in: flag */
860
860
int col_to_set , /*!< in: column to set */
861
- void * table ) /*!< in: MySQL TABLE* */
861
+ void * table , /*!< in: MySQL TABLE* */
862
+ bool need_cpy ) /*!< in: if need memcpy */
862
863
{
863
864
ib_err_t err = DB_ERROR ;
864
865
865
866
err = ib_cb_col_set_value (tpl , col_info [CONTAINER_KEY ].field_id ,
866
- key , key_len );
867
+ key , key_len , need_cpy );
867
868
868
869
if (err != DB_SUCCESS ) {
869
870
return (err );
@@ -884,12 +885,13 @@ innodb_api_set_tpl(
884
885
if (col_to_set == UPDATE_ALL_VAL_COL ) {
885
886
err = innodb_api_set_multi_cols (tpl , meta_info ,
886
887
(char * ) value ,
887
- value_len , table );
888
+ value_len ,
889
+ table );
888
890
} else {
889
891
err = ib_cb_col_set_value (
890
892
tpl ,
891
893
meta_info -> extra_col_info [col_to_set ].field_id ,
892
- value , value_len );
894
+ value , value_len , need_cpy );
893
895
894
896
if (table ) {
895
897
handler_rec_setup_str (
@@ -901,7 +903,7 @@ innodb_api_set_tpl(
901
903
} else {
902
904
err = ib_cb_col_set_value (
903
905
tpl , col_info [CONTAINER_VALUE ].field_id ,
904
- value , value_len );
906
+ value , value_len , need_cpy );
905
907
906
908
if (table ) {
907
909
handler_rec_setup_str (
@@ -977,7 +979,8 @@ innodb_api_insert(
977
979
key + len , val_len ,
978
980
new_cas , exp , flags , UPDATE_ALL_VAL_COL ,
979
981
engine -> enable_binlog
980
- ? cursor_data -> mysql_tbl : NULL );
982
+ ? cursor_data -> mysql_tbl : NULL ,
983
+ false);
981
984
982
985
if (err == DB_SUCCESS ) {
983
986
err = ib_cb_insert_row (cursor_data -> crsr , tpl );
@@ -1048,7 +1051,8 @@ innodb_api_update(
1048
1051
len , key + len , val_len ,
1049
1052
new_cas , exp , flags , UPDATE_ALL_VAL_COL ,
1050
1053
engine -> enable_binlog
1051
- ? cursor_data -> mysql_tbl : NULL );
1054
+ ? cursor_data -> mysql_tbl : NULL ,
1055
+ true);
1052
1056
1053
1057
if (err == DB_SUCCESS ) {
1054
1058
err = ib_cb_update_row (srch_crsr , old_tpl , new_tpl );
@@ -1213,7 +1217,8 @@ innodb_api_link(
1213
1217
key , len , append_buf , total_len ,
1214
1218
new_cas , exp , flags , column_used ,
1215
1219
engine -> enable_binlog
1216
- ? cursor_data -> mysql_tbl : NULL );
1220
+ ? cursor_data -> mysql_tbl : NULL ,
1221
+ true);
1217
1222
1218
1223
if (err == DB_SUCCESS ) {
1219
1224
err = ib_cb_update_row (srch_crsr , old_tpl , new_tpl );
@@ -1377,7 +1382,8 @@ innodb_api_arithmetic(
1377
1382
result .col_value [MCI_COL_FLAG ].value_int ,
1378
1383
column_used ,
1379
1384
engine -> enable_binlog
1380
- ? cursor_data -> mysql_tbl : NULL );
1385
+ ? cursor_data -> mysql_tbl : NULL ,
1386
+ true);
1381
1387
1382
1388
if (err != DB_SUCCESS ) {
1383
1389
ib_cb_tuple_delete (new_tpl );
@@ -1453,9 +1459,16 @@ innodb_api_store(
1453
1459
ENGINE_ERROR_CODE stored = ENGINE_NOT_STORED ;
1454
1460
ib_crsr_t srch_crsr = cursor_data -> crsr ;
1455
1461
1456
- /* First check whether record with the key value exists */
1457
- err = innodb_api_search (cursor_data , & srch_crsr ,
1458
- key , len , & result , & old_tpl , false);
1462
+ /* Skip search for add operation. Rely on the unique index of
1463
+ key to check any duplicates */
1464
+ if (op == OPERATION_ADD ) {
1465
+ err = DB_RECORD_NOT_FOUND ;
1466
+ memset (& result , 0 , sizeof (result ));
1467
+ } else {
1468
+ /* First check whether record with the key value exists */
1469
+ err = innodb_api_search (cursor_data , & srch_crsr ,
1470
+ key , len , & result , & old_tpl , false);
1471
+ }
1459
1472
1460
1473
/* If the return message is not success or record not found, just
1461
1474
exit */
@@ -1465,13 +1478,8 @@ innodb_api_store(
1465
1478
1466
1479
switch (op ) {
1467
1480
case OPERATION_ADD :
1468
- /* Only add if the key does not exist */
1469
- if (err != DB_SUCCESS ) {
1470
- err = innodb_api_insert (engine , cursor_data , key , len ,
1471
- val_len , exp , cas , flags );
1472
- } else {
1473
- err = DB_ERROR ;
1474
- }
1481
+ err = innodb_api_insert (engine , cursor_data , key , len ,
1482
+ val_len , exp , cas , flags );
1475
1483
break ;
1476
1484
case OPERATION_REPLACE :
1477
1485
if (err == DB_SUCCESS ) {
0 commit comments