like.slt 10 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034
  1. # Copyright 2015 - 2019 The Cockroach Authors. All rights reserved.
  2. # Copyright Materialize, Inc. and contributors. All rights reserved.
  3. #
  4. # Use of this software is governed by the Business Source License
  5. # included in the LICENSE file at the root of this repository.
  6. #
  7. # As of the Change Date specified in that file, in accordance with
  8. # the Business Source License, use of this software will be governed
  9. # by the Apache License, Version 2.0.
  10. #
  11. # This file is derived from the logic test suite in CockroachDB. The
  12. # original file was retrieved on June 10, 2019 from:
  13. #
  14. # https://github.com/cockroachdb/cockroach/blob/d2f7fbf5dd1fc1a099bbad790a2e1f7c60a66cc3/pkg/sql/sem/tree/testdata/eval/like
  15. #
  16. # The original source code is subject to the terms of the Apache
  17. # 2.0 license, a copy of which can be found in the LICENSE file at the
  18. # root of this repository.
  19. query B
  20. SELECT '' LIKE 'TEST'
  21. ----
  22. false
  23. query B
  24. SELECT 'T' LIKE 'TEST'
  25. ----
  26. false
  27. query B
  28. SELECT 'TEST' LIKE 'TEST'
  29. ----
  30. true
  31. query B
  32. SELECT 'TESTS' LIKE 'TEST'
  33. ----
  34. false
  35. query B
  36. SELECT 'TESTESTEST' LIKE 'TEST'
  37. ----
  38. false
  39. query B
  40. SELECT 'TEST' LIKE 'test'
  41. ----
  42. false
  43. query B
  44. SELECT 'TEST' ILIKE 'test'
  45. ----
  46. true
  47. query B
  48. SELECT 'TEST' LIKE 'TESTER'
  49. ----
  50. false
  51. query B
  52. SELECT 'TEST' LIKE ''
  53. ----
  54. false
  55. query B
  56. SELECT '' LIKE ''
  57. ----
  58. true
  59. query B
  60. SELECT '' LIKE '%'
  61. ----
  62. true
  63. query B
  64. SELECT '' LIKE '_'
  65. ----
  66. false
  67. query B
  68. SELECT 'a
  69. b' LIKE '%'
  70. ----
  71. true
  72. query B
  73. SELECT 'a
  74. b' ILIKE '%'
  75. ----
  76. true
  77. query B
  78. SELECT 'a'::char(10) LIKE 'a'
  79. ----
  80. false
  81. query B
  82. SELECT 'a'::char(10) NOT LIKE 'a'
  83. ----
  84. true
  85. query B
  86. SELECT 'a'::char(10) ILIKE 'a'
  87. ----
  88. false
  89. query B
  90. SELECT 'a'::char(10) NOT ILIKE 'a'
  91. ----
  92. true
  93. query B
  94. SELECT '' LIKE 'foo'
  95. ----
  96. false
  97. query B
  98. SELECT 'foo' LIKE 'foo'
  99. ----
  100. true
  101. query B
  102. SELECT 'bar' LIKE 'foo'
  103. ----
  104. false
  105. query B
  106. SELECT 'foo' LIKE 'food'
  107. ----
  108. false
  109. # UNICODE and case folding
  110. query B
  111. SELECT 'TEST' LIKE 'ΜΆΪΟΣ'
  112. ----
  113. false
  114. query B
  115. SELECT 'ΜΆΪΟΣ' LIKE 'ΜΆΪΟΣ'
  116. ----
  117. true
  118. query B
  119. SELECT 'Μάϊος' LIKE 'ΜΆΪΟΣ'
  120. ----
  121. false
  122. query B
  123. SELECT 'Μάϊος' ILIKE 'ΜΆΪΟΣ'
  124. ----
  125. true
  126. # Single-character wildcard in middle of pattern
  127. query B
  128. SELECT 'foo' LIKE 'b_t'
  129. ----
  130. false
  131. query B
  132. SELECT 'b' LIKE 'b_t'
  133. ----
  134. false
  135. query B
  136. SELECT 'bt' LIKE 'b_t'
  137. ----
  138. false
  139. query B
  140. SELECT 'but' LIKE 'b_t'
  141. ----
  142. true
  143. query B
  144. SELECT 'butt' LIKE 'b_t'
  145. ----
  146. false
  147. query B
  148. SELECT 'boot' LIKE 'b__t'
  149. ----
  150. true
  151. query B
  152. SELECT 'ii' LIKE '_i_i'
  153. ----
  154. false
  155. query B
  156. SELECT 'iii' LIKE '_i_i'
  157. ----
  158. false
  159. query B
  160. SELECT 'wifi' LIKE '_i_i'
  161. ----
  162. true
  163. query B
  164. SELECT 'wifi!' LIKE '_i_i'
  165. ----
  166. false
  167. # Single-character wildcard at beginning of pattern
  168. query B
  169. SELECT 'a' LIKE '_'
  170. ----
  171. true
  172. query B
  173. SELECT 'aa' LIKE '_'
  174. ----
  175. false
  176. query B
  177. SELECT 't' LIKE '_o'
  178. ----
  179. false
  180. query B
  181. SELECT 'to' LIKE '_o'
  182. ----
  183. true
  184. query B
  185. SELECT 'too' LIKE '_o'
  186. ----
  187. false
  188. query B
  189. SELECT 'to' LIKE '__o'
  190. ----
  191. false
  192. query B
  193. SELECT 'too' LIKE '__o'
  194. ----
  195. true
  196. query B
  197. SELECT 'tool' LIKE '__o'
  198. ----
  199. false
  200. query B
  201. SELECT '漢漢' LIKE '_漢'
  202. ----
  203. true
  204. # Single-character wildcard at the end of a pattern
  205. query B
  206. SELECT 'a' LIKE 'a_'
  207. ----
  208. false
  209. query B
  210. SELECT 'aa' LIKE 'a_'
  211. ----
  212. true
  213. query B
  214. SELECT 'f' LIKE 'f___'
  215. ----
  216. false
  217. query B
  218. SELECT 'foo' LIKE 'f___'
  219. ----
  220. false
  221. query B
  222. SELECT 'food' LIKE 'f___'
  223. ----
  224. true
  225. query B
  226. SELECT 'foods' LIKE 'f___'
  227. ----
  228. false
  229. query B
  230. SELECT '漢漢' LIKE '漢_'
  231. ----
  232. true
  233. # Multiple-character wildcard at beginning of pattern
  234. query B
  235. SELECT '' LIKE '%a'
  236. ----
  237. false
  238. query B
  239. SELECT 'a' LIKE '%a'
  240. ----
  241. true
  242. query B
  243. SELECT 'b' LIKE '%a'
  244. ----
  245. false
  246. query B
  247. SELECT 'aaa' LIKE '%a'
  248. ----
  249. true
  250. query B
  251. SELECT 'baaa' LIKE '%a'
  252. ----
  253. true
  254. query B
  255. SELECT 'bad' LIKE '%a'
  256. ----
  257. false
  258. query B
  259. SELECT 'a' LIKE '%%%%a'
  260. ----
  261. true
  262. query B
  263. SELECT 'baaa' LIKE '%%%%a'
  264. ----
  265. true
  266. query B
  267. SELECT 'AAA' LIKE '%AA%A'
  268. ----
  269. true
  270. # Multiple-character wildcard in middle of pattern
  271. query B
  272. SELECT '' LIKE 'f%d'
  273. ----
  274. false
  275. query B
  276. SELECT 'fd' LIKE 'f%d'
  277. ----
  278. true
  279. query B
  280. SELECT 'fa' LIKE 'f%d'
  281. ----
  282. false
  283. query B
  284. SELECT 'fad' LIKE 'f%d'
  285. ----
  286. true
  287. query B
  288. SELECT 'food' LIKE 'f%d'
  289. ----
  290. true
  291. query B
  292. SELECT 'fooooooooooooood' LIKE 'f%d'
  293. ----
  294. true
  295. query B
  296. SELECT 'foods' LIKE 'f%d'
  297. ----
  298. false
  299. query B
  300. SELECT 'bar' LIKE 'f%d'
  301. ----
  302. false
  303. query B
  304. SELECT 'fad' LIKE 'f%%d'
  305. ----
  306. true
  307. query B
  308. SELECT 'food' LIKE 'f%%d'
  309. ----
  310. true
  311. query B
  312. SELECT 'foods' LIKE 'f%%d'
  313. ----
  314. false
  315. query B
  316. SELECT 'food' LIKE 'f%d%e'
  317. ----
  318. false
  319. query B
  320. SELECT 'foodie' LIKE 'f%d%e'
  321. ----
  322. true
  323. # Multiple-character wildcard at end of pattern
  324. query B
  325. SELECT '' LIKE 'f%'
  326. ----
  327. false
  328. query B
  329. SELECT 'f' LIKE 'f%'
  330. ----
  331. true
  332. query B
  333. SELECT 'fi' LIKE 'f%'
  334. ----
  335. true
  336. query B
  337. SELECT 'foo' LIKE 'f%'
  338. ----
  339. true
  340. query B
  341. SELECT 'bar' LIKE 'f%'
  342. ----
  343. false
  344. query B
  345. SELECT 'f' LIKE 'f%%%'
  346. ----
  347. true
  348. query B
  349. SELECT 'foo' LIKE 'f%%%'
  350. ----
  351. true
  352. # Mixed patterns
  353. query B
  354. SELECT 'aaa' LIKE '%aa_'
  355. ----
  356. true
  357. query B
  358. SELECT 'fd' LIKE 'f%_d'
  359. ----
  360. false
  361. query B
  362. SELECT 'fed' LIKE 'f%_d'
  363. ----
  364. true
  365. query B
  366. SELECT 'food' LIKE 'f%_d'
  367. ----
  368. true
  369. query B
  370. SELECT 'fd' LIKE 'f_%d'
  371. ----
  372. false
  373. query B
  374. SELECT 'fed' LIKE 'f_%d'
  375. ----
  376. true
  377. query B
  378. SELECT 'food' LIKE 'f_%d'
  379. ----
  380. true
  381. # Regex special characters.
  382. query B
  383. SELECT '[' LIKE '['
  384. ----
  385. true
  386. query B
  387. SELECT '.' LIKE '.'
  388. ----
  389. true
  390. query B
  391. SELECT '.A' LIKE '._'
  392. ----
  393. true
  394. query B
  395. SELECT 'AB' LIKE '._'
  396. ----
  397. false
  398. query B
  399. SELECT '.*B' LIKE '.*B'
  400. ----
  401. true
  402. query B
  403. SELECT 'AB' LIKE '.*B'
  404. ----
  405. false
  406. # Escaped character cases.
  407. query B
  408. SELECT '[' LIKE '\['
  409. ----
  410. true
  411. query B
  412. SELECT '.' LIKE '\.'
  413. ----
  414. true
  415. query B
  416. SELECT '\' LIKE '\\%'
  417. ----
  418. true
  419. query B
  420. SELECT '\' LIKE '%\\'
  421. ----
  422. true
  423. query B
  424. SELECT '\' LIKE '%\\%'
  425. ----
  426. true
  427. query B
  428. SELECT '\%' LIKE '\\\%'
  429. ----
  430. true
  431. query B
  432. SELECT '\.*' LIKE '\\.*'
  433. ----
  434. true
  435. query B
  436. SELECT '\.*' LIKE '\\.\*'
  437. ----
  438. true
  439. query B
  440. SELECT '\.*' LIKE '\\\.\*'
  441. ----
  442. true
  443. query B
  444. SELECT '\\.' LIKE '\\.'
  445. ----
  446. false
  447. query B
  448. SELECT '\\.' LIKE '\\\\.'
  449. ----
  450. true
  451. query B
  452. SELECT '\\.' LIKE '\\\\\.'
  453. ----
  454. true
  455. query B
  456. SELECT '\A' LIKE '\\A'
  457. ----
  458. true
  459. query B
  460. SELECT 'A' LIKE '\\A'
  461. ----
  462. false
  463. query B
  464. SELECT '_' LIKE '\_'
  465. ----
  466. true
  467. query B
  468. SELECT '\' LIKE '\\'
  469. ----
  470. true
  471. query B
  472. SELECT 'A\A' LIKE '_\\_'
  473. ----
  474. true
  475. query B
  476. SELECT '__' LIKE '_\\_'
  477. ----
  478. false
  479. query B
  480. SELECT '\_' LIKE '\\\_'
  481. ----
  482. true
  483. query B
  484. SELECT '\\' LIKE '\\'
  485. ----
  486. false
  487. query B
  488. SELECT '\\' LIKE '\\_'
  489. ----
  490. true
  491. query B
  492. SELECT '\\' LIKE '_\\'
  493. ----
  494. true
  495. query B
  496. SELECT 'A\' LIKE '_\\'
  497. ----
  498. true
  499. query B
  500. SELECT '%' LIKE '\%'
  501. ----
  502. true
  503. query B
  504. SELECT 'ABC' LIKE '\AB%'
  505. ----
  506. true
  507. query B
  508. SELECT 'ABC' LIKE '\AB_'
  509. ----
  510. true
  511. query B
  512. SELECT 'ABC' LIKE '%B\C'
  513. ----
  514. true
  515. query B
  516. SELECT 'ABC' LIKE '_B\C'
  517. ----
  518. true
  519. query B
  520. SELECT 'TEST' LIKE 'TE\ST'
  521. ----
  522. true
  523. query B
  524. SELECT '_漢' LIKE '\__'
  525. ----
  526. true
  527. query B
  528. SELECT '漢漢' LIKE '漢\漢'
  529. ----
  530. true
  531. query B
  532. SELECT '_漢' LIKE '\_\漢'
  533. ----
  534. true
  535. query B
  536. SELECT 'TEST' LIKE 'TE%'
  537. ----
  538. true
  539. query B
  540. SELECT 'TEST' LIKE '%E%'
  541. ----
  542. true
  543. query B
  544. SELECT 'TEST' LIKE '%e%'
  545. ----
  546. false
  547. query B
  548. SELECT 'TEST' LIKE 'TES_'
  549. ----
  550. true
  551. query B
  552. SELECT 'TEST' LIKE 'TE_%'
  553. ----
  554. true
  555. query B
  556. SELECT 'TEST' LIKE 'TE_'
  557. ----
  558. false
  559. query B
  560. SELECT 'TEST' LIKE '%'
  561. ----
  562. true
  563. query B
  564. SELECT 'TEST' LIKE '%R'
  565. ----
  566. false
  567. query B
  568. SELECT 'T' LIKE '\_'
  569. ----
  570. false
  571. query B
  572. SELECT 'T' LIKE '\%'
  573. ----
  574. false
  575. query B
  576. SELECT 'TE_T' LIKE 'TE\_T'
  577. ----
  578. true
  579. query B
  580. SELECT 'TE\AT' LIKE 'TE\_T'
  581. ----
  582. false
  583. query B
  584. SELECT 'TES%T' LIKE 'TES\%T'
  585. ----
  586. true
  587. query B
  588. SELECT 'TES\AT' LIKE 'TES\%T'
  589. ----
  590. false
  591. query B
  592. SELECT 'T' LIKE '_'
  593. ----
  594. true
  595. query B
  596. SELECT 'TE' LIKE '_'
  597. ----
  598. false
  599. query B
  600. SELECT 'TE' LIKE '_%'
  601. ----
  602. true
  603. query B
  604. SELECT 'T' LIKE '_%'
  605. ----
  606. true
  607. query B
  608. SELECT '' LIKE '_%'
  609. ----
  610. false
  611. query B
  612. SELECT 'TE' LIKE '%_'
  613. ----
  614. true
  615. query B
  616. SELECT '' LIKE '%_'
  617. ----
  618. false
  619. query B
  620. SELECT 'T' LIKE '%_'
  621. ----
  622. true
  623. query B
  624. SELECT 'TEST' LIKE '_ES_'
  625. ----
  626. true
  627. query B
  628. SELECT '' LIKE '__'
  629. ----
  630. false
  631. query B
  632. SELECT 'A' LIKE 'T_'
  633. ----
  634. false
  635. query B
  636. SELECT 'A' LIKE '_T'
  637. ----
  638. false
  639. query B
  640. SELECT 'TEST' LIKE '_E%'
  641. ----
  642. true
  643. query B
  644. SELECT 'TEST' LIKE '_E\%'
  645. ----
  646. false
  647. query B
  648. SELECT 'TES_' LIKE '%S\_'
  649. ----
  650. true
  651. query B
  652. SELECT 'TES%' LIKE '%S\%'
  653. ----
  654. true
  655. query B
  656. SELECT 'TES_' LIKE '_ES\_'
  657. ----
  658. true
  659. query B
  660. SELECT 'TES%' LIKE '_ES\%'
  661. ----
  662. true
  663. query B
  664. SELECT 'TEST' LIKE '%S_'
  665. ----
  666. true
  667. query B
  668. SELECT 'TEST' LIKE '%S\_'
  669. ----
  670. false
  671. query B
  672. SELECT 'TEST' NOT LIKE '%E%'
  673. ----
  674. false
  675. query B
  676. SELECT 'TEST' NOT LIKE 'TES_'
  677. ----
  678. false
  679. query B
  680. SELECT 'TEST' NOT LIKE 'TeS_'
  681. ----
  682. true
  683. query B
  684. SELECT 'TEST' NOT LIKE 'TE_'
  685. ----
  686. true
  687. # Test custom escape characters
  688. query B
  689. SELECT 'banana!' LIKE 'ban%na!' ESCAPE 'n'
  690. ----
  691. false
  692. query B
  693. SELECT 'ba%a!' LIKE 'ban%na!' ESCAPE 'n'
  694. ----
  695. true
  696. query B
  697. SELECT 'banana!' LIKE 'ban\ana!' ESCAPE ''
  698. ----
  699. false
  700. query B
  701. SELECT 'ban\ana!' LIKE 'ban\ana!' ESCAPE ''
  702. ----
  703. true
  704. query B
  705. SELECT 'banana!' LIKE 'ban%%%na!' ESCAPE '%'
  706. ----
  707. false
  708. query B
  709. SELECT 'ban%na!' LIKE 'ban%%%na!' ESCAPE '%'
  710. ----
  711. true
  712. query B
  713. SELECT 'banana!' LIKE 'ba\n%na!' ESCAPE '\'
  714. ----
  715. true
  716. # Test bad escaping.
  717. query error unterminated escape sequence in LIKE
  718. SELECT 'a' LIKE '\'
  719. query error invalid escape string
  720. SELECT 'a' LIKE 'a' ESCAPE 'foo'
  721. # Test massive LIKE patterns:
  722. query error LIKE pattern exceeds maximum length
  723. SELECT 'x' LIKE repeat('x', 367416)
  724. # Test nullability
  725. query B
  726. SELECT ('foo' LIKE 'f%') IS NULL;
  727. ----
  728. false
  729. query B
  730. SELECT ('foo' LIKE 'f%' ESCAPE '~') IS NULL;
  731. ----
  732. false
  733. query B
  734. SELECT (NULL LIKE 'f%') IS NULL;
  735. ----
  736. true
  737. query B
  738. SELECT (NULL LIKE 'f%' ESCAPE '~') IS NULL;
  739. ----
  740. true
  741. query B
  742. SELECT ('foo' LIKE NULL) IS NULL;
  743. ----
  744. true
  745. query B
  746. SELECT ('foo' LIKE NULL ESCAPE '~') IS NULL;
  747. ----
  748. true
  749. query B
  750. SELECT ('foo' LIKE 'f%' ESCAPE NULL) IS NULL;
  751. ----
  752. true
  753. # Verify that the PostgreSQL operators work
  754. query B
  755. SELECT 'foo' ~~ 'f%';
  756. ----
  757. true
  758. query B
  759. SELECT 'foo' !~~ 'f%';
  760. ----
  761. false
  762. query B
  763. SELECT 'foo' ~~ 'F%';
  764. ----
  765. false
  766. query B
  767. SELECT 'foo' !~~ 'f%';
  768. ----
  769. false
  770. query B
  771. SELECT 'foo' !~~ 'g%';
  772. ----
  773. true
  774. query B
  775. SELECT 'foo' ~~* 'F%';
  776. ----
  777. true
  778. query B
  779. SELECT 'foo' ~~* 'G%';
  780. ----
  781. false
  782. query B
  783. SELECT 'foo' !~~* 'G%';
  784. ----
  785. true
  786. query B
  787. SELECT 'foo' !~~* 'f%';
  788. ----
  789. false
  790. query B
  791. SELECT (NULL ~~ 'f%') IS NULL;
  792. ----
  793. true
  794. query B
  795. SELECT ('foo' ~~ NULL) IS NULL;
  796. ----
  797. true
  798. query B
  799. SELECT (NULL ~~* 'f%') IS NULL;
  800. ----
  801. true
  802. query B
  803. SELECT ('foo' ~~* NULL) IS NULL;
  804. ----
  805. true
  806. query B
  807. SELECT (NULL !~~ 'f%') IS NULL;
  808. ----
  809. true
  810. query B
  811. SELECT ('foo' !~~ NULL) IS NULL;
  812. ----
  813. true
  814. query B
  815. SELECT (NULL !~~* 'f%') IS NULL;
  816. ----
  817. true
  818. query B
  819. SELECT ('foo' !~~* NULL) IS NULL;
  820. ----
  821. true