/contrib/citext/citext.sql.in

https://github.com/gurjeet/postgres · Autoconf · 488 lines · 407 code · 81 blank · 0 comment · 7 complexity · 95bfbbeb0deca3d6444bb566c291c0fc MD5 · raw file

  1. /* contrib/citext/citext.sql.in */
  2. -- Adjust this setting to control where the objects get created.
  3. SET search_path = public;
  4. --
  5. -- PostgreSQL code for CITEXT.
  6. --
  7. -- Most I/O functions, and a few others, piggyback on the "text" type
  8. -- functions via the implicit cast to text.
  9. --
  10. --
  11. -- Shell type to keep things a bit quieter.
  12. --
  13. CREATE TYPE citext;
  14. --
  15. -- Input and output functions.
  16. --
  17. CREATE OR REPLACE FUNCTION citextin(cstring)
  18. RETURNS citext
  19. AS 'textin'
  20. LANGUAGE internal IMMUTABLE STRICT;
  21. CREATE OR REPLACE FUNCTION citextout(citext)
  22. RETURNS cstring
  23. AS 'textout'
  24. LANGUAGE internal IMMUTABLE STRICT;
  25. CREATE OR REPLACE FUNCTION citextrecv(internal)
  26. RETURNS citext
  27. AS 'textrecv'
  28. LANGUAGE internal STABLE STRICT;
  29. CREATE OR REPLACE FUNCTION citextsend(citext)
  30. RETURNS bytea
  31. AS 'textsend'
  32. LANGUAGE internal STABLE STRICT;
  33. --
  34. -- The type itself.
  35. --
  36. CREATE TYPE citext (
  37. INPUT = citextin,
  38. OUTPUT = citextout,
  39. RECEIVE = citextrecv,
  40. SEND = citextsend,
  41. INTERNALLENGTH = VARIABLE,
  42. STORAGE = extended,
  43. -- make it a non-preferred member of string type category
  44. CATEGORY = 'S',
  45. PREFERRED = false
  46. );
  47. --
  48. -- Type casting functions for those situations where the I/O casts don't
  49. -- automatically kick in.
  50. --
  51. CREATE OR REPLACE FUNCTION citext(bpchar)
  52. RETURNS citext
  53. AS 'rtrim1'
  54. LANGUAGE internal IMMUTABLE STRICT;
  55. CREATE OR REPLACE FUNCTION citext(boolean)
  56. RETURNS citext
  57. AS 'booltext'
  58. LANGUAGE internal IMMUTABLE STRICT;
  59. CREATE OR REPLACE FUNCTION citext(inet)
  60. RETURNS citext
  61. AS 'network_show'
  62. LANGUAGE internal IMMUTABLE STRICT;
  63. --
  64. -- Implicit and assignment type casts.
  65. --
  66. CREATE CAST (citext AS text) WITHOUT FUNCTION AS IMPLICIT;
  67. CREATE CAST (citext AS varchar) WITHOUT FUNCTION AS IMPLICIT;
  68. CREATE CAST (citext AS bpchar) WITHOUT FUNCTION AS ASSIGNMENT;
  69. CREATE CAST (text AS citext) WITHOUT FUNCTION AS ASSIGNMENT;
  70. CREATE CAST (varchar AS citext) WITHOUT FUNCTION AS ASSIGNMENT;
  71. CREATE CAST (bpchar AS citext) WITH FUNCTION citext(bpchar) AS ASSIGNMENT;
  72. CREATE CAST (boolean AS citext) WITH FUNCTION citext(boolean) AS ASSIGNMENT;
  73. CREATE CAST (inet AS citext) WITH FUNCTION citext(inet) AS ASSIGNMENT;
  74. --
  75. -- Operator Functions.
  76. --
  77. CREATE OR REPLACE FUNCTION citext_eq( citext, citext )
  78. RETURNS bool
  79. AS 'MODULE_PATHNAME'
  80. LANGUAGE C IMMUTABLE STRICT;
  81. CREATE OR REPLACE FUNCTION citext_ne( citext, citext )
  82. RETURNS bool
  83. AS 'MODULE_PATHNAME'
  84. LANGUAGE C IMMUTABLE STRICT;
  85. CREATE OR REPLACE FUNCTION citext_lt( citext, citext )
  86. RETURNS bool
  87. AS 'MODULE_PATHNAME'
  88. LANGUAGE C IMMUTABLE STRICT;
  89. CREATE OR REPLACE FUNCTION citext_le( citext, citext )
  90. RETURNS bool
  91. AS 'MODULE_PATHNAME'
  92. LANGUAGE C IMMUTABLE STRICT;
  93. CREATE OR REPLACE FUNCTION citext_gt( citext, citext )
  94. RETURNS bool
  95. AS 'MODULE_PATHNAME'
  96. LANGUAGE C IMMUTABLE STRICT;
  97. CREATE OR REPLACE FUNCTION citext_ge( citext, citext )
  98. RETURNS bool
  99. AS 'MODULE_PATHNAME'
  100. LANGUAGE C IMMUTABLE STRICT;
  101. --
  102. -- Operators.
  103. --
  104. CREATE OPERATOR = (
  105. LEFTARG = CITEXT,
  106. RIGHTARG = CITEXT,
  107. COMMUTATOR = =,
  108. NEGATOR = <>,
  109. PROCEDURE = citext_eq,
  110. RESTRICT = eqsel,
  111. JOIN = eqjoinsel,
  112. HASHES,
  113. MERGES
  114. );
  115. CREATE OPERATOR <> (
  116. LEFTARG = CITEXT,
  117. RIGHTARG = CITEXT,
  118. NEGATOR = =,
  119. COMMUTATOR = <>,
  120. PROCEDURE = citext_ne,
  121. RESTRICT = neqsel,
  122. JOIN = neqjoinsel
  123. );
  124. CREATE OPERATOR < (
  125. LEFTARG = CITEXT,
  126. RIGHTARG = CITEXT,
  127. NEGATOR = >=,
  128. COMMUTATOR = >,
  129. PROCEDURE = citext_lt,
  130. RESTRICT = scalarltsel,
  131. JOIN = scalarltjoinsel
  132. );
  133. CREATE OPERATOR <= (
  134. LEFTARG = CITEXT,
  135. RIGHTARG = CITEXT,
  136. NEGATOR = >,
  137. COMMUTATOR = >=,
  138. PROCEDURE = citext_le,
  139. RESTRICT = scalarltsel,
  140. JOIN = scalarltjoinsel
  141. );
  142. CREATE OPERATOR >= (
  143. LEFTARG = CITEXT,
  144. RIGHTARG = CITEXT,
  145. NEGATOR = <,
  146. COMMUTATOR = <=,
  147. PROCEDURE = citext_ge,
  148. RESTRICT = scalargtsel,
  149. JOIN = scalargtjoinsel
  150. );
  151. CREATE OPERATOR > (
  152. LEFTARG = CITEXT,
  153. RIGHTARG = CITEXT,
  154. NEGATOR = <=,
  155. COMMUTATOR = <,
  156. PROCEDURE = citext_gt,
  157. RESTRICT = scalargtsel,
  158. JOIN = scalargtjoinsel
  159. );
  160. --
  161. -- Support functions for indexing.
  162. --
  163. CREATE OR REPLACE FUNCTION citext_cmp(citext, citext)
  164. RETURNS int4
  165. AS 'MODULE_PATHNAME'
  166. LANGUAGE C STRICT IMMUTABLE;
  167. CREATE OR REPLACE FUNCTION citext_hash(citext)
  168. RETURNS int4
  169. AS 'MODULE_PATHNAME'
  170. LANGUAGE C STRICT IMMUTABLE;
  171. --
  172. -- The btree indexing operator class.
  173. --
  174. CREATE OPERATOR CLASS citext_ops
  175. DEFAULT FOR TYPE CITEXT USING btree AS
  176. OPERATOR 1 < (citext, citext),
  177. OPERATOR 2 <= (citext, citext),
  178. OPERATOR 3 = (citext, citext),
  179. OPERATOR 4 >= (citext, citext),
  180. OPERATOR 5 > (citext, citext),
  181. FUNCTION 1 citext_cmp(citext, citext);
  182. --
  183. -- The hash indexing operator class.
  184. --
  185. CREATE OPERATOR CLASS citext_ops
  186. DEFAULT FOR TYPE citext USING hash AS
  187. OPERATOR 1 = (citext, citext),
  188. FUNCTION 1 citext_hash(citext);
  189. --
  190. -- Aggregates.
  191. --
  192. CREATE OR REPLACE FUNCTION citext_smaller(citext, citext)
  193. RETURNS citext
  194. AS 'MODULE_PATHNAME'
  195. LANGUAGE 'C' IMMUTABLE STRICT;
  196. CREATE OR REPLACE FUNCTION citext_larger(citext, citext)
  197. RETURNS citext
  198. AS 'MODULE_PATHNAME'
  199. LANGUAGE 'C' IMMUTABLE STRICT;
  200. CREATE AGGREGATE min(citext) (
  201. SFUNC = citext_smaller,
  202. STYPE = citext,
  203. SORTOP = <
  204. );
  205. CREATE AGGREGATE max(citext) (
  206. SFUNC = citext_larger,
  207. STYPE = citext,
  208. SORTOP = >
  209. );
  210. --
  211. -- CITEXT pattern matching.
  212. --
  213. CREATE OR REPLACE FUNCTION texticlike(citext, citext)
  214. RETURNS bool AS 'texticlike'
  215. LANGUAGE internal IMMUTABLE STRICT;
  216. CREATE OR REPLACE FUNCTION texticnlike(citext, citext)
  217. RETURNS bool AS 'texticnlike'
  218. LANGUAGE internal IMMUTABLE STRICT;
  219. CREATE OR REPLACE FUNCTION texticregexeq(citext, citext)
  220. RETURNS bool AS 'texticregexeq'
  221. LANGUAGE internal IMMUTABLE STRICT;
  222. CREATE OR REPLACE FUNCTION texticregexne(citext, citext)
  223. RETURNS bool AS 'texticregexne'
  224. LANGUAGE internal IMMUTABLE STRICT;
  225. CREATE OPERATOR ~ (
  226. PROCEDURE = texticregexeq,
  227. LEFTARG = citext,
  228. RIGHTARG = citext,
  229. NEGATOR = !~,
  230. RESTRICT = icregexeqsel,
  231. JOIN = icregexeqjoinsel
  232. );
  233. CREATE OPERATOR ~* (
  234. PROCEDURE = texticregexeq,
  235. LEFTARG = citext,
  236. RIGHTARG = citext,
  237. NEGATOR = !~*,
  238. RESTRICT = icregexeqsel,
  239. JOIN = icregexeqjoinsel
  240. );
  241. CREATE OPERATOR !~ (
  242. PROCEDURE = texticregexne,
  243. LEFTARG = citext,
  244. RIGHTARG = citext,
  245. NEGATOR = ~,
  246. RESTRICT = icregexnesel,
  247. JOIN = icregexnejoinsel
  248. );
  249. CREATE OPERATOR !~* (
  250. PROCEDURE = texticregexne,
  251. LEFTARG = citext,
  252. RIGHTARG = citext,
  253. NEGATOR = ~*,
  254. RESTRICT = icregexnesel,
  255. JOIN = icregexnejoinsel
  256. );
  257. CREATE OPERATOR ~~ (
  258. PROCEDURE = texticlike,
  259. LEFTARG = citext,
  260. RIGHTARG = citext,
  261. NEGATOR = !~~,
  262. RESTRICT = iclikesel,
  263. JOIN = iclikejoinsel
  264. );
  265. CREATE OPERATOR ~~* (
  266. PROCEDURE = texticlike,
  267. LEFTARG = citext,
  268. RIGHTARG = citext,
  269. NEGATOR = !~~*,
  270. RESTRICT = iclikesel,
  271. JOIN = iclikejoinsel
  272. );
  273. CREATE OPERATOR !~~ (
  274. PROCEDURE = texticnlike,
  275. LEFTARG = citext,
  276. RIGHTARG = citext,
  277. NEGATOR = ~~,
  278. RESTRICT = icnlikesel,
  279. JOIN = icnlikejoinsel
  280. );
  281. CREATE OPERATOR !~~* (
  282. PROCEDURE = texticnlike,
  283. LEFTARG = citext,
  284. RIGHTARG = citext,
  285. NEGATOR = ~~*,
  286. RESTRICT = icnlikesel,
  287. JOIN = icnlikejoinsel
  288. );
  289. --
  290. -- Matching citext to text.
  291. --
  292. CREATE OR REPLACE FUNCTION texticlike(citext, text)
  293. RETURNS bool AS 'texticlike'
  294. LANGUAGE internal IMMUTABLE STRICT;
  295. CREATE OR REPLACE FUNCTION texticnlike(citext, text)
  296. RETURNS bool AS 'texticnlike'
  297. LANGUAGE internal IMMUTABLE STRICT;
  298. CREATE OR REPLACE FUNCTION texticregexeq(citext, text)
  299. RETURNS bool AS 'texticregexeq'
  300. LANGUAGE internal IMMUTABLE STRICT;
  301. CREATE OR REPLACE FUNCTION texticregexne(citext, text)
  302. RETURNS bool AS 'texticregexne'
  303. LANGUAGE internal IMMUTABLE STRICT;
  304. CREATE OPERATOR ~ (
  305. PROCEDURE = texticregexeq,
  306. LEFTARG = citext,
  307. RIGHTARG = text,
  308. NEGATOR = !~,
  309. RESTRICT = icregexeqsel,
  310. JOIN = icregexeqjoinsel
  311. );
  312. CREATE OPERATOR ~* (
  313. PROCEDURE = texticregexeq,
  314. LEFTARG = citext,
  315. RIGHTARG = text,
  316. NEGATOR = !~*,
  317. RESTRICT = icregexeqsel,
  318. JOIN = icregexeqjoinsel
  319. );
  320. CREATE OPERATOR !~ (
  321. PROCEDURE = texticregexne,
  322. LEFTARG = citext,
  323. RIGHTARG = text,
  324. NEGATOR = ~,
  325. RESTRICT = icregexnesel,
  326. JOIN = icregexnejoinsel
  327. );
  328. CREATE OPERATOR !~* (
  329. PROCEDURE = texticregexne,
  330. LEFTARG = citext,
  331. RIGHTARG = text,
  332. NEGATOR = ~*,
  333. RESTRICT = icregexnesel,
  334. JOIN = icregexnejoinsel
  335. );
  336. CREATE OPERATOR ~~ (
  337. PROCEDURE = texticlike,
  338. LEFTARG = citext,
  339. RIGHTARG = text,
  340. NEGATOR = !~~,
  341. RESTRICT = iclikesel,
  342. JOIN = iclikejoinsel
  343. );
  344. CREATE OPERATOR ~~* (
  345. PROCEDURE = texticlike,
  346. LEFTARG = citext,
  347. RIGHTARG = text,
  348. NEGATOR = !~~*,
  349. RESTRICT = iclikesel,
  350. JOIN = iclikejoinsel
  351. );
  352. CREATE OPERATOR !~~ (
  353. PROCEDURE = texticnlike,
  354. LEFTARG = citext,
  355. RIGHTARG = text,
  356. NEGATOR = ~~,
  357. RESTRICT = icnlikesel,
  358. JOIN = icnlikejoinsel
  359. );
  360. CREATE OPERATOR !~~* (
  361. PROCEDURE = texticnlike,
  362. LEFTARG = citext,
  363. RIGHTARG = text,
  364. NEGATOR = ~~*,
  365. RESTRICT = icnlikesel,
  366. JOIN = icnlikejoinsel
  367. );
  368. --
  369. -- Matching citext in string comparison functions.
  370. -- XXX TODO Ideally these would be implemented in C.
  371. --
  372. CREATE OR REPLACE FUNCTION regexp_matches( citext, citext ) RETURNS TEXT[] AS $$
  373. SELECT pg_catalog.regexp_matches( $1::pg_catalog.text, $2::pg_catalog.text, 'i' );
  374. $$ LANGUAGE SQL IMMUTABLE STRICT;
  375. CREATE OR REPLACE FUNCTION regexp_matches( citext, citext, text ) RETURNS TEXT[] AS $$
  376. SELECT pg_catalog.regexp_matches( $1::pg_catalog.text, $2::pg_catalog.text, CASE WHEN pg_catalog.strpos($3, 'c') = 0 THEN $3 || 'i' ELSE $3 END );
  377. $$ LANGUAGE SQL IMMUTABLE STRICT;
  378. CREATE OR REPLACE FUNCTION regexp_replace( citext, citext, text ) returns TEXT AS $$
  379. SELECT pg_catalog.regexp_replace( $1::pg_catalog.text, $2::pg_catalog.text, $3, 'i');
  380. $$ LANGUAGE SQL IMMUTABLE STRICT;
  381. CREATE OR REPLACE FUNCTION regexp_replace( citext, citext, text, text ) returns TEXT AS $$
  382. SELECT pg_catalog.regexp_replace( $1::pg_catalog.text, $2::pg_catalog.text, $3, CASE WHEN pg_catalog.strpos($4, 'c') = 0 THEN $4 || 'i' ELSE $4 END);
  383. $$ LANGUAGE SQL IMMUTABLE STRICT;
  384. CREATE OR REPLACE FUNCTION regexp_split_to_array( citext, citext ) RETURNS TEXT[] AS $$
  385. SELECT pg_catalog.regexp_split_to_array( $1::pg_catalog.text, $2::pg_catalog.text, 'i' );
  386. $$ LANGUAGE SQL IMMUTABLE STRICT;
  387. CREATE OR REPLACE FUNCTION regexp_split_to_array( citext, citext, text ) RETURNS TEXT[] AS $$
  388. SELECT pg_catalog.regexp_split_to_array( $1::pg_catalog.text, $2::pg_catalog.text, CASE WHEN pg_catalog.strpos($3, 'c') = 0 THEN $3 || 'i' ELSE $3 END );
  389. $$ LANGUAGE SQL IMMUTABLE STRICT;
  390. CREATE OR REPLACE FUNCTION regexp_split_to_table( citext, citext ) RETURNS SETOF TEXT AS $$
  391. SELECT pg_catalog.regexp_split_to_table( $1::pg_catalog.text, $2::pg_catalog.text, 'i' );
  392. $$ LANGUAGE SQL IMMUTABLE STRICT;
  393. CREATE OR REPLACE FUNCTION regexp_split_to_table( citext, citext, text ) RETURNS SETOF TEXT AS $$
  394. SELECT pg_catalog.regexp_split_to_table( $1::pg_catalog.text, $2::pg_catalog.text, CASE WHEN pg_catalog.strpos($3, 'c') = 0 THEN $3 || 'i' ELSE $3 END );
  395. $$ LANGUAGE SQL IMMUTABLE STRICT;
  396. CREATE OR REPLACE FUNCTION strpos( citext, citext ) RETURNS INT AS $$
  397. SELECT pg_catalog.strpos( pg_catalog.lower( $1::pg_catalog.text ), pg_catalog.lower( $2::pg_catalog.text ) );
  398. $$ LANGUAGE SQL IMMUTABLE STRICT;
  399. CREATE OR REPLACE FUNCTION replace( citext, citext, citext ) RETURNS TEXT AS $$
  400. SELECT pg_catalog.regexp_replace( $1::pg_catalog.text, pg_catalog.regexp_replace($2::pg_catalog.text, '([^a-zA-Z_0-9])', E'\\\\\\1', 'g'), $3::pg_catalog.text, 'gi' );
  401. $$ LANGUAGE SQL IMMUTABLE STRICT;
  402. CREATE OR REPLACE FUNCTION split_part( citext, citext, int ) RETURNS TEXT AS $$
  403. SELECT (pg_catalog.regexp_split_to_array( $1::pg_catalog.text, pg_catalog.regexp_replace($2::pg_catalog.text, '([^a-zA-Z_0-9])', E'\\\\\\1', 'g'), 'i'))[$3];
  404. $$ LANGUAGE SQL IMMUTABLE STRICT;
  405. CREATE OR REPLACE FUNCTION translate( citext, citext, text ) RETURNS TEXT AS $$
  406. SELECT pg_catalog.translate( pg_catalog.translate( $1::pg_catalog.text, pg_catalog.lower($2::pg_catalog.text), $3), pg_catalog.upper($2::pg_catalog.text), $3);
  407. $$ LANGUAGE SQL IMMUTABLE STRICT;