package Ġcom . github . ays nc . sql . db . integration Ċ Ċ import Ġcom . github . j async . sql . db . column . Inet Address Encoder Decoder Ċ import Ġcom . github . j async . sql . db . column . Timestamp With Timezone Encoder Decoder Ċ import Ġcom . github . j async . sql . db . invoke Ċ import Ġjava . time . Offset DateTime Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . junit . Test Ċ Ċ class ĠArray Types Spec Ġ: ĠDatabase TestHelper () Ġ{ ĊĠĠĠ Ġ// Ġ` uniq ` Ġallows Ġsbt Ġto Ġrun Ġthe Ġtests Ġconcurrent ly Ġas Ġthere Ġis Ġno ĠCREATE ĠTEMP ĠTYPE ĊĠĠĠ Ġfun Ġsimple Create ( uniq : ĠString ) Ġ= Ġ""" DROP ĠTYPE ĠIF ĠEXISTS Ġdir _$ uniq ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCREATE ĠTYPE Ġdirection _$ uniq ĠAS ĠEN UM Ġ(' in ',' out '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDROP ĠTYPE ĠIF ĠEXISTS Ġendpoint _$ uniq ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCREATE ĠTYPE Ġendpoint _$ uniq ĠAS Ġ( ip Ġinet , Ġport Ġinteger ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Ġtemp Ġtable Ġtype _ test _ table _$ uniq Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbig serial _ column Ġbig serial Ġnot Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsmall int _ column Ġinteger [] Ġnot Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext _ column Ġtext [] Ġnot Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinet _ column Ġinet [] Ġnot Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirection _ column Ġdirection _$ uniq [] Ġnot Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġendpoint _ column Ġendpoint _$ uniq [] Ġnot Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp _ column Ġtimestamp Ġwith Ġtime Ġzone [] Ġnot Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint Ġbig serial _ column _ pkey Ġprimary Ġkey Ġ( big serial _ column ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) """ ĊĊĠĠĠ Ġfun Ġsimple Drop ( uniq : ĠString ) Ġ= Ġ""" drop Ġtable Ġif Ġexists Ġtype _ test _ table _$ uniq ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrop Ġtype Ġ Ġif Ġexists Ġendpoint _$ uniq ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrop Ġtype Ġ Ġif Ġexists Ġdirection _$ uniq """ ĊĊĠĠĠ Ġval Ġinsert Ġ= ĊĠĠĠĠĠĠĠ Ġ""" insert Ġinto Ġtype _ test _ table _ cpt at ĊĠĠĠĠĠ Ġ( small int _ column , Ġtext _ column , Ġinet _ column , Ġdirection _ column , Ġendpoint _ column , Ġtimestamp _ column ) ĊĠĠĠĠĠ Ġvalues Ġ( ĊĠĠĠĠĠ Ġ'{ 1 , 2 , 3 , 4 }', ĊĠĠĠĠĠ Ġ'{" some ,\" comma , separated , text "," another Ġline Ġof Ġtext "," fake \, backslash "," real \\ , backslash \\ ", NULL }', ĊĠĠĠĠĠ Ġ'{" 1 2 7 . 0 . 0 . 1 "," 2 0 0 2 : 1 5 :: 1 "} ', ĊĠĠĠĠĠ Ġ'{" in "," out "} ', ĊĠĠĠĠĠ Ġ'{" (\" 1 2 7 . 0 . 0 . 1 \", 8 0 ) "," (\" 2 0 0 2 : 1 5 :: 1 \", 4 4 3 ) "} ', ĊĠĠĠĠĠ Ġ'{" 2 0 1 3 - 0 4 - 0 6 Ġ 0 1 : 1 5 : 1 0 . 5 2 8 - 0 3 "," 2 0 1 3 - 0 4 - 0 6 Ġ 0 1 : 1 5 : 0 8 . 5 2 8 - 0 3 "} ' ĊĠĠĠĠĠ Ġ) """ ĊĊĠĠĠ Ġval Ġinsert PreparedStatement Ġ= Ġ""" insert Ġinto Ġtype _ test _ table _ cs a ups ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( small int _ column , Ġtext _ column , Ġinet _ column , Ġdirection _ column , Ġendpoint _ column , Ġtimestamp _ column ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ( ?,?, ?,?, ?, ?) """ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` connection Ġshould Ġcorrectly Ġparse Ġthe Ġarray Ġtype `() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġwith Handler Ġ{ Ġhandler Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute D dl ( handler , Ġsimple Create (" cpt at ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute D dl ( handler , Ġinsert , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġexecute Query ( handler , Ġ" select Ġ* Ġfrom Ġtype _ test _ table _ cpt at "). rows ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result [ 0 ](" small int _ column ")). isEqualTo ( listOf ( 1 , Ġ 2 , Ġ 3 , Ġ 4 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result [ 0 ](" text _ column ")). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some ,\" comma , separated , text ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" another Ġline Ġof Ġtext ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" fake , backslash ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" real \\ , backslash \\ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimes Ġ= Ġresult [ 0 ](" timestamp _ column ") Ġas ĠList < *> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( times [ 0 ] Ġas ĠOffset DateTime ). isEqual ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimestamp With Timezone Encoder Decoder . decode (" 2 0 1 3 - 0 4 - 0 6 Ġ 0 1 : 1 5 : 1 0 . 5 2 8 - 0 3 ") Ġas ĠOffset DateTime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( times [ 1 ] Ġas ĠOffset DateTime ). isEqual ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimestamp With Timezone Encoder Decoder . decode (" 2 0 1 3 - 0 4 - 0 6 Ġ 0 1 : 1 5 : 0 8 . 5 2 8 - 0 3 ") Ġas ĠOffset DateTime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute D dl ( handler , Ġsimple Drop (" cpt at ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` connection Ġshould Ġcorrectly Ġsend Ġarrays Ġusing Ġprepared Ġstatements `() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġtimestamps Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimestamp With Timezone Encoder Decoder . decode (" 2 0 1 3 - 0 4 - 0 6 Ġ 0 1 : 1 5 : 1 0 . 5 2 8 - 0 3 "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimestamp With Timezone Encoder Decoder . decode (" 2 0 1 3 - 0 4 - 0 6 Ġ 0 1 : 1 5 : 0 8 . 5 2 8 - 0 3 ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġin ets Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInet Address Encoder Decoder . decode (" 1 2 7 . 0 . 0 . 1 "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInet Address Encoder Decoder . decode (" 2 0 0 2 : 1 5 :: 1 ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġdirections Ġ= ĠlistOf (" in ", Ġ" out ") ĊĠĠĠĠĠĠĠ Ġval Ġendpoints Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(" 1 2 7 . 0 . 0 . 1 " Ġto Ġ 8 0 ), Ġ// Ġdata Ġclass ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(" 2 0 0 2 : 1 5 :: 1 " Ġto Ġ 4 4 3 ) Ġ// Ġtuple ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġnumbers Ġ= ĠlistOf ( 1 , Ġ 2 , Ġ 3 , Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġval Ġtexts Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" some ,\" comma , separated , text ", Ġ" another Ġline Ġof Ġtext ", Ġ" fake , backslash ", Ġ" real \\ , backslash \\ ", Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġwith Handler Ġ{ Ġhandler Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute D dl ( handler , Ġsimple Create (" cs a ups ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute PreparedStatement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . insert PreparedStatement , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( numbers , Ġtexts , Ġin ets , Ġdirections , Ġendpoints , Ġtimestamps ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġexecute Query ( handler , Ġ" select Ġ* Ġfrom Ġtype _ test _ table _ cs a ups "). rows ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result [ 0 ](" small int _ column ")). isEqualTo ( numbers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result [ 0 ](" text _ column ")). isEqualTo ( texts ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result [ 0 ](" inet _ column ")). isEqualTo ( in ets ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result [ 0 ](" direction _ column ")). isEqualTo ("{ in , out }") Ġ// Ġuser Ġtype Ġdecoding Ġnot Ġsupported ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result [ 0 ](" endpoint _ column ")). isEqualTo (""" {" ( 1 2 7 . 0 . 0 . 1 , 8 0 ) "," ( 2 0 0 2 : 1 5 :: 1 , 4 4 3 ) "} """) Ġ// Ġuser Ġtype Ġdecoding Ġnot Ġsupported ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimes Ġ= Ġresult [ 0 ](" timestamp _ column ") Ġas ĠList < *> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat (( times [ 0 ] Ġas ĠOffset DateTime ). isEqual ( timestamps [ 0 ] Ġas ĠOffset DateTime )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat (( times [ 1 ] Ġas ĠOffset DateTime ). isEqual ( timestamps [ 1 ] Ġas ĠOffset DateTime )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute D dl ( handler , Ġsimple Drop (" cs a ups ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ