/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 2 . ĠAlex andre ĠBo yer Ċ Ġ*/ Ċ Ċ package Ġnet . pl pgsql . ide ade bug ger . command Ċ Ċ import Ġnet . pl pgsql . ide ade bug ger . DEBUG GER _ SESSION _ NAME Ċ import Ġnet . pl pgsql . ide ade bug ger . Producer Ċ import Ġnet . pl pgsql . ide ade bug ger . SELECT _ NULL Ċ Ċ /** Ċ Ġ* Ċ Ġ*/ Ċ enum Ġclass ĠApi Query ( val Ġsql : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproducer : ĠProducer < Any >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdisable Decoration : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprint : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĊĠĠĠ ĠVOID ( ĊĠĠĠĠĠĠĠ ĠSELECT _ NULL , ĊĠĠĠĠĠĠĠ ĠProducer < Any > Ġ{ ĠPl Api Void () Ġ}), ĊĠĠĠ ĠRAW _ VOID ( ĊĠĠĠĠĠĠĠ Ġ"% s ", ĊĠĠĠĠĠĠĠ ĠProducer < Any > Ġ{ ĠPl Api Void () Ġ}, ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ), ĊĠĠĠ ĠRAW _ BOOL ( ĊĠĠĠĠĠĠĠ Ġ"% s ", ĊĠĠĠĠĠĠĠ ĠProducer < Any > Ġ{ ĠPl Api Boolean ( it . bool ()) Ġ}), ĊĠĠĠ ĠPG _ ACTIVITY ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ ĠSELECT Ġpid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication _ name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġus ename , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient _ addr ĊĠĠĠĠĠĠĠ ĠFROM Ġpg _ stat _ activity ĊĠĠĠĠĠĠĠ ĠWHERE Ġapplication _ name Ġ= Ġ'$ DEBUG GER _ SESSION _ NAME ' ĊĠĠĠĠĠĠĠ ĠAND Ġpid Ġ<> Ġpg _ backend _ pid (); ĊĠĠĠĠĠĠĠ Ġ"" ", ĊĠĠĠĠĠĠĠ ĠProducer < Any > Ġ{ ĠPl Activity ( it . long (), Ġit . string (), Ġit . string (), Ġit . string ()) Ġ}), ĊĠĠĠ ĠPG _ CANCEL ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ ĠSELECT Ġpg _ terminate _ backend (% s ); ĊĠĠĠĠĠĠĠ Ġ"" ", ĊĠĠĠĠĠĠĠ ĠProducer < Any > Ġ{ ĠPl Api Boolean ( it . bool ()) Ġ} ĊĠĠĠ Ġ), ĊĠĠĠ ĠCREATE _ LIST ENER ( ĊĠĠĠĠĠĠĠ Ġ" pl dbg _ create _ listener ()", ĊĠĠĠĠĠĠĠ ĠProducer < Any > Ġ{ ĠPl Api Int ( it . int ()) Ġ}), ĊĠĠĠ ĠWAIT _ FOR _ TARGET ( ĊĠĠĠĠĠĠĠ Ġ" pl dbg _ wait _ for _ target (% s )", ĊĠĠĠĠĠĠĠ ĠProducer < Any > Ġ{ ĠPl Api Int ( it . int ()) Ġ}), ĊĠĠĠ ĠAB ORT ( ĊĠĠĠĠĠĠĠ Ġ" pl dbg _ abort _ target (% s )", ĊĠĠĠĠĠĠĠ ĠProducer < Any > Ġ{ ĠPl Api Boolean ( it . bool ()) Ġ}), ĊĠĠĠ ĠSTEP _ OVER ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSELECT Ġstep . func , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep . linenumber , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmd 5 ( pg _ catalog . pg _ get _ function def ( step . func )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFROM Ġpl dbg _ step _ over (% s ) Ġstep ; ĊĠĠĠĠĠĠĠ Ġ"" ", ĊĠĠĠĠĠĠĠ ĠProducer < Any > Ġ{ ĠPl Api Step ( it . long (), Ġit . int (), Ġit . string ()) Ġ}), ĊĠĠĠ ĠSTEP _ IN TO ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSELECT Ġstep . func , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep . linenumber , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmd 5 ( pg _ catalog . pg _ get _ function def ( step . func )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFROM Ġpl dbg _ step _ into (% s ) Ġstep ; ĊĠĠĠĠĠĠĠ Ġ"" ", ĊĠĠĠĠĠĠĠ ĠProducer < Any > Ġ{ ĠPl Api Step ( it . long (), Ġit . int (), Ġit . string ()) Ġ}), ĊĠĠĠ ĠSTEP _ CONTINUE ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSELECT Ġstep . func , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep . linenumber , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmd 5 ( pg _ catalog . pg _ get _ function def ( step . func )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFROM Ġpl dbg _ continue (% s ) Ġstep ; ĊĠĠĠĠĠĠĠ Ġ"" ", ĊĠĠĠĠĠĠĠ ĠProducer < Any > Ġ{ ĠPl Api Step ( it . long (), Ġit . int (), Ġit . string ()) Ġ}), ĊĊĠĠĠ ĠLIST _ BREAK POINT ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSELECT Ġbp . func , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbp . linenumber , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'' ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFROM Ġpl dbg _ get _ breakpoints (% s ) Ġbp ; ĊĠĠĠĠĠĠĠ Ġ"" ", ĊĠĠĠĠĠĠĠ ĠProducer < Any > Ġ{ ĠPl Api Step ( it . long (), Ġit . int (), Ġit . string ()) Ġ}), ĊĠĠĠ ĠSET _ GLOBAL _ BREAK POINT ( ĊĠĠĠĠĠĠĠ Ġ" pl dbg _ set _ global _ breakpoint (% s , Ġ% s , Ġ- 1 , ĠNULL )", ĊĠĠĠĠĠĠĠ ĠProducer < Any > Ġ{ ĠPl Api Boolean ( it . bool ()) Ġ}), ĊĠĠĠ ĠSET _ BREAK POINT ( ĊĠĠĠĠĠĠĠ Ġ" pl dbg _ set _ breakpoint (% s , Ġ% s , Ġ% s )", ĊĠĠĠĠĠĠĠ ĠProducer < Any > Ġ{ ĠPl Api Boolean ( it . bool ()) Ġ}), ĊĠĠĠ ĠDROP _ BREAK POINT ( ĊĠĠĠĠĠĠĠ Ġ" pl dbg _ drop _ breakpoint (% s , Ġ% s , Ġ% s )", ĊĠĠĠĠĠĠĠ ĠProducer < Any > Ġ{ ĠPl Api Boolean ( it . bool ()) Ġ}), ĊĊĠĠĠ ĠGET _ STACK ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ ĠSELECT ĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe . level , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe . func , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe . linenumber , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmd 5 ( pg _ catalog . pg _ get _ function def ( frame . func )) ĊĠĠĠĠĠĠĠ ĠFROM Ġpl dbg _ get _ stack (% s ) Ġframe ; ĊĠĠĠĠĠĠĠ Ġ"" ", ĊĠĠĠĠĠĠĠ ĠProducer < Any > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPl Api Stack Frame ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . int (), Ġ// ĠLevel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . long (), Ġ// ĠO id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . int (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ), ĊĠĠĠ ĠGET _ RAW _ VARIABLE S ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ ĠSELECT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar class Ġ= Ġ' A ' Ġas Ġis _ arg , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlin enumber Ġas Ġline , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt _ type . oid Ġas Ġoid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt _ var . name Ġas Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco alesce ( t _ type . oid :: regtype :: TEXT , Ġ' text ') Ġas Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco alesce ( t _ type . ty ptype , Ġ' b ') Ġas Ġkind , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt _ type . ty par ray Ġ= Ġ 0 Ġas Ġis _ array , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco alesce ( t _ sub . oid :: regtype :: TEXT , Ġ' text ') Ġas Ġarray _ type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt _ var . value Ġas Ġvalue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'' Ġas Ġpretty ĊĠĠĠĠĠĠĠ ĠFROM Ġpl dbg _ get _ variables (% s ) Ġt _ var ĊĠĠĠĠĠĠĠĠĠĠĠĠ ĠLEFT ĠJOIN Ġpg _ type Ġt _ type ĠON Ġt _ var . dtype Ġ= Ġt _ type . oid ĊĠĠĠĠĠĠĠĠĠĠĠĠ ĠLEFT ĠJOIN Ġpg _ type Ġt _ sub ĠON Ġt _ type . type lem Ġ= Ġt _ sub . oid ; ĊĠĠĠĠĠĠĠ Ġ"" ", ĠProducer < Any > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPl Api Stack Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . bool (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . int (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPl Api Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . long (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . char (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . bool (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ), ĊĊĠĠĠ ĠGET _ JSON _ VARIABLE S ( ĊĠĠĠĠĠĠĠ Ġsql Ġ= Ġ"% s ", ĊĠĠĠĠĠĠĠ Ġproducer Ġ= ĠProducer < Any > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPl Api Stack Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . bool (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . int (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPl Api Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . long (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . char (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . bool (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġprint Ġ= Ġfalse ĊĠĠĠ Ġ), ĊĊĠĠĠ ĠGET _ SHARED _ LIBRARIES ( ĊĠĠĠĠĠĠĠ Ġsql Ġ= Ġ""" ĊĠĠĠĠĠĠĠ ĠSELECT Ġsetting ĊĠĠĠĠĠĠĠ ĠFROM Ġpg _ settings ĊĠĠĠĠĠĠĠ ĠWHERE Ġname Ġ= Ġ' shared _ preload _ libraries ' ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠĠĠ Ġproducer Ġ= ĠProducer < Any > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPl Api String ( it . string ()) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġdisable Decoration Ġ= Ġtrue ĊĠĠĠ Ġ), ĊĊĠĠĠ ĠGET _ EXTENSION ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ ĠSELECT ĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġt _ namespace . n sp name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt _ extension . ext name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt _ extension . ext version ĊĠĠĠĠĠĠĠ ĠFROM Ġpg _ extension Ġt _ extension ĊĠĠĠĠĠĠĠ ĠJOIN Ġpg _ namespace Ġt _ namespace ĠON Ġt _ extension . ext namespace Ġ= Ġt _ namespace . oid ĊĠĠĠĠĠĠĠ Ġ"" ", ĊĠĠĠĠĠĠĠ ĠProducer < Any > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPl Api Extension ( it . string (), Ġit . string (), Ġit . string ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ), ĊĠĠĠ ĠGET _ FUNCTION _ CALL _ ARGS ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ ĠSELECT ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ proc 2 . oid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ proc 2 . pr on args , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ proc 2 . idx , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ proc 2 . pro arg name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconcat ( t _ type _ ns . n sp name , Ġ'.', Ġt _ type . typ name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ proc 2 . pr on args Ġ> Ġ 0 ĠAND Ġidx Ġ> Ġ( t _ proc 2 . pr on args Ġ- Ġt _ proc 2 . pr on arg defaults ) ĊĠĠĠĠĠĠĠ ĠFROM Ġ( SELECT Ġidx Ġas Ġidx , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ proc 1 . pr on args , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ proc 1 . pr on arg defaults , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ proc 1 . oid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ proc 1 . pro arg types [ idx Ġ- Ġ 1 ] ĠAS Ġpro arg type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ proc 1 . pro arg names [ idx ] ĠĠĠĠ ĠAS Ġpro arg name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFROM Ġ( SELECT Ġt _ proc . oid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCASE ĠWHEN Ġt _ proc . pr on args Ġ= Ġ 0 ĠTHEN Ġ'{ 0 }' :: oid [] ĠELSE Ġt _ proc . pro arg types :: oid [] ĠEND ĠAS Ġpro arg types , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCASE ĠWHEN Ġt _ proc . pr on args Ġ= Ġ 0 ĠTHEN Ġ'{ "" }' :: TEXT [] ĠELSE Ġt _ proc . pro arg names ĠEND ĠĠĠĠĠ ĠAS Ġpro arg names , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ proc . pr on args , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ proc . pr on arg defaults , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCASE ĠWHEN Ġt _ proc . pr on args Ġ= Ġ 0 ĠTHEN Ġ 1 ĠELSE Ġt _ proc . pr on args ĠEND ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAS Ġserial ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFROM Ġpg _ proc Ġt _ proc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJOIN Ġpg _ namespace Ġt _ namespace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠON Ġt _ proc . pr on ame space Ġ= Ġt _ namespace . oid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWHERE Ġlower ( t _ namespace . n sp name ) Ġ= Ġlower ('% s ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAND Ġlower ( t _ proc . pr on ame ) Ġ= Ġlower ('% s ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠORDER ĠBY Ġt _ proc . oid ) Ġt _ proc 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate _ series ( 1 , Ġt _ proc 1 . serial ) Ġidx ) Ġt _ proc 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLEFT ĠJOIN Ġpg _ type Ġt _ type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠON Ġt _ proc 2 . pro arg type Ġ= Ġt _ type . oid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLEFT ĠJOIN Ġpg _ namespace Ġt _ type _ ns ĠON Ġt _ type . typ namespace Ġ= Ġt _ type _ ns . oid ; ĊĠĠĠĠĠĠĠ Ġ"" ", ĠProducer < Any > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPl Api Function Arg ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . long (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . int (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . int (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . bool (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ), ĊĊĠĠĠ ĠGET _ FUNCTION _ DEF ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ ĠSELECT Ġt _ proc . oid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ namespace . n sp name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ proc . pr on ame , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpg _ catalog . pg _ get _ function def ( t _ proc . oid ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmd 5 ( pg _ catalog . pg _ get _ function def ( t _ proc . oid )) ĊĠĠĠĠĠĠĠ ĠFROM Ġpg _ proc Ġt _ proc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJOIN Ġpg _ namespace Ġt _ namespace Ġon Ġt _ proc . pr on ame space Ġ= Ġt _ namespace . oid ĊĠĠĠĠĠĠĠ ĠWHERE Ġt _ proc . oid Ġ= Ġ% s ; ĊĠĠĠĠĠĠĠ Ġ"" ", ĠProducer < Any > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPl Api Function Def ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . long (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ it . string (). remove Suffix ("\ n ") }; ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ), ĊĊĠĠĠ ĠEXP LO DE ("% s ", ĠProducer < Any > Ġ{ ĊĠĠĠĠĠĠĠ ĠPl Api Value ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . long (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . char (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . bool (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . string () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ}), ĊĊĠĠĠ ĠEXP LO DE _ ARRAY ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ ĠSELECT Ġt _ arr _ type . oid ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAS Ġoid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'% s [' Ġ|| Ġidx Ġ|| Ġ' ]' ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAS Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ arr _ type . typ name ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAS Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ arr _ type . ty ptype ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAS Ġkind , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ arr _ type . ty par ray Ġ= Ġ 0 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAS Ġis _ array , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco alesce ( t _ sub . typ name , Ġ' unknown ') ĠĠĠĠĠ ĠAS Ġarray _ type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco alesce ( arr . val :: TEXT , Ġ' NULL ') ĠĠĠĠĠĠĠĠ ĠAS Ġvalue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco alesce ( json b _ pretty ( arr . val ), Ġ' NULL ') ĠAS Ġpretty ĊĠĠĠĠĠĠĠ ĠFROM Ġjsonb _ array _ elements ('% s ':: json b ) ĠWITH ĠOR D IN AL ITY Ġarr ( val , Ġidx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJOIN Ġpg _ type Ġt _ type ĠON Ġt _ type . oid Ġ= Ġ% s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJOIN Ġpg _ type Ġt _ arr _ type ĠON Ġt _ type . type lem Ġ= Ġt _ arr _ type . oid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLEFT ĠJOIN Ġpg _ type Ġt _ sub ĠON Ġt _ arr _ type . type lem Ġ= Ġt _ sub . oid ; ĊĠĠĠĠĠĠĠ Ġ"" ", ĊĠĠĠĠĠĠĠ ĠProducer < Any > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPl Api Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . long (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . char (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . bool (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ), ĊĊĠĠĠ ĠEXP LO DE _ COMP OS ITE ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ ĠSELECT Ġt _ att _ type . oid ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAS Ġoid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ att . att name ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAS Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ att _ type . typ name ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAS Ġtype _ name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ att _ type . ty ptype ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAS Ġkind , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt _ att _ type . ty par ray Ġ= Ġ 0 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAS Ġis _ array , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco alesce ( t _ sub . typ name , Ġ' unknown ') ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAS Ġarray _ type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco alesce ( json b _ extract _ path _ text ( json b . val , Ġt _ att . att name ), Ġ' NULL ') ĠĠĠĠĠĠĠĠĠ ĠAS Ġvalue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco alesce ( json b _ pretty ( json b _ extract _ path ( json b . val , Ġt _ att . att name )), Ġ' NULL ') ĠAS Ġpretty ĊĠĠĠĠĠĠĠ ĠFROM Ġpg _ type Ġt _ type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJOIN Ġpg _ class Ġt _ class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠON Ġt _ type . ty pre lid Ġ= Ġt _ class . oid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJOIN Ġpg _ attribute Ġt _ att ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠON Ġt _ att . att rel id Ġ= Ġt _ class . oid ĠAND Ġt _ att . att num Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJOIN Ġpg _ type Ġt _ att _ type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠON Ġt _ att . att ty pid Ġ= Ġt _ att _ type . oid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLEFT ĠJOIN Ġpg _ type Ġt _ sub ĠON Ġt _ att _ type . type lem Ġ= Ġt _ sub . oid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJOIN Ġ( SELECT Ġ'% s ':: json b Ġval ) ĠAS Ġjsonb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠON ĠTRUE ĊĠĠĠĠĠĠĠ ĠWHERE Ġt _ type . oid Ġ= Ġ% s ; ĊĠĠĠĠĠĠĠ Ġ"" ", ĠProducer < Any > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPl Api Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . long (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . char (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . bool (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . string () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ), Ċ } ĊĊĊĊ