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