1 /* Copyright (c) 2013, 2021, Oracle and/or its affiliates.
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License, version 2.0,
5 as published by the Free Software Foundation.
6
7 This program is also distributed with certain software (including
8 but not limited to OpenSSL) that is licensed under separate terms,
9 as designated in a particular file or component or in included license
10 documentation. The authors of MySQL hereby grant you an additional
11 permission to link the program and your derivative works with the
12 separately licensed software that they have included with MySQL.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License, version 2.0, for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
22
23 // First include (the generated) my_config.h, to get correct platform defines.
24 #include "my_config.h"
25 #include <gtest/gtest.h>
26 #include <gmock/gmock.h>
27
28 #include "test_utils.h"
29
30 #include "item.h"
31 #include "item_cmpfunc.h"
32 #include "sql_class.h"
33 namespace item_like_unittest {
34
35 using my_testing::Server_initializer;
36 using my_testing::Mock_error_handler;
37 using ::testing::Return;
38
39
40 const char haystack[]=
41 "CAAAACCACTATGAGATATCATCTCACACCAGTTAGAATGGCAATCATTA"
42 "AAAAGTCAGGAAACAACAGGTGCTGGAGAGGATGCGGAGAAATAGGAACAC";
43
44 const char escape[]= "\\";
45
46 class ItemLikeTest : public ::testing::Test
47 {
48 protected:
SetUp()49 virtual void SetUp()
50 {
51 initializer.SetUp();
52 it_haystack= new Item_string(STRING_WITH_LEN(haystack), &my_charset_latin1);
53 it_escape= new Item_string(STRING_WITH_LEN(escape), &my_charset_latin1);
54 }
TearDown()55 virtual void TearDown() { initializer.TearDown(); }
56
thd()57 THD *thd() { return initializer.thd(); }
58
59 Server_initializer initializer;
60 Item_string *it_haystack;
61 Item_string *it_escape;
62 };
63
64
TEST_F(ItemLikeTest,TestOne)65 TEST_F(ItemLikeTest, TestOne)
66 {
67 const char needle[]= "%ACAGGTGCTGGAGAGGATGCGGAGAAATAGGAACA%" ;
68
69 Item_string *it_needle=
70 new Item_string(STRING_WITH_LEN(needle), &my_charset_latin1);
71 Item_func_like *item_BM=
72 new Item_func_like(it_haystack, it_needle, it_escape, false);
73 EXPECT_FALSE(item_BM->fix_fields(thd(), NULL));
74 EXPECT_EQ(1, item_BM->val_int());
75 }
76
77
78 // Increase number when doing performance comparisons.
79 // Run with ./unittest/gunit/item_like-t --disable-tap-output
80 // to get timings from googletest.
81 const int num_executions= 1; // 100000;
82
TEST_F(ItemLikeTest,PerfBasic)83 TEST_F(ItemLikeTest, PerfBasic)
84 {
85 const char needle[]= "%CAAAACCACTATGAGATATCATCTCACACCAGTTA%";
86 Item_string *it_needle=
87 new Item_string(STRING_WITH_LEN(needle), &my_charset_latin1);
88
89 Item_func_like *item_BM=
90 new Item_func_like(it_haystack, it_needle, it_escape, false);
91 EXPECT_FALSE(item_BM->fix_fields(thd(), NULL));
92 for (int ix= 0; ix < num_executions; ++ix)
93 {
94 EXPECT_EQ(1, item_BM->val_int());
95 }
96 }
97
98 class ItemLikeTestP : public ::testing::TestWithParam<const char*>
99 {
100 protected:
SetUp()101 virtual void SetUp()
102 {
103 initializer.SetUp();
104 m_needle= GetParam();
105 }
TearDown()106 virtual void TearDown() { initializer.TearDown(); }
107
thd()108 THD *thd() { return initializer.thd(); }
109
110 Server_initializer initializer;
111 const char *m_needle;
112 };
113
114
115 class ItemFalseLikeTestP : public ::testing::TestWithParam<const char*>
116 {
117 protected:
SetUp()118 virtual void SetUp()
119 {
120 initializer.SetUp();
121 m_needle= GetParam();
122 }
TearDown()123 virtual void TearDown() { initializer.TearDown(); }
124
thd()125 THD *thd() { return initializer.thd(); }
126
127 Server_initializer initializer;
128 const char *m_needle;
129 };
130
131 static const char *needles[] = {
132 "%CAAAACCACTATGAGATATCATCTCACACCAGTTA%",
133 "%AAAACCACTATGAGATATCATCTCACACCAGTTAG%",
134 "%AAAACCACTATGAGATATCATCTCACACCAGTTAG%",
135 "%AAAACCACTATGAGATATCATCTCACACCAGTTAG%",
136 "%AAAACCACTATGAGATATCATCTCACACCAGTTAG%",
137 "%CAAAACCACTATGAGATATCATCTCACACCAGTTA%",
138 "%CAAAACCACTATGAGATATCATCTCACACCAGTTA%",
139 "%AAAACCACTATGAGATATCATCTCACACCAGTTAG%",
140 "%AAACCACTATGAGATATCATCTCACACCAGTTAGA%",
141 "%AACCACTATGAGATATCATCTCACACCAGTTAGAA%",
142 "%ACCACTATGAGATATCATCTCACACCAGTTAGAAT%",
143 "%CCACTATGAGATATCATCTCACACCAGTTAGAATG%",
144 "%CACTATGAGATATCATCTCACACCAGTTAGAATGG%",
145 "%ACTATGAGATATCATCTCACACCAGTTAGAATGGC%",
146 "%CTATGAGATATCATCTCACACCAGTTAGAATGGCA%",
147 "%TATGAGATATCATCTCACACCAGTTAGAATGGCAA%",
148 "%ATGAGATATCATCTCACACCAGTTAGAATGGCAAT%",
149 "%TGAGATATCATCTCACACCAGTTAGAATGGCAATC%",
150 "%GAGATATCATCTCACACCAGTTAGAATGGCAATCA%",
151 "%AGATATCATCTCACACCAGTTAGAATGGCAATCAT%",
152 "%GATATCATCTCACACCAGTTAGAATGGCAATCATT%",
153 "%ATATCATCTCACACCAGTTAGAATGGCAATCATTA%",
154 "%TATCATCTCACACCAGTTAGAATGGCAATCATTAA%",
155 "%ATCATCTCACACCAGTTAGAATGGCAATCATTAAA%",
156 "%TCATCTCACACCAGTTAGAATGGCAATCATTAAAA%",
157 "%CATCTCACACCAGTTAGAATGGCAATCATTAAAAA%",
158 "%ATCTCACACCAGTTAGAATGGCAATCATTAAAAAG%",
159 "%TCTCACACCAGTTAGAATGGCAATCATTAAAAAGT%",
160 "%CTCACACCAGTTAGAATGGCAATCATTAAAAAGTC%",
161 "%TCACACCAGTTAGAATGGCAATCATTAAAAAGTCA%",
162 "%CACACCAGTTAGAATGGCAATCATTAAAAAGTCAG%",
163 "%ACACCAGTTAGAATGGCAATCATTAAAAAGTCAGG%",
164 "%CACCAGTTAGAATGGCAATCATTAAAAAGTCAGGA%",
165 "%ACCAGTTAGAATGGCAATCATTAAAAAGTCAGGAA%",
166 "%CCAGTTAGAATGGCAATCATTAAAAAGTCAGGAAA%",
167 "%CAGTTAGAATGGCAATCATTAAAAAGTCAGGAAAC%",
168 "%AGTTAGAATGGCAATCATTAAAAAGTCAGGAAACA%",
169 "%GTTAGAATGGCAATCATTAAAAAGTCAGGAAACAA%",
170 "%TTAGAATGGCAATCATTAAAAAGTCAGGAAACAAC%",
171 "%TAGAATGGCAATCATTAAAAAGTCAGGAAACAACA%",
172 "%AGAATGGCAATCATTAAAAAGTCAGGAAACAACAG%",
173 "%GAATGGCAATCATTAAAAAGTCAGGAAACAACAGG%",
174 "%AATGGCAATCATTAAAAAGTCAGGAAACAACAGGT%",
175 "%ATGGCAATCATTAAAAAGTCAGGAAACAACAGGTG%",
176 "%TGGCAATCATTAAAAAGTCAGGAAACAACAGGTGC%",
177 "%GCAATCATTAAAAAGTCAGGAAACAACAGGTGCTG%",
178 "%CAATCATTAAAAAGTCAGGAAACAACAGGTGCTGG%",
179 "%AATCATTAAAAAGTCAGGAAACAACAGGTGCTGGA%",
180 "%ATCATTAAAAAGTCAGGAAACAACAGGTGCTGGAG%",
181 "%TCATTAAAAAGTCAGGAAACAACAGGTGCTGGAGA%",
182 "%CATTAAAAAGTCAGGAAACAACAGGTGCTGGAGAG%",
183 "%ATTAAAAAGTCAGGAAACAACAGGTGCTGGAGAGG%",
184 "%TTAAAAAGTCAGGAAACAACAGGTGCTGGAGAGGA%",
185 "%TAAAAAGTCAGGAAACAACAGGTGCTGGAGAGGAT%",
186 "%AAAAAGTCAGGAAACAACAGGTGCTGGAGAGGATG%",
187 "%AAAAGTCAGGAAACAACAGGTGCTGGAGAGGATGC%",
188 "%AAAGTCAGGAAACAACAGGTGCTGGAGAGGATGCG%",
189 "%AAGTCAGGAAACAACAGGTGCTGGAGAGGATGCGG%",
190 "%AGTCAGGAAACAACAGGTGCTGGAGAGGATGCGGA%",
191 "%GTCAGGAAACAACAGGTGCTGGAGAGGATGCGGAG%",
192 "%TCAGGAAACAACAGGTGCTGGAGAGGATGCGGAGA%",
193 "%CAGGAAACAACAGGTGCTGGAGAGGATGCGGAGAA%",
194 "%AGGAAACAACAGGTGCTGGAGAGGATGCGGAGAAA%",
195 "%GGAAACAACAGGTGCTGGAGAGGATGCGGAGAAAT%",
196 "%GAAACAACAGGTGCTGGAGAGGATGCGGAGAAATA%",
197 "%AAACAACAGGTGCTGGAGAGGATGCGGAGAAATAG%",
198 "%AACAACAGGTGCTGGAGAGGATGCGGAGAAATAGG%",
199 "%ACAACAGGTGCTGGAGAGGATGCGGAGAAATAGGA%",
200 "%CAACAGGTGCTGGAGAGGATGCGGAGAAATAGGAA%",
201 "%AACAGGTGCTGGAGAGGATGCGGAGAAATAGGAAC%",
202 "%ACAGGTGCTGGAGAGGATGCGGAGAAATAGGAACA%",
203 "%CAGGTGCTGGAGAGGATGCGGAGAAATAGGAACAC%"
204 };
205
206 INSTANTIATE_TEST_CASE_P(MoreNeedles, ItemLikeTestP,
207 ::testing::ValuesIn(needles));
208
209
TEST_P(ItemLikeTestP,MoreNeedlesTest)210 TEST_P(ItemLikeTestP, MoreNeedlesTest)
211 {
212 Item_string *it_haystack=
213 new Item_string(STRING_WITH_LEN(haystack), &my_charset_latin1);
214 Item_string *it_needle=
215 new Item_string(m_needle, strlen(m_needle), &my_charset_latin1);
216 Item_string *it_escape=
217 new Item_string(STRING_WITH_LEN(escape), &my_charset_latin1);
218
219 Item_func_like *item_BM=
220 new Item_func_like(it_haystack, it_needle, it_escape, false);
221 EXPECT_FALSE(item_BM->fix_fields(thd(), NULL));
222 EXPECT_EQ(1, item_BM->val_int());
223 }
224
225 static const char* falseNeedles[] = {
226
227 "%ATTGACCACACTCTACTATAGAGTATCACCAAAAC%",
228 "%GATTGACCACACTCTACTATAGAGTATCACCAAAA%",
229 "%AGATTGACCACACTCTACTATAGAGTATCACCAAA%",
230 "%AAGATTGACCACACTCTACTATAGAGTATCACCAA%",
231 "%TAAGATTGACCACACTCTACTATAGAGTATCACCA%",
232 "%GTAAGATTGACCACACTCTACTATAGAGTATCACC%",
233 "%GGTAAGATTGACCACACTCTACTATAGAGTATCAC%",
234 "%CGGTAAGATTGACCACACTCTACTATAGAGTATCA%",
235 "%ACGGTAAGATTGACCACACTCTACTATAGAGTATC%",
236 "%AACGGTAAGATTGACCACACTCTACTATAGAGTAT%",
237 "%TAACGGTAAGATTGACCACACTCTACTATAGAGTA%",
238 "%CTAACGGTAAGATTGACCACACTCTACTATAGAGT%",
239 "%ACTAACGGTAAGATTGACCACACTCTACTATAGAG%",
240 "%TACTAACGGTAAGATTGACCACACTCTACTATAGA%",
241 "%TTACTAACGGTAAGATTGACCACACTCTACTATAG%",
242 "%ATTACTAACGGTAAGATTGACCACACTCTACTATA%",
243 "%AATTACTAACGGTAAGATTGACCACACTCTACTAT%",
244 "%AAATTACTAACGGTAAGATTGACCACACTCTACTA%",
245 "%AAAATTACTAACGGTAAGATTGACCACACTCTACT%",
246 "%AAAAATTACTAACGGTAAGATTGACCACACTCTAC%",
247 "%GAAAAATTACTAACGGTAAGATTGACCACACTCTA%",
248 "%TGAAAAATTACTAACGGTAAGATTGACCACACTCT%",
249 "%CTGAAAAATTACTAACGGTAAGATTGACCACACTC%",
250 "%ACTGAAAAATTACTAACGGTAAGATTGACCACACT%",
251 "%GACTGAAAAATTACTAACGGTAAGATTGACCACAC%",
252 "%GGACTGAAAAATTACTAACGGTAAGATTGACCACA%",
253 "%AGGACTGAAAAATTACTAACGGTAAGATTGACCAC%",
254 "%AAGGACTGAAAAATTACTAACGGTAAGATTGACCA%",
255 "%AAAGGACTGAAAAATTACTAACGGTAAGATTGACC%",
256 "%CAAAGGACTGAAAAATTACTAACGGTAAGATTGAC%",
257 "%ACAAAGGACTGAAAAATTACTAACGGTAAGATTGA%",
258 "%AACAAAGGACTGAAAAATTACTAACGGTAAGATTG%",
259 "%CAACAAAGGACTGAAAAATTACTAACGGTAAGATT%",
260 "%ACAACAAAGGACTGAAAAATTACTAACGGTAAGAT%",
261 "%GACAACAAAGGACTGAAAAATTACTAACGGTAAGA%",
262 "%GGACAACAAAGGACTGAAAAATTACTAACGGTAAG%",
263 "%TGGACAACAAAGGACTGAAAAATTACTAACGGTAA%",
264 "%GTGGACAACAAAGGACTGAAAAATTACTAACGGTA%",
265 "%CGTGGACAACAAAGGACTGAAAAATTACTAACGGT%",
266 "%TCGTGGACAACAAAGGACTGAAAAATTACTAACGG%",
267 "%GTCGTGGACAACAAAGGACTGAAAAATTACTAACG%",
268 "%GGTCGTGGACAACAAAGGACTGAAAAATTACTAAC%",
269 "%AGGTCGTGGACAACAAAGGACTGAAAAATTACTAA%",
270 "%GAGGTCGTGGACAACAAAGGACTGAAAAATTACTA%",
271 "%AGAGGTCGTGGACAACAAAGGACTGAAAAATTACT%",
272 "%GAGAGGTCGTGGACAACAAAGGACTGAAAAATTAC%",
273 "%GGAGAGGTCGTGGACAACAAAGGACTGAAAAATTA%",
274 "%AGGAGAGGTCGTGGACAACAAAGGACTGAAAAATT%",
275 "%TAGGAGAGGTCGTGGACAACAAAGGACTGAAAAAT%",
276 "%GTAGGAGAGGTCGTGGACAACAAAGGACTGAAAAA%",
277 "%CGTAGGAGAGGTCGTGGACAACAAAGGACTGAAAA%",
278 "%GCGTAGGAGAGGTCGTGGACAACAAAGGACTGAAA%",
279 "%GGCGTAGGAGAGGTCGTGGACAACAAAGGACTGAA%",
280 "%AGGCGTAGGAGAGGTCGTGGACAACAAAGGACTGA%",
281 "%GAGGCGTAGGAGAGGTCGTGGACAACAAAGGACTG%",
282 "%AGAGGCGTAGGAGAGGTCGTGGACAACAAAGGACT%",
283 "%AAGAGGCGTAGGAGAGGTCGTGGACAACAAAGGAC%",
284 "%AAAGAGGCGTAGGAGAGGTCGTGGACAACAAAGGA%",
285 "%TAAAGAGGCGTAGGAGAGGTCGTGGACAACAAAGG%",
286 "%ATAAAGAGGCGTAGGAGAGGTCGTGGACAACAAAG%",
287 "%GATAAAGAGGCGTAGGAGAGGTCGTGGACAACAAA%",
288 "%GGATAAAGAGGCGTAGGAGAGGTCGTGGACAACAA%",
289 "%AGGATAAAGAGGCGTAGGAGAGGTCGTGGACAACA%",
290 "%AAGGATAAAGAGGCGTAGGAGAGGTCGTGGACAAC%",
291 "%CAAGGATAAAGAGGCGTAGGAGAGGTCGTGGACAA%",
292 "%ACAAGGATAAAGAGGCGTAGGAGAGGTCGTGGACA%",
293 "%CACAAGGATAAAGAGGCGTAGGAGAGGTCGTGGAC%"
294 };
295
296 INSTANTIATE_TEST_CASE_P(FalseNeedlesTest, ItemFalseLikeTestP,
297 ::testing::ValuesIn(falseNeedles));
298
TEST_P(ItemFalseLikeTestP,FalseNeedlesTest)299 TEST_P(ItemFalseLikeTestP,FalseNeedlesTest)
300 {
301 Item_string *it_haystack=
302 new Item_string(STRING_WITH_LEN(haystack), &my_charset_latin1);
303 Item_string *it_needle=
304 new Item_string(m_needle, strlen(m_needle), &my_charset_latin1);
305 Item_string *it_escape=
306 new Item_string(STRING_WITH_LEN(escape), &my_charset_latin1);
307
308 Item_func_like *item_BM=
309 new Item_func_like(it_haystack, it_needle, it_escape, false);
310 EXPECT_FALSE(item_BM->fix_fields(thd(), NULL));
311 EXPECT_EQ(0, item_BM->val_int());
312 }
313
314
315 }
316