inet.slt 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903
  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/logictest/testdata/logic_test/inet
  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. # not supported yet
  20. halt
  21. mode cockroach
  22. # Basic IPv4 tests
  23. query T
  24. SELECT '192.168.1.2/24':::INET;
  25. ----
  26. 192.168.1.2/24
  27. query T
  28. SELECT '192.168.1.2/32':::INET;
  29. ----
  30. 192.168.1.2
  31. query T
  32. SELECT '192.168.1.2':::INET;
  33. ----
  34. 192.168.1.2
  35. query T
  36. SELECT '192.168.1.2/24':::INET;
  37. ----
  38. 192.168.1.2/24
  39. query T
  40. SELECT '0.0.0.0':::INET;
  41. ----
  42. 0.0.0.0
  43. query T
  44. SELECT '::/0'::inet::text::inet;
  45. ----
  46. ::/0
  47. # Basic IPv6 tests
  48. query T
  49. SELECT '::ffff:192.168.1.2':::INET;
  50. ----
  51. ::ffff:192.168.1.2
  52. query T
  53. SELECT '::ffff:192.168.1.2/120':::INET;
  54. ----
  55. ::ffff:192.168.1.2/120
  56. query T
  57. SELECT '::ffff':::INET;
  58. ----
  59. ::ffff
  60. query T
  61. SELECT '2001:4f8:3:ba:2e0:81ff:fe22:d1f1/120':::INET;
  62. ----
  63. 2001:4f8:3:ba:2e0:81ff:fe22:d1f1/120
  64. query T
  65. SELECT '2001:4f8:3:ba:2e0:81ff:fe22:d1f1':::INET;
  66. ----
  67. 2001:4f8:3:ba:2e0:81ff:fe22:d1f1
  68. # Test casting
  69. query T
  70. SELECT '192.168.1.2/24'::INET;
  71. ----
  72. 192.168.1.2/24
  73. query T
  74. SELECT '192.168.1.200/10':::INET
  75. ----
  76. 192.168.1.200/10
  77. # Test for less than 4 octets with mask
  78. query T
  79. SELECT '192.168.1/10':::INET
  80. ----
  81. 192.168.1.0/10
  82. query T
  83. SELECT '192.168/10':::INET
  84. ----
  85. 192.168.0.0/10
  86. query T
  87. SELECT '192/10':::INET
  88. ----
  89. 192.0.0.0/10
  90. # Test for preservation of masked bits
  91. query T
  92. SELECT '255/10':::INET
  93. ----
  94. 255.0.0.0/10
  95. # Test that less than 4 octets requires a mask
  96. statement error could not parse
  97. SELECT '192':::INET
  98. statement error could not parse
  99. SELECT '19.0':::INET
  100. # Test that the mask can't be larger than the provided octet bits
  101. statement error could not parse
  102. SELECT '19.0/32':::INET
  103. statement error could not parse
  104. SELECT '19/32':::INET
  105. statement error could not parse
  106. SELECT '19/16':::INET
  107. query T
  108. SELECT '19/15':::INET
  109. ----
  110. 19.0.0.0/15
  111. # Misc tests
  112. statement error could not parse
  113. SELECT '192.168/24/1':::INET
  114. statement error could not parse
  115. SELECT '':::INET
  116. statement error could not parse
  117. SELECT '0':::INET
  118. query T
  119. SELECT '0.0.0.0':::INET
  120. ----
  121. 0.0.0.0
  122. # Testing equivilance
  123. query B
  124. SELECT '::ffff:192.168.0.1/24'::INET = '::ffff:192.168.0.1/24'::INET
  125. ----
  126. true
  127. query B
  128. SELECT '::ffff:192.168.0.1/24'::INET = '::ffff:192.168.0.1/25'::INET
  129. ----
  130. false
  131. query B
  132. SELECT '::ffff:192.168.0.1/24'::INET = '::ffff:192.168.0.1'::INET
  133. ----
  134. false
  135. query B
  136. SELECT '::ffff:192.168.0.1'::INET = '::ffff:192.168.0.1'::INET
  137. ----
  138. true
  139. # Ensure IPv4-mapped IPv6 is not equal to its mapped IPv4
  140. query B
  141. SELECT '::ffff:192.168.0.1'::INET = '192.168.0.1'::INET
  142. ----
  143. false
  144. query B
  145. SELECT '192.168.0.1'::INET = '192.168.0.1'::INET
  146. ----
  147. true
  148. query B
  149. SELECT '192.168.0.1/0'::INET = '192.168.0.1'::INET
  150. ----
  151. false
  152. query B
  153. SELECT '192.168.0.1/0'::INET = '192.168.0.1/0'::INET
  154. ----
  155. true
  156. query B
  157. SELECT '192.168.0.1/0'::INET = '192.168.0.1/0'::INET
  158. ----
  159. true
  160. # Testing basic comparisons
  161. query B
  162. SELECT '192.168.0.2/24'::INET < '192.168.0.1/25'::INET
  163. ----
  164. true
  165. query B
  166. SELECT '1.2.3.4':::INET < '1.2.3.5':::INET
  167. ----
  168. true
  169. query B
  170. SELECT '192.168.0.1/0'::INET > '192.168.0.1/0'::INET
  171. ----
  172. false
  173. query B
  174. SELECT '192.168.0.0'::INET > '192.168.0.1/0'::INET
  175. ----
  176. true
  177. query B
  178. SELECT '::ffff:1.2.3.4':::INET > '1.2.3.4':::INET
  179. ----
  180. true
  181. # Testing contains/contained by logic
  182. query B
  183. SELECT '192.168.200.95/17'::INET >> '192.168.162.1'::INET
  184. ----
  185. true
  186. query B
  187. SELECT '192.168.200.95/8'::INET >> '192.168.2.1/8'::INET
  188. ----
  189. false
  190. query B
  191. SELECT '2001:0db8:0000:0000:0500:5000:0000:0001/50'::INET >> '2001:0db8:0000:0000:0500:5000:0000:0001/50'::INET
  192. ----
  193. false
  194. query B
  195. SELECT '2001:0db8:0500:0000:0500:5000:0000:0001/50'::INET >> '2001:0db8:0000:0000:0000:0000:0000:0001/100'::INET
  196. ----
  197. false
  198. query B
  199. SELECT '192.168.200.95/8'::INET >>= '192.168.2.1/8'::INET
  200. ----
  201. true
  202. query B
  203. SELECT '192.168.200.95/17'::INET >>= '192.168.2.1/24'::INET
  204. ----
  205. false
  206. query B
  207. SELECT '192.168.200.95/8'::INET >>= '192.168.2.1/8'::INET
  208. ----
  209. true
  210. query B
  211. SELECT '2001:0db8:0500:0000:0500:5000:0000:0001/50'::INET >>= '2001:0db8:0000:0000:0000:0000:0000:0001/100'::INET
  212. ----
  213. false
  214. query B
  215. SELECT '2001:0db8:0000:0000:0500:5000:0000:0001/50'::INET >>= '2001:0db8:0000:0000:0500:5000:0000:0001/50'::INET
  216. ----
  217. true
  218. query B
  219. SELECT '192.168.200.95'::INET << '192.168.2.1/8'::INET
  220. ----
  221. true
  222. query B
  223. SELECT '192.168.200.95/8'::INET << '192.168.2.1/8'::INET
  224. ----
  225. false
  226. query B
  227. SELECT '192.168.200.95'::INET <<= '192.168.2.1/8'::INET
  228. ----
  229. true
  230. query B
  231. SELECT '192.168.200.95/8'::INET <<= '192.168.2.1/8'::INET
  232. ----
  233. true
  234. query B
  235. SELECT '2001:0db8:0000:0000:0500:5000:0000:0001/50'::INET << '2001:0db8:0000:0000:0000:0000:0000:0001/100'::INET
  236. ----
  237. false
  238. query B
  239. SELECT '2001:0db8:0000:0000:0500:5000:0000:0001/50'::INET << '2001:0db8:0000:0000:0500:5000:0000:0001/50'::INET
  240. ----
  241. false
  242. query B
  243. SELECT '2001:0db8:0000:0000:0500:5000:0000:0001/50'::INET <<= '2001:0db8:0000:0000:0000:0000:0000:0001/100'::INET
  244. ----
  245. false
  246. query B
  247. SELECT '2001:0db8:0000:0000:0500:5000:0000:0001/50'::INET <<= '2001:0db8:0000:0000:0500:5000:0000:0001/50'::INET
  248. ----
  249. true
  250. query B
  251. SELECT '192.168.200.95/16'::INET && '192.168.2.1/24'::INET
  252. ----
  253. true
  254. query B
  255. SELECT '192.168.200.95/17'::INET && '192.168.2.1/24'::INET
  256. ----
  257. false
  258. query B
  259. SELECT '2001:0db8:0500:0000:0500:5000:0000:0001/50'::INET && '2001:0db8:0000:0000:0000:0000:0000:0001/100'::INET
  260. ----
  261. false
  262. query B
  263. SELECT '2001:0db8:0000:0000:0500:5000:0000:0001/50'::INET && '2001:0db8:0000:0000:0000:0000:0000:0001/100'::INET
  264. ----
  265. true
  266. query B
  267. SELECT '2001:0db8:0500:0000:0500:5000:0000:0001/50'::INET >> '192.168.2.1/8'::INET
  268. ----
  269. false
  270. query B
  271. SELECT '2001:0db8:0500:0000:0500:5000:0000:0001/50'::INET >>= '192.168.2.1/8'::INET
  272. ----
  273. false
  274. query B
  275. SELECT '2001:0db8:0500:0000:0500:5000:0000:0001/50'::INET << '192.168.2.1/8'::INET
  276. ----
  277. false
  278. query B
  279. SELECT '2001:0db8:0500:0000:0500:5000:0000:0001/50'::INET <<= '192.168.2.1/8'::INET
  280. ----
  281. false
  282. query B
  283. SELECT '2001:0db8:0500:0000:0500:5000:0000:0001/50'::INET && '192.168.2.1/8'::INET
  284. ----
  285. false
  286. query B
  287. SELECT '192.168.2.1/8'::INET >> '2001:0db8:0500:0000:0500:5000:0000:0001/50'::INET
  288. ----
  289. false
  290. query B
  291. SELECT '192.168.2.1/8'::INET >>= '2001:0db8:0500:0000:0500:5000:0000:0001/50'::INET
  292. ----
  293. false
  294. query B
  295. SELECT '192.168.2.1/8'::INET << '2001:0db8:0500:0000:0500:5000:0000:0001/50'::INET
  296. ----
  297. false
  298. query B
  299. SELECT '192.168.2.1/8'::INET <<= '2001:0db8:0500:0000:0500:5000:0000:0001/50'::INET
  300. ----
  301. false
  302. query B
  303. SELECT '192.168.2.1/8'::INET && '2001:0db8:0500:0000:0500:5000:0000:0001/50'::INET
  304. ----
  305. false
  306. # Binary operations
  307. query T
  308. SELECT ~'192.168.1.2/10':::INET
  309. ----
  310. 63.87.254.253/10
  311. query T
  312. SELECT ~'192.168.1.2/0':::INET
  313. ----
  314. 63.87.254.253/0
  315. query T
  316. SELECT ~'2001:4f8:3:ba::/64':::INET
  317. ----
  318. dffe:fb07:fffc:ff45:ffff:ffff:ffff:ffff/64
  319. query T
  320. SELECT '255.255.255.250/2':::INET & '0.5.0.5/17':::INET
  321. ----
  322. 0.5.0.0/17
  323. query T
  324. SELECT '0000:0564:0000:0aab:0000:0000:0060:0005/23':::INET & 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:0005/123':::INET
  325. ----
  326. 0:564:0:aab::60:5/123
  327. query T
  328. SELECT '192.168.1.2/1':::INET | '192.168.1.3/17':::INET
  329. ----
  330. 192.168.1.3/17
  331. query T
  332. SELECT '6e32:8a01:373b:c9ce:8ed5:9f7f:dc7e:5cfc/99':::INET | 'c33e:9867:5c98:f0a2:2b2:abf9:c7a5:67d':::INET
  333. ----
  334. ef3e:9a67:7fbb:f9ee:8ef7:bfff:dfff:5efd
  335. statement error pq: cannot AND inet values of different sizes
  336. SELECT '0000:0564:0000:0aab:0000:0000:0060:0005/23':::INET & '192.168.1.2/1':::INET
  337. statement error pq: cannot OR inet values of different sizes
  338. SELECT '0000:0564:0000:0aab:0000:0000:0060:0005/23':::INET | '192.168.1.2/1':::INET
  339. # Addition and Subtraction
  340. query T
  341. SELECT '192.168.1.2':::INET + 184836468
  342. ----
  343. 203.172.98.118
  344. query T
  345. SELECT '0.0.0.5':::INET - 5
  346. ----
  347. 0.0.0.0
  348. query T
  349. SELECT '203.172.98.118/23':::INET - 184836468
  350. ----
  351. 192.168.1.2/23
  352. query T
  353. SELECT '0.0.0.5':::INET - -5
  354. ----
  355. 0.0.0.10
  356. query T
  357. SELECT '::4104:4066:5de7:b1fa':::INET - 4684658846864486648
  358. ----
  359. ::ffff:192.168.1.2
  360. query T
  361. SELECT '::4104:4066:5de7:b1fa/121':::INET + -4684658846864486648
  362. ----
  363. ::ffff:192.168.1.2/121
  364. query T
  365. SELECT '::4104:4066:5de7:b1fa/101':::INET + 2
  366. ----
  367. ::4104:4066:5de7:b1fc/101
  368. query T
  369. SELECT '::5/128':::INET - -2
  370. ----
  371. ::7
  372. query I
  373. SELECT '203.172.98.118/17':::INET - '192.168.1.2/1':::INET
  374. ----
  375. 184836468
  376. query I
  377. SELECT '::4104:4066:5de7:b1fa/79':::INET - '::ffff:192.168.1.2/44':::INET
  378. ----
  379. 4684658846864486648
  380. statement error pq: result out of range
  381. SELECT '255.255.0.5':::INET + 2000000000
  382. statement error pq: result out of range
  383. SELECT '0.0.0.5':::INET - 10
  384. statement error pq: result out of range
  385. SELECT '::5/128':::INET - 10
  386. statement error pq: result out of range
  387. SELECT 'ff00:5::/128':::INET - '::ff00:5/128':::INET
  388. # Edge case: postgres compatibility
  389. query T
  390. SELECT '0.0.0.0.':::INET
  391. ----
  392. 0.0.0.0
  393. statement error could not parse
  394. SELECT '.0.0.0.0.':::INET
  395. statement error could not parse
  396. SELECT '0.0.0.0.0':::INET
  397. # Test storage round-trip
  398. statement ok
  399. CREATE TABLE u (ip inet PRIMARY KEY,
  400. ip2 inet)
  401. statement ok
  402. INSERT INTO u VALUES ('192.168.0.1', '192.168.0.1')
  403. statement error duplicate key value
  404. INSERT INTO u VALUES ('192.168.0.1', '192.168.0.2')
  405. statement ok
  406. INSERT INTO u VALUES ('192.168.0.2', '192.168.0.2')
  407. statement ok
  408. INSERT INTO u VALUES ('192.168.0.5/24', '192.168.0.5')
  409. statement ok
  410. INSERT INTO u VALUES ('192.168.0.1/31', '192.168.0.1')
  411. statement ok
  412. INSERT INTO u VALUES ('192.168.0.0', '192.168.0.1')
  413. statement ok
  414. INSERT INTO u VALUES ('192.0.0.0', '127.0.0.1')
  415. statement ok
  416. INSERT INTO u (ip) VALUES ('::1')
  417. statement ok
  418. INSERT INTO u (ip) VALUES ('::ffff:1.2.3.4')
  419. query TT
  420. SELECT * FROM u ORDER BY ip
  421. ----
  422. 192.168.0.5/24 192.168.0.5
  423. 192.168.0.1/31 192.168.0.1
  424. 192.0.0.0 127.0.0.1
  425. 192.168.0.0 192.168.0.1
  426. 192.168.0.1 192.168.0.1
  427. 192.168.0.2 192.168.0.2
  428. ::1 NULL
  429. ::ffff:1.2.3.4 NULL
  430. statement ok
  431. CREATE TABLE arrays (ips INET[])
  432. statement ok
  433. INSERT INTO arrays VALUES
  434. (ARRAY[]),
  435. (ARRAY['192.168.0.1/10', '::1']),
  436. (ARRAY['192.168.0.1', '192.168.0.1/10', '::1', '::ffff:1.2.3.4'])
  437. query T rowsort
  438. SELECT * FROM arrays
  439. ----
  440. {}
  441. {192.168.0.1/10,::1}
  442. {192.168.0.1,192.168.0.1/10,::1,::ffff:1.2.3.4}
  443. # Testing builtins
  444. # Test abbrev
  445. # For INET, abbev has the same output as ::string. This is not the case for
  446. # CIDR. The input string is not always equal to the output string, e.g.
  447. # abbrev('10.0/16'::inet) => '10.0.0.0/16'
  448. query T
  449. SELECT abbrev('10.1.0.0/16'::INET)
  450. ----
  451. 10.1.0.0/16
  452. query T
  453. SELECT abbrev('192.168.0.1/16'::INET)
  454. ----
  455. 192.168.0.1/16
  456. query T
  457. SELECT abbrev('192.168.0.1'::INET)
  458. ----
  459. 192.168.0.1
  460. query T
  461. SELECT abbrev('192.168.0.1/32'::INET)
  462. ----
  463. 192.168.0.1
  464. query T
  465. SELECT abbrev('10.0/16'::INET)
  466. ----
  467. 10.0.0.0/16
  468. query T
  469. SELECT abbrev('::ffff:192.168.0.1'::INET)
  470. ----
  471. ::ffff:192.168.0.1
  472. query T
  473. SELECT abbrev('::ffff:192.168.0.1/24'::INET)
  474. ----
  475. ::ffff:192.168.0.1/24
  476. # Test broadcast
  477. query T
  478. SELECT broadcast('10.1.0.0/16'::INET)
  479. ----
  480. 10.1.255.255/16
  481. query T
  482. SELECT broadcast('192.168.0.1/16'::INET)
  483. ----
  484. 192.168.255.255/16
  485. query T
  486. SELECT broadcast('192.168.0.1'::INET)
  487. ----
  488. 192.168.0.1
  489. query T
  490. SELECT broadcast('192.168.0.1/32'::INET)
  491. ----
  492. 192.168.0.1
  493. query T
  494. SELECT broadcast('::ffff:192.168.0.1'::INET)
  495. ----
  496. ::ffff:192.168.0.1
  497. query T
  498. SELECT broadcast('::ffff:1.2.3.1/20'::INET)
  499. ----
  500. 0:fff:ffff:ffff:ffff:ffff:ffff:ffff/20
  501. query T
  502. SELECT broadcast('2001:4f8:3:ba::/64'::INET)
  503. ----
  504. 2001:4f8:3:ba:ffff:ffff:ffff:ffff/64
  505. # Test family
  506. query I
  507. SELECT family('10.1.0.0/16'::INET)
  508. ----
  509. 4
  510. query I
  511. SELECT family('192.168.0.1/16'::INET)
  512. ----
  513. 4
  514. query I
  515. SELECT family('192.168.0.1'::INET)
  516. ----
  517. 4
  518. query I
  519. SELECT family('::ffff:192.168.0.1'::INET)
  520. ----
  521. 6
  522. query I
  523. SELECT family('::ffff:1.2.3.1/20'::INET)
  524. ----
  525. 6
  526. query I
  527. SELECT family('2001:4f8:3:ba::/64'::INET)
  528. ----
  529. 6
  530. # Test host
  531. query T
  532. SELECT host('10.1.0.0/16'::INET)
  533. ----
  534. 10.1.0.0
  535. query T
  536. SELECT host('192.168.0.1/16'::INET)
  537. ----
  538. 192.168.0.1
  539. query T
  540. SELECT host('192.168.0.1'::INET)
  541. ----
  542. 192.168.0.1
  543. query T
  544. SELECT host('192.168.0.1/32'::INET)
  545. ----
  546. 192.168.0.1
  547. query T
  548. SELECT host('::ffff:192.168.0.1'::INET)
  549. ----
  550. ::ffff:192.168.0.1
  551. query T
  552. SELECT host('::ffff:192.168.0.1/24'::INET)
  553. ----
  554. ::ffff:192.168.0.1
  555. # Test hostmask
  556. query T
  557. SELECT hostmask('192.168.1.2'::INET)
  558. ----
  559. 0.0.0.0
  560. query T
  561. SELECT hostmask('192.168.1.2/16'::INET)
  562. ----
  563. 0.0.255.255
  564. query T
  565. SELECT hostmask('192.168.1.2/10'::INET)
  566. ----
  567. 0.63.255.255
  568. query T
  569. SELECT hostmask('2001:4f8:3:ba::/64'::INET)
  570. ----
  571. ::ffff:ffff:ffff:ffff
  572. # Test masklen
  573. query I
  574. SELECT masklen('192.168.1.2'::INET)
  575. ----
  576. 32
  577. query I
  578. SELECT masklen('192.168.1.2/16'::INET)
  579. ----
  580. 16
  581. query I
  582. SELECT masklen('192.168.1.2/10'::INET)
  583. ----
  584. 10
  585. query I
  586. SELECT masklen('2001:4f8:3:ba::/64'::INET)
  587. ----
  588. 64
  589. query I
  590. SELECT masklen('2001:4f8:3:ba::'::INET)
  591. ----
  592. 128
  593. # Test netmask
  594. query T
  595. SELECT netmask('192.168.1.2'::INET)
  596. ----
  597. 255.255.255.255
  598. query T
  599. SELECT netmask('192.168.1.2/16'::INET)
  600. ----
  601. 255.255.0.0
  602. query T
  603. SELECT netmask('192.168.1.2/10'::INET)
  604. ----
  605. 255.192.0.0
  606. query T
  607. SELECT netmask('192.168.1.2/0'::INET)
  608. ----
  609. 0.0.0.0
  610. query T
  611. SELECT netmask('2001:4f8:3:ba::/64'::INET)
  612. ----
  613. ffff:ffff:ffff:ffff::
  614. query T
  615. SELECT netmask('2001:4f8:3:ba::/0'::INET)
  616. ----
  617. ::
  618. query T
  619. SELECT netmask('2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128'::INET)
  620. ----
  621. ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
  622. query T
  623. SELECT netmask('::ffff:1.2.3.1/120'::INET)
  624. ----
  625. ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00
  626. query T
  627. SELECT netmask('::ffff:1.2.3.1/20'::INET)
  628. ----
  629. ffff:f000::
  630. # Test set_masklen
  631. query T
  632. SELECT set_masklen('10.1.0.0/16'::INET, 10)
  633. ----
  634. 10.1.0.0/10
  635. query T
  636. SELECT set_masklen('192.168.0.1/16'::INET, 32)
  637. ----
  638. 192.168.0.1
  639. statement error invalid mask length
  640. SELECT set_masklen('192.168.0.1'::INET, 100)
  641. statement error invalid mask length
  642. SELECT set_masklen('192.168.0.1'::INET, 33)
  643. statement error invalid mask length
  644. SELECT set_masklen('192.168.0.1'::INET, -1)
  645. query T
  646. SELECT set_masklen('192.168.0.1'::INET, 0)
  647. ----
  648. 192.168.0.1/0
  649. query T
  650. SELECT set_masklen('::ffff:192.168.0.1'::INET, 100)
  651. ----
  652. ::ffff:192.168.0.1/100
  653. statement error invalid mask length
  654. SELECT set_masklen('::ffff:192.168.0.1'::INET, -1)
  655. statement error invalid mask length
  656. SELECT set_masklen('::ffff:192.168.0.1'::INET, 129)
  657. query T
  658. SELECT set_masklen('::ffff:192.168.0.1/24'::INET, 0)
  659. ----
  660. ::ffff:192.168.0.1/0
  661. # Test text
  662. # The difference between text and abbrev/::string is that text always outputs
  663. # the prefix length, whereas abbrev omit it when the prefix length is the
  664. # total bits size (32 for IPv4, 128 for IPv6).
  665. query T
  666. SELECT text('10.1.0.0/16'::INET)
  667. ----
  668. 10.1.0.0/16
  669. query T
  670. SELECT text('192.168.0.1/16'::INET)
  671. ----
  672. 192.168.0.1/16
  673. query T
  674. SELECT text('192.168.0.1'::INET)
  675. ----
  676. 192.168.0.1/32
  677. query T
  678. SELECT text('192.168.0.1/32'::INET)
  679. ----
  680. 192.168.0.1/32
  681. query T
  682. SELECT text('::ffff:192.168.0.1'::INET)
  683. ----
  684. ::ffff:192.168.0.1/128
  685. query T
  686. SELECT text('::ffff:192.168.0.1/24'::INET)
  687. ----
  688. ::ffff:192.168.0.1/24
  689. # Test inet_same_family
  690. query T
  691. SELECT text('::ffff:192.168.0.1/24'::INET)
  692. ----
  693. ::ffff:192.168.0.1/24
  694. # Verify the inet datum gets serialized correctly for distsql.
  695. query T
  696. SELECT host(max('192.168.0.2/24'::INET)) FROM (VALUES (1)) AS t(x)
  697. ----
  698. 192.168.0.2