1/*****************************************************************************
2
3Copyright (c) 1994, 2014, Oracle and/or its affiliates. All Rights Reserved.
4
5This program is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License as published by the Free Software
7Foundation; version 2 of the License.
8
9This program is distributed in the hope that it will be useful, but WITHOUT
10ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12
13You should have received a copy of the GNU General Public License along with
14this program; if not, write to the Free Software Foundation, Inc.,
1551 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
16
17*****************************************************************************/
18
19/*******************************************************************//**
20@file include/rem0cmp.ic
21Comparison services for records
22
23Created 7/1/1994 Heikki Tuuri
24************************************************************************/
25
26#include <mysql_com.h>
27
28/** Compare two data fields.
29@param[in] dfield1 data field; must have type field set
30@param[in] dfield2 data field
31@return the comparison result of dfield1 and dfield2
32@retval 0 if dfield1 is equal to dfield2
33@retval negative if dfield1 is less than dfield2
34@retval positive if dfield1 is greater than dfield2 */
35UNIV_INLINE
36int
37cmp_dfield_dfield(
38 const dfield_t* dfield1,
39 const dfield_t* dfield2)
40{
41 const dtype_t* type;
42
43 ut_ad(dfield_check_typed(dfield1));
44
45 type = dfield_get_type(dfield1);
46
47 return(cmp_data_data(type->mtype, type->prtype,
48 (const byte*) dfield_get_data(dfield1),
49 dfield_get_len(dfield1),
50 (const byte*) dfield_get_data(dfield2),
51 dfield_get_len(dfield2)));
52}
53
54/** Compare two B-tree records.
55Only the common first fields are compared, and externally stored field
56are treated as equal.
57@param[in] rec1 B-tree record
58@param[in] rec2 B-tree record
59@param[in] offsets1 rec_get_offsets(rec1, index)
60@param[in] offsets2 rec_get_offsets(rec2, index)
61@param[out] matched_fields number of completely matched fields
62 within the first field not completely matched
63@return positive, 0, negative if rec1 is greater, equal, less, than rec2,
64respectively */
65UNIV_INLINE
66int
67cmp_rec_rec(
68 const rec_t* rec1,
69 const rec_t* rec2,
70 const ulint* offsets1,
71 const ulint* offsets2,
72 const dict_index_t* index,
73 ulint* matched_fields)
74{
75 ulint match_f;
76 int ret;
77
78 ret = cmp_rec_rec_with_match(
79 rec1, rec2, offsets1, offsets2, index, false, &match_f);
80
81 if (matched_fields != NULL) {
82 *matched_fields = match_f;
83 }
84
85 return(ret);
86}
87
88/** Compare two data fields.
89@param[in] dfield1 data field
90@param[in] dfield2 data field
91@return the comparison result of dfield1 and dfield2
92@retval 0 if dfield1 is equal to dfield2, or a prefix of dfield1
93@retval negative if dfield1 is less than dfield2
94@retval positive if dfield1 is greater than dfield2 */
95UNIV_INLINE
96int
97cmp_dfield_dfield_like_prefix(
98 const dfield_t* dfield1,
99 const dfield_t* dfield2)
100{
101 const dtype_t* type;
102
103 ut_ad(dfield_check_typed(dfield1));
104 ut_ad(dfield_check_typed(dfield2));
105
106 type = dfield_get_type(dfield1);
107
108#ifdef UNIV_DEBUG
109 switch (type->prtype & DATA_MYSQL_TYPE_MASK) {
110 case MYSQL_TYPE_BIT:
111 case MYSQL_TYPE_STRING:
112 case MYSQL_TYPE_VAR_STRING:
113 case MYSQL_TYPE_TINY_BLOB:
114 case MYSQL_TYPE_MEDIUM_BLOB:
115 case MYSQL_TYPE_BLOB:
116 case MYSQL_TYPE_LONG_BLOB:
117 case MYSQL_TYPE_VARCHAR:
118 break;
119 default:
120 ut_error;
121 }
122#endif /* UNIV_DEBUG */
123
124 uint cs_num = (uint) dtype_get_charset_coll(type->prtype);
125
126 if (CHARSET_INFO* cs = get_charset(cs_num, MYF(MY_WME))) {
127 return(cs->coll->strnncoll(
128 cs,
129 static_cast<uchar*>(
130 dfield_get_data(dfield1)),
131 dfield_get_len(dfield1),
132 static_cast<uchar*>(
133 dfield_get_data(dfield2)),
134 dfield_get_len(dfield2),
135 1));
136 }
137
138 ib::fatal() << "Unable to find charset-collation " << cs_num;
139 return(0);
140}
141