From 3de19f66f2f77c4869b4ebaddafac7cbab50f852 Mon Sep 17 00:00:00 2001 From: Pravesh Sharma Date: Mon, 29 Jan 2024 11:32:34 +0530 Subject: [PATCH] Added support for column storage syntax while creating table. #6450 --- docs/en_US/column_dialog.rst | 2 + docs/en_US/images/column_definition.png | Bin 55653 -> 67126 bytes .../tables/columns/static/js/column.ui.js | 35 +- .../columns/tests/column_test_data.json | 29 + .../pg/16_plus/alter_column_storage.msql | 2 + .../tests/pg/16_plus/alter_column_storage.sql | 12 + .../16_plus/create_column_with_storage.msql | 8 + .../pg/16_plus/create_column_with_storage.sql | 12 + .../tables/columns/tests/pg/16_plus/test.json | 972 +++++++ .../ppas/16_plus/alter_column_storage.msql | 2 + .../ppas/16_plus/alter_column_storage.sql | 12 + .../16_plus/create_column_with_storage.msql | 8 + .../16_plus/create_column_with_storage.sql | 12 + .../columns/tests/ppas/16_plus/test.json | 972 +++++++ .../templates/columns/sql/16_plus/create.sql | 67 + .../templates/columns/sql/16_plus/update.sql | 216 ++ .../templates/tables/sql/16_plus/create.sql | 233 ++ .../create_table_with_column_storage.sql | 16 + .../create_table_with_column_storage_msql.sql | 10 + .../schemas/tables/tests/pg/16_plus/test.json | 2339 ++++++++++++++++ .../create_table_with_column_storage.sql | 16 + .../create_table_with_column_storage_msql.sql | 10 + .../tables/tests/ppas/16_plus/test.json | 2353 +++++++++++++++++ .../schemas/tables/tests/table_test_data.json | 36 + 24 files changed, 7367 insertions(+), 7 deletions(-) create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/pg/16_plus/alter_column_storage.msql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/pg/16_plus/alter_column_storage.sql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/pg/16_plus/create_column_with_storage.msql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/pg/16_plus/create_column_with_storage.sql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/pg/16_plus/test.json create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/ppas/16_plus/alter_column_storage.msql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/ppas/16_plus/alter_column_storage.sql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/ppas/16_plus/create_column_with_storage.msql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/ppas/16_plus/create_column_with_storage.sql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/ppas/16_plus/test.json create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/16_plus/create.sql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/16_plus/update.sql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/16_plus/create.sql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/16_plus/create_table_with_column_storage.sql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/16_plus/create_table_with_column_storage_msql.sql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/16_plus/test.json create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/16_plus/create_table_with_column_storage.sql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/16_plus/create_table_with_column_storage_msql.sql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/16_plus/test.json diff --git a/docs/en_US/column_dialog.rst b/docs/en_US/column_dialog.rst index 7f4f9501e..92f4e4c32 100644 --- a/docs/en_US/column_dialog.rst +++ b/docs/en_US/column_dialog.rst @@ -43,6 +43,8 @@ are disabled if inapplicable.) for the column. Compression is supported only for variable-width data types, and is used only when the column's storage mode is main or extended. This option is available from v14 and above. +* Use the drop-down listbox next to *Storage* to set the storage mode for the + column. This option is available from v16 and above. Click the *Constraints* tab to continue. diff --git a/docs/en_US/images/column_definition.png b/docs/en_US/images/column_definition.png index 2d753aaf602a9de4c73d1273c492f167d01708de..68ec04af2e13f272df2da7e83f7fcad03f1abe63 100644 GIT binary patch literal 67126 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⪙c zl!6i4ai+R?^Psz6bqHJ>wESQR@~7u12XWi7yf~kuPOk{^Q^hY4IHFWjZ^>WHGW9a` zW&6eMc?{zAz3nk(0rs%=y~3??fB%RzntdWPh}+@dQtjqoP+9&707=g<5$R>CDNW~C z%ltHqhLXPcX*~WHB7?7kz5%>do?9-L=09r8XTXA&j?NqTW2)?D^1Cva`aeKxGl5^8 zex@gGlI}O@hYde9Q;P}@;gD=dGhC==NcHO=o3ZnE&F=fz2by84vYh{5v7NXB0xp@3 z6(8t>P~Xs((#4o;=!t%DW2HXn{zjO4X~GD9S_B5tmF{qqDfikpizZ5qU!ETsrQJK( zkcbF1cx$znVaEhhlV?QCrjmP`-@;zS{p&9b6Q!EJAw7&MBkLhkJl>sFvK4z8ceRiq z%J$(slRb(B-nZOdOqB+0f9A*KqAv47RmhE~e+7BmR38nlta{ML*&6c6{L?&fG4dYK zlCj_q?U*AjpauV!J5oWEEbRRI<>FB2l(289#fzc={z&p8c6(qJpsA>2e8rI9F$Q%Nz$->SC;Jjk7w z30^{%KM6G=0KywTude8EyvZ=^yrW2DKjEvIvj3sDfS|#tbv6r~ggS!Y_5AD#^+wRg zw8}8M*V8gmF;@=9)j@;4#)5m9%xdIV-WIyV4P>56M8u4r3Xc7cyPjK^j2e?{i4POW zGbSX79+TBw{Ji2OgS_mO5m>DJS=>BIqkSvp2?v||gscPtkXHQ_9b}z;R{u~am=L~r zYKOx$0q*_0)&U6Q~+>CB7X@#{BVT+El{YZ{!DT#{|oej zQTPlPLvazY!@)n{x0Ijwz$hx)&o}+yU;Qo~IuQIK_)7ju0(_Kxc)*WNc-qrGVRpkP zvf(PYs3HHWfAy-4R&4lV7AM5;_i*A~(0PV2>B?*$8RhOo;yBYzZvl&+?{WEy$2Hpx zs(lb2?{f#G{Eu-;oGW#fi$__xQHxO`Tv-(60^~Vn_Hk{F-N&!R_0l#!-TofV>&_Ed zy>W?@)6@eV%xZ%x_Ta9Z{V`9j3JP*#fm3$u`YxwoHVwVmc0Y_I`ON8Y7cLpG4z+hNOSvEU$>C-nL4c$ zDy}?V6Q*fNZU-0fJoJyQID3xyyz|kQRk9qHupF|AYKv2j!^j-@uoI(E6!VtAKOeyn zKcCFvBB?O#<_MfMblaeAA;wUSd}RM3>Up?BR{)Jn@icBe_To~wx|`wF>+c+q-qM`m zqNm1gr?b^9-|C9zmMt#v1B25OlywR6lqA=K%NUBfXiDxn>7AqVYj0eH1(QNU8Ak(B zaYrOlJVSb{Rr_qT*QjV{+LaR{f2oA~*u6|mU=QtuQ+b|`gi{m))l|x0b+-!bKp2b4 zf^R@2?r8aKt*Z4(V^s8rAX?wdl%sCJn;vUE?7C-?JG zHr|3~X7`oGb{O}NQ`9$N2& zD>JB@<=%;Ci`ng-#q&Dh)#gnJHo+60VLV0wHFf;J@uLwL`D9HuU?@lq;AQ;F_9dvA z(=UqJ{t2ItZ+9k_x^3ya+C1?;UQ;3gBdCaiMoOmCiaL_uRj*8e(wy^7G>wX-aMvT6 z<-mE{T5EmUgd~j*x5h=~>c;Ct^%{$t?_xk5>Bt|5*OlSf9B8@Px;TQXrk zQQlqwKG*-)fP|3r{NXkg%sWFv!!Y10&&a^o6+`!)4OXBE=*6?qOK!~X%r4ec8v9Gz zeF{Wq>nYv~WBHtxs*sb>`STkFXm5%JDqKNeE_lB=no~jU4tz8UIZ=~4KJE17ok5W4 zbm_$EKX$Fo!n>chIaF);aM>BuYLV{?y7Ym>x zFNdFd3O`9$NIz(u4(!99)j8RPgY|IN=sh{mbDEd-BwTvkT>EV6Zja@Gx+{iQ4%;6y zPTjqB8N&KcLMRtcPB3||Qx2zUOG}OH#)S20Yzo`oi&pXt7!I?tn9PQt*^Ur=wc+Xk z^Jr{Ju!}+BhWJZ_`lzC&9dBy=S5d#$vz4FY{GE{!aA|323psoA>bQXwQOH*Ss7y&X zcC;?9|J)aLV<_|>%oV?VZ5TeP=0oY4OFocU0Oy(%=`~*-ulK`Q21&rCM9x<0`R9JF z>%v|D`)zhs?6ThYYb(>KF2e3!6H!~lfnG7Qg1WQfb}~-05O(7+<@yhCR5A?L8G<|R z9?V7BEvRr+B>OY4czpg^DL(`ii*%~AEAll4#iDAdK`KKgsC44M(zCL7cN1pII&w=Z zT()Ey2#yWwdYUJ{lJK$YUkONENT0??EByqks+iepGr1tWhUbp(mu5`xt zS5k4Y!hHRh<-{BMKx>CRRPa8Iiiz(&U?gW;=#G2Ms_Hh#`ImEWQgMe+^~DlK!21ns zK|v&X7;WJ~kQiH)a8ZMU#vApL>+}Ay!L;31xv7F}lZ02*H zD4Z^s;qqrsbxF7TTTbrX6@p)&%V;QfQX?#KRIH8vs<0=PSMxJK%>WO}cQ?W1Xfor) zVlnX1@ibEM=#SF8WPeg!ZqowALf6UU>$FJKYMbo$i98A%=5r>nAR{S&82$pZP0i?7 zAIm~OEK`7+rPc%pS~LZXDV&cmIl&}Ld&nyoXNHA8j{1n0+%MUJ;%xzo>2X zDDk{~aC?mtGAtGpcI#vtDhZ=(9!htg!Y(zPJ}XZX1PZC6e&hUT)Qn+w!{!{2lSngJ z=vJp@)%gG*pUg*LBo~?vmSN;}7ok>78`eF=tx-SIeQkK<4sI|ARwfUbro-L)XYD&| z$M2^%9N*So963+sI9fYit`hyAFCnkm19D)i5tXC8Ys&6r89r*@4=uZdT6=^aUAb$9 zQ}!OUpHRAm>LIFP@(x2(2rd8ec)goCnC}Z_lM`GHV>tRd zvi52#=Lir8z9)|vcoz`760mLJDA&;)*(t1eKK`!ldX{GpFqhs_tOO|0IDbR)%(iY$EOO4j~L3f zM~Zm%>h_;^RF6^F9^$F8w-TlXthi&c*ZUD+;F&LoY-bnHK1+H_e zMnL0$dI-AyhJ#x5vq4Y77h2^Alm|ZADcIeDX1>R9iHQur8(b!5%~g)A8TWGmOcy&t z-igf6&C2chA|2m4F<@6VJf_Z%v0iOAL5t!D5kIA_1v$I`MXWNJsT|Z;?+CV0I}Q=A zBF!Af;#mGkUzzbg@t!}0KuS$QT!3q5RyJ`;dIXt8%bQQSy0^(4 zjNjEzkIUcJ)nOduVdbqJuatL?8%+>U_uX%=VUCySM8DeW6ZP(zU%*IGzHPE$nEGZU zPFI(0!($X9!CW+jO_Zn(q;ac_!Y#UGBsU@u+ZWR$dlR9?(G0&8q&Sf;-&Ae)P4|{s z#<3YqNWd-OrTYU-UFMVcTOnX}(&tqh!H|(|)W+@Vn}f9k^BtwkIIf#=V3QFq9$_5y z-b3}9-yLYOA!!A8_U;xJ7whiW>g37#0fXlK?Y{eNBgQ4rfOi9k*Sx>ZzOjY<07R#D zOq(~D7BCS%f;R;LgYje%otl(HJgo5OZEwZxml=62&i!u-WsD;C396W9cF z0}(oOqE=#bf{L7VJ|-*mgc0T&_GFZ@mncz-2SxnxC+Y^Yht4)y+LvV4vm!^W$1U0_ zVzy%in)56wKuMecs$T30urY(|=N*;S?l{KB2u%4w@zQRFRwln9!9AP}CPJ!w*!1Di z*;=Zm1@G-#8qO66FWu$(Ue6ILMFjY`4THf~^_Oki8N=JpAibYigQhF?sgwe%#OiO3 ztYdjro#FEO_tQPY57xdvsBCTyVJ>v+emOn(CB=hr1~H$5?1}9_dGi|O5Ol(Prc&eT zY|}LQ0XEMCE-UUx6lc%lgGx&r71>>jR5Tgd#&kjw1Z7qq>`LQ&h;cMGbb$&x8MB0h zh0|WVs7B>=kGtnXOfsJL6p-^Qb|fGb*FSS9Ek!0pm9;gmJB@ecz>I3Ku+|B)462(amvFdngSH9fKIUm6QlgqD`5x5i`i<>M3U75{CCpkxwZPZplM`k>up~Ar|0clNLKtE#=D5A#cFc@XFcDYxx zzti}g*M7qQ(5bg!;1Z%#oDU#jT{&pMsTjvT0rrVTM)L)=7U5(!i(7ANs8MLpDjqS} z)eEnt?+)x7MJL~wwm_n=3E$pIF#nnIC4ljESWvb+oZiTQsUvR?Nj+N4>bts`XOTy2 zIR(E{$BDi1_T&Q}+GY5grGNaR-}GZ#Jaoc(hWDZ#?-UNm=MoA6a=yEpbpl0Bt(s0WCj9rPE!{R)kY3?$Hd&04Ic{_lbfa-kCIx~Rp_I-^QzxGlN2n7~_ zN3c}{)?e%sbxiNqnp5bTn4#HV?twUrsCO9wF2jdNV{mCfos&%@8ih;i9>2rl<@yfQ zSLr9t*oB)1zwp{S>(2QN&S+QSG9SPE42zL&b0%cGZ6_R>t}Q_f{&)r~`jf1ONs{xg z?B{Hg2L7qeGHRc1C_QD7x-|930i^`INC_{pa;J>cd7)kjV zDy=GlV9}oqfUuotO6_myLA(M3NCjqycxzUy4)|}L*ET~RdYrL=aT(|HZ&;eUyfzUyf^qc2nKB~#M!ZsdWl+7X_a(tv)w5J*z?al>WknPo zrBCLTu9A^uIA)FUzWs+Z-jgBaV-)1MDi4|$eFE#|R;vn1ybB@w8#+Oe`x!kU`}MbN zjMOvM{m51Wg~G6b>@Qn!#+0cyu6JKladLsozsnFtu;OOtN@_aTL_Jy9ohOis8e>U> zOcI4~#!Pbj+i{!q;H#D<)Iy=U-Qo>o1uEe>$u;SQr;9c&V&E*C5BJ&||NkiF)Z?e>Ngs%>^*WPSm>Ru$8) zU^XYN*JmY%171P+)fN?YKr{lO3Nbc^(NG~vKryFEO=*ZUtzr>rVI?cwu#A)jh&&Yr z#Gz^kC~XYT!s*t`2ptW{TP=@1Ji+{;jE^u4wlRu8-=>FV11Yu0Uu=Ys;adhlD|N0g zvD+sC(y);MzN|;mO?-{3rM8jCGPbf{5nzlM#WuEfpw~o%&iZ7++JkKr*)b2N*@7#H z&#`zG#qSm$YI5)_e>=ZMnj;P*O6al`*^1nbOf)7v!raS3u8*+5AYv>v1?^+8{B1;2 z>QAP8%5`*}O`-Z`zcG~wfB9i2{Gqa&@TG-AHL6o%zVt57+0-A1XpP;j3D2E&+nZDF zP)s-)N`|x{K5(zK({e<2MS8-|)t31@5LqbKYBa`u&bto-*(H#)Y)9RW&t?$Urp-YZ zpQkLOZ(z2vrbLu)=xNTOAI6^+PFA%1It1d^?iCZlG$S6E2PKTooPp7=wCf->w?%EiH9D9{ z4!%f9pBkz7jmPLqo}bi1OhSVU*=zL?*B>L(+N5Gv%8A!OxpZ(u`H$tLK(ef9Y}V_9 zG3VyihhsvbiA7_?aTBtnSBEGFY=+RBVrls6<1{$(mAJLT-+d!;ufKU0* z=!uaO*0}R1f0(KMqIs{y!_%`4eE?Z8i?`X}HHYdK8Elvgl)$UFh#TKloPXYVpWm6r z^98;}#S_;1P@#9Y(AltEw1M+QpI33iZjW4XuP`A5mL(qX0m^OpwY4steUsW8JibXY z$5DaB1HK?||Bu;T!CzOmLy1=TcY~SA*x8XxNEW9x9eJ83vBUxC>ipWB5$~C6&3UOk z457P^Z9;`@yl__hYg3`#aT~K`OL1?lBd5c)}t^zwL)!TvG^WjwT7M?-5`UrI^Hkg(2bZapoNQ zoj!TCkd0dRQnnB5++h2Uv>v-$Ec#ka>P4#{BUUq)`Spev5WrZpESfH$1YB)Xo+xnA zQ{|7N#oLQ33lrHSK$ZZOz;MKF4$9XDsZ&-SV z+^Se{OPeZr|9E&2d{sduMSJ%$hO)pj1^G+iryo+6tEc`VjDboGl^F}-i$^ps>NhYT z($Qo1n-eY(k&)@Lc4J6V*bedpjB(gB)X4Bnca+c@)HnE_33EI{BKXlIv+Rcy7R>PN zKU)<3IALVid?2gMjIsznM<@|VUP zbl5v+xCM|E@mgs>;>PoWwc*^lbV?R7>*&cgLD%Qq?p@3`D#(dOr{C>SpN>wcL~Z%M zz~F2CZV%DgVjesFQ#|ry3^?hj_z-7Awdm#<@qCD+oF3`_BW_QzLD!0A5!kZuO)bGC zg=c^Pp}W>vVQHY3LssPU3m*q9D9*zjNu;?~;-qNKM<#_PK$}g9UW@AT&|7iWHJn)G z4T=G71g`S$7a;D;UudUavQ+_-^2P?GWXL~X|1C1vB zbUzaLxE!ued<0wUo zE|>A05{#}#Yue`Q(<}#JJX@z(CR!gOlj4$9KU_IqJEUm;bZ=1%kMyX$R1kADcgk(= z93se@kysUdcRaiuc}{V?DygUzQrz6>uzbq3Vm=#1eKC?1N^$|g1fB$2jqX&69%9`X zO}3uSNyfFvnNR#_aj^=GQtt0{PN#;UE?j{)kZ*T2dbOKzsFDqZZB4!+Zh<9ucz18Z zhiy(%=_I(q5^8t`R&A%;J{(1-dVXo6q&IB(^HLlq? zw%6nf$w~!dFA^xF)3*+Dd^tY^e^5O-#^~`!KJLL8R;XY_pQFiWCKN}0N>0+Iic}f$ zJ3iT1@@_QV0d(Tq5wY{+3nWaz1uk;`i0q9OA~7d+4htIo4cY(om^8nkrFo z`YbZdaI2>Kyv;E<(1h7eVAIT&gIx0Er#Pk1;9N1noN&(M^@+8?fR}m78cMY^sw*Pq z0{cZ3%^(}4Srz&{g#@;92`?_<6QSSV-@;1lXU zH$dKf4NLh?c+~R+K+P?rX#GRXfqNm~uK9=$Czk&q>&U^|kw1nnT>iPyf@$U5*Z+y` z^AG`V=k@g;D-Qe~P=CUb|0f{J0uXx^AEE#Gz6;E$;CxL;PjCc6_!VM_`mo-{P)ZMZ@mQmd*=Up=KnMK{x6#O z|2ypeJM8~E?EiPI_Wpld^C>Z&g>pK7W7GbwU*!#u{$P5)i=<=2;7Iy+flJ4RSV8h} z^uy0Wi_C=*YyH&kKE!K}M|^+rz7ArCEK)K0x!}f9>0NfV{^Wh4(op>FHTJ3ex`5!^ zm2)t=3}1aRV?(8bjc+&dt%VbR^)%_b$y@iIw(r;kjUG$;*6`Pi^IbB3#yJhwY|bx7 zW%$?oU%M+QPjpnH&Nr_2)7Byyo+0XH2?VQMSp|oOSMXiw&Hr^*TGu|fRVhaotMaw^ zO~CzAr5>S<&dyLeg`)sZEtC({zkP9tR)%mSukMvx@3K=Ts8~Xelv>#YVQ!Y4U*y87 zy+)V~E`?XWM#OHhtbTv1Vj}g-_T6)H`f)wONCK(EcOo2PcI|YUq^9Vfd@APVmJN7v z`7ph|B8iuR1F1CZ6PBdW+xJYXs%he3+fVe%4$s1A!)ji}Ph9Y0B%vqz&i}1FeQ{_P z{U+OpT;lbO!}dP^7~kQATlLM-(jbHp=cHxxbi>S;R`2}&``D|&n=Dx_$llqG#_>wK z0sn}M+ryeE($au`eDa6oG_vX)`*w$F(cj0K)a!k2ZGd*S_6ooWZSC7|#njRNRWWr= zA)Z6M0`xP_tEwDX%l*60xudX{kIRFq>*pnl){r$+S01FsIW&{r93K3>W;?a#dHm5+rlAK;KoU)aObr-x~$XQkm)MU3s=sQph29sB_7r=Ju0{r(@}wXgpF z5nliH_uJ6H4fd^h7Qr_rQ=$KvX(d2=0j@INJlm%JKSo?&j$}>)fR^-z1c0XV-`p3j18s~3J9>R~bGY6^-J5|{q8$g*z9xJ}W{sVh@7<1g-= zM;S_nD&Wjs8qGM=zgA@85K4V}xN@LIsc9^bVk~TabTTM-))bX$V~8SY8`GC=H7;&&E>F|Rd#>X8_``>} ziW7>`oMjeB8PpJ^yZJK9a&D-@vOlhMBG#v~JDZoScSF-xTa|PfitRo%g9XsEkgsrdcIIm5^r2R~*}i9n7EE?^D07 z7+pSEn#aO^uy?>Mez{mqO-+6Gsga$m3LqDE>RtaW(3!QD#%jQ3>a?Q1Q^#dqELDxC zxC%Y^8t?+BF(_aXW-Bi_oURS#wbK-DZUkc@mgVKCwP*h=9eHw!BG}%^@=qN}2#wG* zjC8}tD6!E_2e)0PIg=aoBGFa_=e@d5Dk!zAzO8jyQnLRnDaFv~*W0fdS=2p&h3+=m z9Lw#r?K0`Gf;FQ%A>>0?^rk6b!}`{4jOIMtnd%7s*{@gekmz!$)-&tjX4rr4cSS+d z1Zl(vGnFWp5XD4#-}H+q%OQl zY8H_(ixq(;8jYD5%~K-W-T+;u{9gT+c4>XBr(IpSgTtf2!C6UBT^;)>``53GR38t8 zQ7wb3=q-_#&vO_Unwmt$lNl0_P_O-yc9w^(h7Nd} zLq^7LGYfh6GHiZ+GT#UmRjN^_-#6mACCI%f=|46)o^DmjHxQR2IH}b?Ay2R#$i}28 zCVuuH{BEJNhOYQ+>*1s-3gb7#5X5;L+zS~E>%m%s@l^MSOBU}Cr^?F>0- zv?say)hD#lJf=Yhnl8|;M@9oFkBRwd*NNwD$l2JseIMDJ1^CZvO2sk8WjCG1yA2v#IZr;6tkz?TGbMoUjB|zo}HC3F|PV#$l)w z5O7}<56qL9y*+V~U!Vyh1chS0Ppc4h`DK-WL^u=_3cuAK7|`jy-$?M58B*L23L$Ws z-OJQ_r&Q>*kGF>@%MM$`cgICgOj@E^JRD3^q&h0D ztb-)KH*+a~Kjygl^S|m5{~`V9RpWttv46$4`LwZOC(Gm^a*(8exf1(iK{$51KF#9- zoq|^v#a!qWRof&hObznJ1OB(JT4ceq6~R&*~8>8e6e8CN^kdcb1_ z{P#rqem);gT$%6l*B@94)POw$+(7zo%x0w91K+Mh1XNyI{S0)pdY z-ivO4g2JHKq@$gM^SIjMYeGUCYmdT643GI*SVLKh_emO%1{zMHgZ*}8SxJSw_WPGw z2I8l5OiV}#t!`hpC2}NztPSfahJacd*~AmRflkG;IXQJxIMQ1m3pF>ZRriZLTnBQJ z1Igv;m{?qVAxTm5I=5)klT%Y$|FTXD zx$h;@*o{c|t^m$utNEZJnP*%?V|{&{EQr$-mrpV#u9}Z^2o?YeE!HS(hO2xL6Ln+< z!tTicGGol%yh~&E+xB@Ywkpv)@Riv&NE{e~fJHV)R@4||rUZ8z#6~mE%^(|O6%K;; z)AV;C2ZcKM$iU@jIe8=fgc}c}4c0F=!ejS)72d`gz)^J$PL(P(gG^V0$^h}FXw$>l z@IST0WU&TAAzM+Q!E=o5?#P7r-7YOdMrGqVTGRQMFx{Isb(7GLEy6wftw#VH*#w?x zfT2rDzs{Zx5d|ZGkVSi7EJxVrHvq^r3jyBLx#>NV=ezWW+wnla1PN)0J3Q%0JOkS3 zu*izZ@+zTQb)E+ra`vLwo=vfVr#?WRvc03x?)y05jY8#I*2R4Glff<) zP)y)k0_{lL-p7VbK$H0<01kLkZ7+GRqyp`B>i^oH5$_^95#3xV1>aeM@VXnyJL@7` zJ6U2{ub=j1&d(z+#qh^_rv=GBi}&G@!dlnt@7n%yFfhn%k7RDpvjSP~AC^{DO$D<6 z{4`Yb_8XEi{k%51355yK!Gj0yUm}doz~Cn_pGR!Vn<&x8!`Tz!+8v+l=Q*&Z(=b8)g7bwkEj2XF@g@ju>#fkAM$C zfg9%U9tndeE6NQ7(g=ZstRD9iTcz{MaZvEwL5A?(OtsZ`HZ^6s(vz<;(VMS2Zo+|l zJ7lr|_Ud*GJ8-uz3y?Gn04;w@&ssW0TfDimE?l`Y>iGn*N(Zah7Cv`N4)gBWXopq{ zUc)yMMq~o=!;AC|eAbFf0#2%8PA#HW2Z_u?Kc78DidD{Cx6r=~XF4U*nRqLO(XRJ8 zh-GxB z%0Nd$%Z7f97kj$dX#OCOk0H<58FYoswg6bS#RZ=q&WDe%XH0Y>EHmRT7HaKiAMdZd zeKN#h@rV$tlxU9jMy2-Y(YTVK@%`JQhLz?)SpaMZi<(L3l6puZXpl+6Il%12pFQGOq=_Y>XE9|1ihkleU@*&C`%ScXy9geX z)mSbzx^?@C4b)q1=V2_@J7v{qfg~#RYJPmT&=pE`+p0oEC8X#}#*i(#sEQ1Vz#`wT zxXCvX0GQ0J%D~4`cMCzYi9Csln*3W+h4s2W#>xMc2o2X(t1fh5MHg5 zx}ALJdo=yRc2v@?uChP4`DsfRG;=stlk>~VT;2R5q!)^5z}PpYXEKIYTi&n|(6YIg z_GbP5;DC)EKVwQocy!LMnsw+qib3hP*!>7{O`}(DqTfkPQxhuTX#+1P7~tqK5QCp; zSw~A+`)Kc@!^Ia?@csCb+zl9p^qi6vpXBNlG}$DQ?kmeh!as&4w3;8HHa+x=!F}Z_ zrcedO*C}}+CN9IN3<2Cq$4zc!wRTH}B>QW+HV0AR9IEX~z70+^!qc31h=W2UN7N!= z>xIUDKe(y0$1J&Do-~@?b}!0DUMTv7@LO*!Qu0Fcz!T7FCew(eGCiI@zslV;l){*L z_~fk7zWAR-EwB?+;D$Ko1Hbi2qw?UUNW~j2Pf}EJI9zYCF?8~m>jh9S2u2cGPh&F( z!x93_Aqp^tmEw8PHKE6FO&Mek7JI@FC65m86*n5d%m==9IF>8rqnU0-+nn1Y1i_) z(6!QWgee7^yCx?MVVSTfjn>I~ujjKP_eG`^<}nzu;=IJh;!>#6sl#FPT@RTh6Tx z56gW!m?nvSEG*qmK(+fTjMq%0$F?|(v@J|j$HWg}&kybmtpDUY{LyRvNYCV=tyk&c7)j$8I-Vi zPp`D&s*~VdjSIFrDyp#dC?}jfTnPNq%ZrSfDpRcr>89q(W0~coL}thBHtFrc%F}k= z*O_ty;m$9gKkKXWb-ws4amRKg?O10$x-zuQUAj)WfnTp0FLqb7$i4TnFtw*5sJg#T zq>~7ik?=RzO6~pQnDEH}Q(^Xcw;Xc?+vPg;Daa8#LN(^UCPH#%;phi2HA|M*oss!` zpHV)-xvk+&Ieurnxdx&WC|&MDAFl}2qWCi3+hVJTUTQWS!iP7nJD%IlD^-j&A_dB6 zJ+>!|;YVT4%)7Mc+U-0@bHc0bA8E7Ob~|sQEf1U{Q|MpdRhq6Y5Rz)KQE~s!f!#X0 z*NdF55KlH3_z5!6Da@2!t!-LpZ0Ca+zL)m~RhtSC*+bW%XWJ$egFH8GTq*cc(GmZlCx&8!6eJlCaL6EbI~8>`at2`* z!V>-Z6Pl9Py63?v%&CSOaZa2udMaYkhrz!9PeFa+}RdqsLQTqmp4n zy0jee*^o+z7qDJ9JaCE0MhE9}b))_qQpph#WTOg6uu^k;jT3?`c9Yj)&Kq0J`?s_d zTjS-&YJ8~snF2%016U#jF_$ynTrX`2BOw*LyfgfjF{3Tg1Oha1D7GcG?njhfi&uGc zXd7Y=5;me^pYY^svc7~LbRPh#Q4Z!m6CX{-(`BU*Y0wS|R{PVP14QT};`lF64Ivpq zOr9tec5OB5H!?K!G@*5mg}%Y4V^TqXRocZsCrTWuuhA#TU91w{i#~MS!=@~In|Yf& zyBU4fOEl<|-(a$6NxAm7tPB;zt0sRy3lQd0O}lrYDC};l5V?C^PUYBPOLyDBNG%;d zX80NrOFG#wG!d|5Dc`>hr(-bjZIDkfyBp0PDa(Pguo(n!!7B{~k1=l7v*^zL*c9&D zASG?JA8;giOv@7JuxWNFK8V_4O0rskAI)>nX&#qO0(MByY+g*DN;DXM<@%;xtMRHW zAoYW)%{kt*!Ir_>hhnr2W!gwjo1RN-`zWr@GqgE zou37}5zMzgs_|n6xyPJYJYuQE&R}x$AMa^o*V>0shM;y+fV)r`J9UY=XNfQ=KSN@O z0kiVXVl}Zjim=a_Wkb7*mu%5r+%WOy+i@d-FcN&cr#V?&qp$?)q`yGysD-t!(Z5&#$mqff$uXkYmU5Eej=liyJIzge*g1T23_ar>S&>* zI>i?O)kmj?D`=BO^Jo0vl`C{;;py~ROpb-b4qjZH$WE!`yV>z>=cdN;A-r%{b&Qf7 zrsIToktG#o3JNDj|XUDvL;(bge37(HY!#KHkFE8 z4Vv#w^GY;mMcgUWa_jU|PJ$$PBlM*>Jqf+gaCp4d!~M+ovWn!b%rPCTVt-ddcSa<2 zU6hrNc6pIzDQ0gmdTMxCRiA5`Ab)}o--IJxXxwq5MCneDRvuEv7wEzeli)k#Uqqy!qkd8&QUNplj` zn2`FbGqdePO4Ru7+@z8cWY|KjAyjKeU3^#fQy17lw~+^q(OIU@z1jXbuX zlN!hE23xv(sm*fQD=`!1nvQYxpn4s#mJ@ZmDa8(zVt@OElFTyI;Uw$WgTawlVXLN) zPwk>YcA=GQkMRdI2mDq;zkTf9&7HD4>*c$6r^*eVyc?$5oMX(-C7Y_qv^-=^*~lt= zxmd$QJ0m2Gt^-W5eh1etTanLaH5H#94Z+SLznQ_8qQ>lN++9dg-Bg=dEhcOS$I%Ji z_vO(yy@emtZbnMrgwcn=^)}Y+$-DMX5K#VIixNS0X)iF5Vqd%oV@3ItjU7T|3PIor zL??|xrl-O^M5RLIe;N!W$H?Xg*%EymS`eo#P!Q3GbU!80M^59erta#XxT%M0-gFC3Y<|FJ(6eXt@vph#J~|J7cTc!86bAEC^jpIG z`#{Pg{W(JAU6?m0(=)4HUUVr6+;ko(OA{7bch8^R5cKLx~|otFTB) zSz9^~9Z?j*amGz2EX}WKfs=+~sLRh(_!@{f?!QMf(NhFFZo;D{ql4>0YCy35tXl?}IrQuDWLQ~Ks!a+##v)a%ga2TCv zy_%}{W9`AtNYC3W4LL^jrW_kOpdVxRcX2XLt8}UhsIyON-~8D!wyJ;N3_I{9l;wpa z3Hl!i0oES{=f!>(a!1NDjoci!*)!M2EnwO88EP{wxI>droKPJ&8o?uzji;9(w zbCAYl8Gkhbe!5H~JZHrn(0zmF$JQtJ@p=Sl#Os?tztjz)_?gxzees&9#4id3ZQT|A*b;+bAQnH~yo6ZXC-#&6^pF{WEKyGpXv%qwp2!> zeS^+~XOCGk>DShKN&P{`XMYb1CXJl%-(46+Onqh;II0}+uo9HRHYMSzjki3RDNm#v zO+4XqPPImJyxN6pT4|KW+8JDJZEclQkFoE~TxKM_IvyP`-fRtLd0ilbZ@0vJ=8d;o zM1=9HOCo6o49#?;MR=4P8Ecb9M6r6;$|Wo0sKLEzwpK>A!m7*eq<-Ot$~HX_nr`D_ zfH;5NjJXGA5!UhbJkeaY-qUR^s}4@$vgdxSESOQ9$BrnY;d~`;vF0$0yD4GQwNFe) z8Txh0!Dse-{$z@PYX>&&Tzns1UDfqw73%5MIluJ~&Qbu}f2yF&G-%|`pk#Ieaple5 z#fLX=iqN|5-ByGx`AqBbVbl2TwSlMMPnded|)PLMpd~SNWAcEXie|@pc zP(e8^T_u)uX#c3iD#zJVq(DaM`pLnrQLu!1wbF;o6LCo~Ae@K?-;Mv&eb8nsNQ)%zd9KTKp+dLL@V2!`kji{Dbcwk|& zs!E#z5pw0Y#u^ulSlLnVHb-ZJ5FgKanYEy*_m}EF$2O_^L^Bj(=xmkwIb5jSU^y-A z3xjd)`SI{ZllR=rBo?9e6{5pf+o!-AW($)?%kx96%%pa!$nU(^bJe=_v&h-}lIh47 zE3hEQx6uW!L7m}AOHW!ufi=_{kIvNcZtWE*9+yy6fR5@fO8wX7DAi7!c!iP~^vW

XEB5is&Cyos1uSt?7lFb z`!G;=kq(y@BK)DT@}EjD#bi&=Kv{WAe}|f3S-puij6Oh+ zxr;Imldnd&4nhR3mDI5^!o@efrxR5I@Cn6Y`Z#!%Z2^?*+0Z>Orp(NHV2x_CjWzHQ zlRn)fmzJ&v3<^8bvkZAfZ#vR1jxdw<$`vBd>Bs+-XZ0n16OD9wYf-HE+jcde_Zo~) zbanFukQ*an-{7KvEG(_+8n-E~&`{m1UL24Lppc;osC^SudwNe?e8&|ZnTRLwX)!wT zZ_%4=?S%z97!$Sx_>R zbi9xBiK|9^{ev+ML5!4v+5d7uAq)l*qs2$yi`Z$pXCf`s$=jY5+0 zp22scgO^+!h*XZ4tTzmoRu4lj-yGtvxqGl^)>FtQrf4>+);X@KVUqGIrc579eTT-< zY>3u8!_9`pWZ2^A4Ja7@{;>A6X3|o4wm?g)`|?%R%l=+ANt^yrZA|5?#)?i zVN<`|CM#6$R7_b>v?G+AIy&hIQlLz_$cvuwRq0-INr#0>PiKV7mrPCS25`gArRFh=hgFz;X18fT%Y}$FYh06 zP%laNW2oF9*QfO4ink9eQ!Ht%G~rRJDh8X4p-atg)Gsi?yB;NvW-JQ`Des|&$BS#) zrz#u09%^_mh`w$(Xhx@3rjiT0OZHo-7wuEAan7`n&)213IbD+N6WLuhE0U;%LIPcXUo?a1G2Ql0{hdxE{9=Pg{Rd!FY^ z_H^<4Vj7;U>LDh%_f&^@^49_4uV&9TQc0`76EcaqJmqc)K}6U^b!d+@3O0ZqVFz}+-G07q6;Lks+aG9ap$M{Y0A zx#w(#Z_#!u7Pyt!cfK5njz2a^TG;C6;(zkt_OGtCZStgKQgph&aJ1PI>!`KU(p$%$ zTRYJm7*94Zy2;ej1pXygyD)e3Ue?DtPA|4g!KxNS1v&4oJ-DmGBf-1mK7}po141wN zSLJE{kR;3124eiT1wZJBov`Zk|xGP;Yubl*i17IA@ndTiJ|q zZ1?ygDdWq1I50tG60tO13(O5<&Fa1v-N{v)g=beJ&r^lT>I)q%nXQOE>F1Waq9Ctn6+5S~`C zVMY8QWHGcYE7Q%U@;LObccTy!uGWn3dBSauvB`i0zJGSlU`*X6fEg!t-z*J_-ES4X zBCFzwC-;_RFDo%!Hx%Z012J;_qB#LRtlxkzgk2F&cHaXRIAX=;2=afR)`uS z<87D3K;0on2541H_~IK#;`;C%rP{xj|8Xiv|IXMy1@hLH(6MMJZ*+!_>Wd48v8aRc z3|ycXWV_&_O6MZ87_<`n|J^9?_kw_xp^VZ(Fgr9r*u70%+w4-m5`HjB*vuH5pbg+swZK} zFZFpH#0hH5)80-azrWh=XZdtd79_HC+^E{YpD>m-Uco|Xhr^B`o6 zctpTA0C83=MnE*^QENx$T(h+kkq|}v&w%2%=KXNX8_`Bey&d@Q6U53Q(3vLy;;)mK z5KR~YW3JZ=HM7OvUrhD8xj8Q(jDrY%*V5ztX87+f4H#c9EP<*#aTGj9Kict$X9&3b Vn`nk~q$&t_D9ETtS4f(M{1^W6&*T6A literal 55653 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 160000) { + options.push({ + label: gettext('DEFAULT'), value: 'd', + }); + } + return options; + }, + visible: (state) => { + if (obj.getServerVersion() >= 160000) { + return true; + } else if (obj.isNew(state)) { + return false; + } else { + return true; + } + }, },{ id: 'defval', label: gettext('Default'), cell: 'text', type: 'text', group: gettext('Constraints'), deps: ['cltype', 'colconstype'], diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/column_test_data.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/column_test_data.json index 17560d3a7..601138fe7 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/column_test_data.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/column_test_data.json @@ -201,6 +201,35 @@ "error_msg": "Mocked Internal Server Error", "test_result_data": {} } + }, + { + "name": "Create: Add column with storage", + "is_positive_test": true, + "inventory_data": {}, + "test_data": { + "server_min_version": 160000, + "skip_msg": "Creating column with storage is supported by EPAS/PG 16.0 and above.", + "name": "test_column_add_", + "cltype": "character varying", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attoptions": [], + "seclabels": [], + "attstorage": "e", + "description": { + "comment": "jsoncomment" + } + }, + "mocking_required": false, + "mock_data": {}, + "expected_data": { + "status_code": 200, + "error_msg": null, + "test_result_data": {} + } } ], "column_delete": [ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/pg/16_plus/alter_column_storage.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/pg/16_plus/alter_column_storage.msql new file mode 100644 index 000000000..14be4f161 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/pg/16_plus/alter_column_storage.msql @@ -0,0 +1,2 @@ +ALTER TABLE IF EXISTS testschema."table_3_$%{}[]()&*^!@""'`\/#" + ALTER COLUMN "col_1111_$%{}[]()&*^!@""'`\/#" SET STORAGE PLAIN; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/pg/16_plus/alter_column_storage.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/pg/16_plus/alter_column_storage.sql new file mode 100644 index 000000000..af753a1ae --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/pg/16_plus/alter_column_storage.sql @@ -0,0 +1,12 @@ +-- Column: testschema."table_3_$%{}[]()&*^!@""'`\/#"."col_1111_$%{}[]()&*^!@""'`\/#" + +-- ALTER TABLE IF EXISTS testschema."table_3_$%{}[]()&*^!@""'`\/#" DROP COLUMN IF EXISTS "col_1111_$%{}[]()&*^!@""'`\/#"; + +ALTER TABLE IF EXISTS testschema."table_3_$%{}[]()&*^!@""'`\/#" + ADD COLUMN "col_1111_$%{}[]()&*^!@""'`\/#" character varying(50) COLLATE pg_catalog."C"; + +COMMENT ON COLUMN testschema."table_3_$%{}[]()&*^!@""'`\/#"."col_1111_$%{}[]()&*^!@""'`\/#" + IS 'Comment for create'; + +ALTER TABLE IF EXISTS testschema."table_3_$%{}[]()&*^!@""'`\/#" + ALTER COLUMN "col_1111_$%{}[]()&*^!@""'`\/#" SET STORAGE PLAIN; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/pg/16_plus/create_column_with_storage.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/pg/16_plus/create_column_with_storage.msql new file mode 100644 index 000000000..fb39bac4f --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/pg/16_plus/create_column_with_storage.msql @@ -0,0 +1,8 @@ +ALTER TABLE IF EXISTS testschema."table_3_$%{}[]()&*^!@""'`\/#" + ADD COLUMN "col_1111_$%{}[]()&*^!@""'`\/#" character varying(50) COLLATE pg_catalog."C"; + +COMMENT ON COLUMN testschema."table_3_$%{}[]()&*^!@""'`\/#"."col_1111_$%{}[]()&*^!@""'`\/#" + IS 'Comment for create'; + +ALTER TABLE IF EXISTS testschema."table_3_$%{}[]()&*^!@""'`\/#" + ALTER COLUMN "col_1111_$%{}[]()&*^!@""'`\/#" SET STORAGE MAIN; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/pg/16_plus/create_column_with_storage.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/pg/16_plus/create_column_with_storage.sql new file mode 100644 index 000000000..463c0c646 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/pg/16_plus/create_column_with_storage.sql @@ -0,0 +1,12 @@ +-- Column: testschema."table_3_$%{}[]()&*^!@""'`\/#"."col_1111_$%{}[]()&*^!@""'`\/#" + +-- ALTER TABLE IF EXISTS testschema."table_3_$%{}[]()&*^!@""'`\/#" DROP COLUMN IF EXISTS "col_1111_$%{}[]()&*^!@""'`\/#"; + +ALTER TABLE IF EXISTS testschema."table_3_$%{}[]()&*^!@""'`\/#" + ADD COLUMN "col_1111_$%{}[]()&*^!@""'`\/#" character varying(50) COLLATE pg_catalog."C"; + +COMMENT ON COLUMN testschema."table_3_$%{}[]()&*^!@""'`\/#"."col_1111_$%{}[]()&*^!@""'`\/#" + IS 'Comment for create'; + +ALTER TABLE IF EXISTS testschema."table_3_$%{}[]()&*^!@""'`\/#" + ALTER COLUMN "col_1111_$%{}[]()&*^!@""'`\/#" SET STORAGE MAIN; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/pg/16_plus/test.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/pg/16_plus/test.json new file mode 100644 index 000000000..f397ec12d --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/pg/16_plus/test.json @@ -0,0 +1,972 @@ +{ + "scenarios": [ + { + "type": "create", + "name": "Create Table for testing column node (v.12+)", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "data": { + "name": "table_3_$%{}[]()&*^!@\"'`\\/#", + "is_partitioned": false, + "columns": [], + "schema": "testschema" + }, + "store_object_id": true + }, + { + "type": "create", + "name": "Create Column (Integer/Numeric type)", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col_1_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for create", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": true, + "attlen": "", + "attprecision": "", + "attoptions": [], + "seclabels": [], + "defval": "1" + }, + "expected_sql_file": "create_column_int.sql", + "expected_msql_file": "create_column_int.msql" + }, + { + "type": "alter", + "name": "Alter Column (Integer/Numeric type)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 1, + "name": "new_col_1_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for alter", + "cltype": "real", + "attacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [ + { + "privilege_type": "a", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "w", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "x", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_column_int.sql", + "expected_msql_file": "alter_column_int.msql" + }, + { + "type": "alter", + "name": "Alter Column (Privilege change)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 1, + "name": "new_col_1_$%{}[]()&*^!@\"'`\\/#", + "attacl": { + "changed": [ + { + "grantee": "postgres", + "grantor": "postgres", + "privileges": [ + { + "privilege_type": "a", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_column_alt_privilege.sql", + "expected_msql_file": "alter_column_alt_privilege.msql" + }, + { + "type": "delete", + "name": "Drop Column (Integer/Numeric type)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "new_col_1_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column (Character type)", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col_2_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for create", + "cltype": "character varying", + "collspcname": "pg_catalog.\"C\"", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": "50", + "attprecision": "", + "attoptions": [], + "seclabels": [] + }, + "expected_sql_file": "create_column_char.sql", + "expected_msql_file": "create_column_char.msql" + }, + { + "type": "alter", + "name": "Alter Column (Character type)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 2, + "name": "new_col_2_$%{}[]()&*^!@\"'`\\/#", + "attlen": "", + "attstattarget": "5", + "attstorage": "p", + "description": "Comment for alter", + "cltype": "character", + "attacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [ + { + "privilege_type": "a", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "x", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_column_char.sql", + "expected_msql_file": "alter_column_char.msql" + }, + { + "type": "delete", + "name": "Drop Column (Character type)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "new_col_2_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column (Integer/Numeric type) with identity", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col_3_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for create", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": true, + "attlen": "", + "attprecision": "", + "attoptions": [], + "seclabels": [], + "attidentity": "a", + "seqincrement": "1", + "seqstart": "1", + "seqmin": "1", + "seqmax": "99999", + "seqcache": "10", + "seqcycle": true, + "colconstype": "i" + }, + "expected_sql_file": "create_column_int_identity.sql", + "expected_msql_file": "create_column_int_identity.msql" + }, + { + "type": "alter", + "name": "Alter Column (Integer/Numeric type) with identity", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 3, + "name": "new_col_3_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for alter", + "attacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [ + { + "privilege_type": "a", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "x", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_column_identity.sql", + "expected_msql_file": "alter_column_identity.msql" + }, + { + "type": "alter", + "name": "Alter Column (Integer/Numeric type) drop identity", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 3, + "colconstype": "n" + }, + "expected_sql_file": "alter_column_drop_identity.sql", + "expected_msql_file": "alter_column_drop_identity.msql" + }, + { + "type": "delete", + "name": "Drop Column (Integer/Numeric type)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "new_col_3_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column (Integer/Numeric type) with Generated feature", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col_4_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for create", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": "", + "attprecision": "", + "attidentity": "a", + "colconstype": "g", + "genexpr": "1 + 2 + 3", + "attoptions": [], + "seclabels": [] + }, + "expected_sql_file": "create_column_int_generated.sql", + "expected_msql_file": "create_column_int_generated.msql" + }, + { + "type": "alter", + "name": "Alter Column (Integer/Numeric type) with Generated feature", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 4, + "name": "new_col_4_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for alter", + "attacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [ + { + "privilege_type": "a", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "x", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_column_generated.sql", + "expected_msql_file": "alter_column_generated.msql" + }, + { + "type": "delete", + "name": "Drop Column (Integer/Numeric type)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "new_col_4_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column (Numeric type with Length Precision & Variables)", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col_5_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for create", + "min_val": 0, + "max_val": 1000, + "cltype": "numeric", + "attacl": [], + "is_primary_key": false, + "attnotnull": true, + "attlen": "10", + "attprecision": "5", + "attidentity": "a", + "attoptions": [ + { + "name": "n_distinct", + "value": "1" + } + ], + "seclabels": [] + }, + "expected_sql_file": "create_column_numeric.sql", + "expected_msql_file": "create_column_numeric.msql" + }, + { + "type": "alter", + "name": "Alter Column (Numeric type with Length Precision & Variables)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "name": "new_col_5_$%{}[]()&*^!@\"'`\\/#", + "attnum": 5, + "attlen": "15", + "attprecision": "6", + "description": "Comment for alter", + "attacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [ + { + "privilege_type": "a", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "w", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "x", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_column_numeric.sql", + "expected_msql_file": "alter_column_numeric.msql" + }, + { + "type": "alter", + "name": "Alter Column (Remove Length)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 3, + "attlen": "" + }, + "expected_sql_file": "alter_column_remove_length.sql", + "expected_msql_file": "alter_column_remove_length.msql" + }, + { + "type": "delete", + "name": "Drop Column (Numeric type with Length Precision & Variables)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "new_col_5_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Dummy Column (Integer/Numeric type)", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "dummy1", + "description": "Comment for create", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": true, + "attlen": "", + "attprecision": "", + "attoptions": [], + "seclabels": [], + "defval": "1" + } + }, + { + "type": "create", + "name": "Create Dummy Column (Integer/Numeric type)", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "dummy2", + "description": "Comment for create", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": true, + "attlen": "", + "attprecision": "", + "attoptions": [], + "seclabels": [], + "defval": "1" + } + }, + { + "type": "create", + "name": "Create Column (Integer/Numeric type) with Generated feature with columns", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col_8_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for create", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": "", + "attprecision": "", + "attidentity": "a", + "colconstype": "g", + "genexpr": "dummy1 + dummy2", + "attoptions": [], + "seclabels": [] + }, + "expected_sql_file": "create_column_int_generated_with_existing_columns.sql", + "expected_msql_file": "create_column_int_generated_with_existing_columns.msql" + }, + { + "type": "alter", + "name": "Alter Column (Integer/Numeric type) with Generated feature with columns", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 8, + "name": "new_col_8_$%{}[]()&*^!@\"'`\\/#", + "genexpr": "dummy1 - dummy2", + "description": "Comment for alter", + "attacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [ + { + "privilege_type": "a", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "x", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_column_generated_with_existing_columns.sql", + "expected_msql_file": "alter_column_generated_with_existing_columns.msql" + }, + { + "type": "delete", + "name": "Drop Column (Integer/Numeric type) with Generated feature with columns", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "new_col_8_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column with identity (Generated by default)", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col_9_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for create", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": true, + "attlen": "", + "attprecision": "", + "attoptions": [], + "seclabels": [], + "attidentity": "d", + "seqincrement": "1", + "seqstart": "1", + "seqmin": "1", + "seqmax": "99999", + "seqcache": "10", + "seqcycle": true, + "colconstype": "i" + }, + "expected_sql_file": "create_column_int_identity_by_default.sql", + "expected_msql_file": "create_column_int_identity_by_default.msql" + }, + { + "type": "alter", + "name": "Alter Column with identity (Generated by default)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 9, + "name": "new_col_9_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for alter", + "seqincrement": "2", + "seqmax": "200", + "seqcache": "2", + "seqcycle": true, + "seqmin": "1" + }, + "expected_sql_file": "alter_column_identity_by_default.sql", + "expected_msql_file": "alter_column_identity_by_default.msql" + }, + { + "type": "alter", + "name": "Alter Column with drop identity (Generated by default)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 9, + "colconstype": "n" + }, + "expected_sql_file": "alter_column_drop_identity_by_default.sql", + "expected_msql_file": "alter_column_drop_identity_by_default.msql" + }, + { + "type": "delete", + "name": "Drop Column Column with identity (Generated by default)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "new_col_9_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column with identity (BY DEFAULT) for combination of identity options & initiate START", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col_6_$%{}[]()&*^!@\"'`\\/#", + "cltype": "bigint", + "attacl": [], + "description": "demo comments", + "is_primary_key": false, + "attnotnull": true, + "attlen": null, + "attprecision": null, + "attidentity": "d", + "seqincrement": "1", + "seqstart": "1", + "seqmin": "1", + "seqmax": "10", + "seqcache": "1", + "seqcycle": true, + "colconstype": "i", + "attoptions": [], + "seclabels": [] + }, + "expected_sql_file": "create_column_identity_for_restart_seq.sql", + "expected_msql_file": "create_column_identity_for_restart_seq.msql" + }, + { + "type": "alter", + "name": "Alter identity Column (BY DEFAULT) to ALWAYS & Update START", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnotnull": true, + "attidentity": "a", + "seqstart": 2, + "seqcycle": false + }, + "expected_sql_file": "alter_column_identity_for_restart_seq.sql", + "expected_msql_file": "alter_column_identity_for_restart_seq.msql" + }, + { + "type": "alter", + "name": "Alter identity Column (ALWAYS) for combination of identity options & Update START", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 9, + "attidentity": "a", + "seqincrement": "3", + "seqstart": "3", + "seqmin": "3", + "seqmax": "30", + "seqcache": "3", + "seqcycle": true + }, + "expected_sql_file": "alter_column_identity_for_comb_start_seq.sql", + "expected_msql_file": "alter_column_identity_for_comb_start_seq.msql" + }, + { + "type": "delete", + "name": "Drop Column with identity (ALWAYS)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "col_6_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column with text & default value", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col__1_$%{}[]()&*^!@\"'`\\/#", + "cltype": "text", + "attacl": [], + "description": "test comment", + "is_primary_key": false, + "attnotnull": false, + "attlen": "", + "attprecision": "", + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [], + "defval": "'xyz'" + }, + "expected_sql_file": "create_column_text_with_default_value.sql", + "expected_msql_file": "create_column_text_with_default_value.msql" + }, + { + "type": "alter", + "name": "Alter Column with text & update default value", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "name": "col__1_$%{}[]()&*^!@\"'`\\/#", + "defval": "'changed default value'", + "attacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [ + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_column_text_with_default_value.sql", + "expected_msql_file": "alter_column_text_with_default_value.msql" + }, + { + "type": "delete", + "name": "Drop Column with identity (ALWAYS)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "col__1_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column with time with time zone & default value using function", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col__2_$%{}[]()&*^!@\"'`\\/#", + "cltype": "time with time zone", + "attacl": [], + "description": "test comment", + "min_val_attlen": 0, + "max_val_attlen": 6, + "is_primary_key": false, + "attnotnull": false, + "attlen": "4", + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [], + "defval": "now()" + }, + "expected_sql_file": "create_column_timestamp_with_default_value_using_function.sql", + "expected_msql_file": "create_column_timestamp_with_default_value_using_function.msql" + }, + { + "type": "alter", + "name": "Alter Column with time with time zone & update length", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "name": "col__2_$%{}[]()&*^!@\"'`\\/#", + "attlen": "6", + "attnotnull": true, + "description": "test comment modification" + }, + "expected_sql_file": "alter_column_timestamp_with_default_value_using_function.sql", + "expected_msql_file": "alter_column_timestamp_with_default_value_using_function.msql" + }, + { + "type": "delete", + "name": "Drop Column with identity (ALWAYS)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "col__2_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column with interger_array and options", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col__3_$%{}[]()&*^!@\"'`\\/#", + "cltype": "integer[]", + "attacl": [], + "description": "comment", + "is_primary_key": false, + "attnotnull": true, + "attlen": "", + "attprecision": "", + "attidentity": "a", + "colconstype": "n", + "attoptions": [ + { + "name": "n_distinct", + "value": "1" + } + ], + "seclabels": [] + }, + "expected_sql_file": "create_column_with_interger_array_and_options.sql", + "expected_msql_file": "create_column_with_interger_array_and_options.msql" + }, + { + "type": "alter", + "name": "Alter Column with interger_array and options", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "name": "col__3_$%{}[]()&*^!@\"'`\\/#", + "attoptions": { + "changed": [ + { + "name": "n_distinct", + "value": "2" + } + ] + } + }, + "expected_sql_file": "alter_column_with_interger_array_and_options.sql", + "expected_msql_file": "alter_column_with_interger_array_and_options.msql" + }, + { + "type": "delete", + "name": "Drop Column with identity (ALWAYS)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "col__3_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column with compression", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col_comp_$%{}[]()&*^!@\"'`\\/#", + "cltype": "character varying", + "attacl": [], + "is_primary_key": false, + "attnotnull": true, + "attlen": "", + "attprecision": "", + "attcompression": "pglz", + "attoptions": [], + "seclabels": [], + "defval": "1" + }, + "expected_sql_file": "create_column_comp.sql", + "expected_msql_file": "create_column_comp.msql" + }, + { + "type": "alter", + "name": "Alter Column compression type", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "name": "col_comp_$%{}[]()&*^!@\"'`\\/#", + "attcompression": "lz4" + }, + "expected_sql_file": "alter_column_compression.sql", + "expected_msql_file": "alter_column_compression.msql" + }, + { + "type": "delete", + "name": "Drop Column with compression", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "col_comp_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column with storage", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col_1111_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for create", + "cltype": "character varying", + "collspcname": "pg_catalog.\"C\"", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": "50", + "attstorage": "m", + "attprecision": "", + "attoptions": [], + "seclabels": [] + }, + "expected_sql_file": "create_column_with_storage.sql", + "expected_msql_file": "create_column_with_storage.msql" + }, + { + "type": "alter", + "name": "Alter Column storage type", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "name": "col_1111_$%{}[]()&*^!@\"'`\\/#", + "attstorage": "p" + }, + "expected_sql_file": "alter_column_storage.sql", + "expected_msql_file": "alter_column_storage.msql" + }, + { + "type": "delete", + "name": "Drop Column with storage", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "col_1111_$%{}[]()&*^!@\"'`\\/#" + } + } + ] + } + \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/ppas/16_plus/alter_column_storage.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/ppas/16_plus/alter_column_storage.msql new file mode 100644 index 000000000..14be4f161 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/ppas/16_plus/alter_column_storage.msql @@ -0,0 +1,2 @@ +ALTER TABLE IF EXISTS testschema."table_3_$%{}[]()&*^!@""'`\/#" + ALTER COLUMN "col_1111_$%{}[]()&*^!@""'`\/#" SET STORAGE PLAIN; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/ppas/16_plus/alter_column_storage.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/ppas/16_plus/alter_column_storage.sql new file mode 100644 index 000000000..af753a1ae --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/ppas/16_plus/alter_column_storage.sql @@ -0,0 +1,12 @@ +-- Column: testschema."table_3_$%{}[]()&*^!@""'`\/#"."col_1111_$%{}[]()&*^!@""'`\/#" + +-- ALTER TABLE IF EXISTS testschema."table_3_$%{}[]()&*^!@""'`\/#" DROP COLUMN IF EXISTS "col_1111_$%{}[]()&*^!@""'`\/#"; + +ALTER TABLE IF EXISTS testschema."table_3_$%{}[]()&*^!@""'`\/#" + ADD COLUMN "col_1111_$%{}[]()&*^!@""'`\/#" character varying(50) COLLATE pg_catalog."C"; + +COMMENT ON COLUMN testschema."table_3_$%{}[]()&*^!@""'`\/#"."col_1111_$%{}[]()&*^!@""'`\/#" + IS 'Comment for create'; + +ALTER TABLE IF EXISTS testschema."table_3_$%{}[]()&*^!@""'`\/#" + ALTER COLUMN "col_1111_$%{}[]()&*^!@""'`\/#" SET STORAGE PLAIN; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/ppas/16_plus/create_column_with_storage.msql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/ppas/16_plus/create_column_with_storage.msql new file mode 100644 index 000000000..fb39bac4f --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/ppas/16_plus/create_column_with_storage.msql @@ -0,0 +1,8 @@ +ALTER TABLE IF EXISTS testschema."table_3_$%{}[]()&*^!@""'`\/#" + ADD COLUMN "col_1111_$%{}[]()&*^!@""'`\/#" character varying(50) COLLATE pg_catalog."C"; + +COMMENT ON COLUMN testschema."table_3_$%{}[]()&*^!@""'`\/#"."col_1111_$%{}[]()&*^!@""'`\/#" + IS 'Comment for create'; + +ALTER TABLE IF EXISTS testschema."table_3_$%{}[]()&*^!@""'`\/#" + ALTER COLUMN "col_1111_$%{}[]()&*^!@""'`\/#" SET STORAGE MAIN; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/ppas/16_plus/create_column_with_storage.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/ppas/16_plus/create_column_with_storage.sql new file mode 100644 index 000000000..463c0c646 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/ppas/16_plus/create_column_with_storage.sql @@ -0,0 +1,12 @@ +-- Column: testschema."table_3_$%{}[]()&*^!@""'`\/#"."col_1111_$%{}[]()&*^!@""'`\/#" + +-- ALTER TABLE IF EXISTS testschema."table_3_$%{}[]()&*^!@""'`\/#" DROP COLUMN IF EXISTS "col_1111_$%{}[]()&*^!@""'`\/#"; + +ALTER TABLE IF EXISTS testschema."table_3_$%{}[]()&*^!@""'`\/#" + ADD COLUMN "col_1111_$%{}[]()&*^!@""'`\/#" character varying(50) COLLATE pg_catalog."C"; + +COMMENT ON COLUMN testschema."table_3_$%{}[]()&*^!@""'`\/#"."col_1111_$%{}[]()&*^!@""'`\/#" + IS 'Comment for create'; + +ALTER TABLE IF EXISTS testschema."table_3_$%{}[]()&*^!@""'`\/#" + ALTER COLUMN "col_1111_$%{}[]()&*^!@""'`\/#" SET STORAGE MAIN; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/ppas/16_plus/test.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/ppas/16_plus/test.json new file mode 100644 index 000000000..8e1b40802 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/ppas/16_plus/test.json @@ -0,0 +1,972 @@ +{ + "scenarios": [ + { + "type": "create", + "name": "Create Table for testing column node (v.12+)", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "data": { + "name": "table_3_$%{}[]()&*^!@\"'`\\/#", + "is_partitioned": false, + "columns": [], + "schema": "testschema" + }, + "store_object_id": true + }, + { + "type": "create", + "name": "Create Column (Integer/Numeric type)", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col_1_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for create", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": true, + "attlen": "", + "attprecision": "", + "attoptions": [], + "seclabels": [], + "defval": "1" + }, + "expected_sql_file": "create_column_int.sql", + "expected_msql_file": "create_column_int.msql" + }, + { + "type": "alter", + "name": "Alter Column (Integer/Numeric type)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 1, + "name": "new_col_1_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for alter", + "cltype": "real", + "attacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [ + { + "privilege_type": "a", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "w", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "x", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_column_int.sql", + "expected_msql_file": "alter_column_int.msql" + }, + { + "type": "alter", + "name": "Alter Column (Privilege change)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 1, + "name": "new_col_1_$%{}[]()&*^!@\"'`\\/#", + "attacl": { + "changed": [ + { + "grantee": "enterprisedb", + "grantor": "enterprisedb", + "privileges": [ + { + "privilege_type": "a", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_column_alt_privilege.sql", + "expected_msql_file": "alter_column_alt_privilege.msql" + }, + { + "type": "delete", + "name": "Drop Column (Integer/Numeric type)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "new_col_1_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column (Character type)", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col_2_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for create", + "cltype": "character varying", + "collspcname": "pg_catalog.\"C\"", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": "50", + "attprecision": "", + "attoptions": [], + "seclabels": [] + }, + "expected_sql_file": "create_column_char.sql", + "expected_msql_file": "create_column_char.msql" + }, + { + "type": "alter", + "name": "Alter Column (Character type)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 2, + "name": "new_col_2_$%{}[]()&*^!@\"'`\\/#", + "attlen": null, + "attstattarget": "5", + "attstorage": "p", + "description": "Comment for alter", + "cltype": "character", + "attacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [ + { + "privilege_type": "a", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "x", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_column_char.sql", + "expected_msql_file": "alter_column_char.msql" + }, + { + "type": "delete", + "name": "Drop Column (Character type)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "new_col_2_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column (Integer/Numeric type) with identity", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col_3_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for create", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": true, + "attlen": "", + "attprecision": "", + "attoptions": [], + "seclabels": [], + "attidentity": "a", + "seqincrement": "1", + "seqstart": "1", + "seqmin": "1", + "seqmax": "99999", + "seqcache": "10", + "seqcycle": true, + "colconstype": "i" + }, + "expected_sql_file": "create_column_int_identity.sql", + "expected_msql_file": "create_column_int_identity.msql" + }, + { + "type": "alter", + "name": "Alter Column (Integer/Numeric type) with identity", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 3, + "name": "new_col_3_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for alter", + "attacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [ + { + "privilege_type": "a", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "x", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_column_identity.sql", + "expected_msql_file": "alter_column_identity.msql" + }, + { + "type": "alter", + "name": "Alter Column (Integer/Numeric type) drop identity", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 3, + "colconstype": "n" + }, + "expected_sql_file": "alter_column_drop_identity.sql", + "expected_msql_file": "alter_column_drop_identity.msql" + }, + { + "type": "delete", + "name": "Drop Column (Integer/Numeric type)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "new_col_3_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column (Integer/Numeric type) with Generated feature", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col_4_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for create", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": "", + "attprecision": "", + "attidentity": "a", + "colconstype": "g", + "genexpr": "1 + 2 + 3", + "attoptions": [], + "seclabels": [] + }, + "expected_sql_file": "create_column_int_generated.sql", + "expected_msql_file": "create_column_int_generated.msql" + }, + { + "type": "alter", + "name": "Alter Column (Integer/Numeric type) with Generated feature", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 4, + "name": "new_col_4_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for alter", + "attacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [ + { + "privilege_type": "a", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "x", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_column_generated.sql", + "expected_msql_file": "alter_column_generated.msql" + }, + { + "type": "delete", + "name": "Drop Column (Integer/Numeric type)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "new_col_4_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column (Numeric type with Length Precision & Variables)", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col_5_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for create", + "min_val": 0, + "max_val": 1000, + "cltype": "numeric", + "attacl": [], + "is_primary_key": false, + "attnotnull": true, + "attlen": "10", + "attprecision": "5", + "attidentity": "a", + "attoptions": [ + { + "name": "n_distinct", + "value": "1" + } + ], + "seclabels": [] + }, + "expected_sql_file": "create_column_numeric.sql", + "expected_msql_file": "create_column_numeric.msql" + }, + { + "type": "alter", + "name": "Alter Column (Numeric type with Length Precision & Variables)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "name": "new_col_5_$%{}[]()&*^!@\"'`\\/#", + "attnum": 5, + "attlen": "15", + "attprecision": "6", + "description": "Comment for alter", + "attacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [ + { + "privilege_type": "a", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "w", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "x", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_column_numeric.sql", + "expected_msql_file": "alter_column_numeric.msql" + }, + { + "type": "alter", + "name": "Alter Column (Remove Length)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 3, + "attlen": "" + }, + "expected_sql_file": "alter_column_remove_length.sql", + "expected_msql_file": "alter_column_remove_length.msql" + }, + { + "type": "delete", + "name": "Drop Column (Numeric type with Length Precision & Variables)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "new_col_5_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Dummy Column (Integer/Numeric type)", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "dummy1", + "description": "Comment for create", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": true, + "attlen": "", + "attprecision": "", + "attoptions": [], + "seclabels": [], + "defval": "1" + } + }, + { + "type": "create", + "name": "Create Dummy Column (Integer/Numeric type)", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "dummy2", + "description": "Comment for create", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": true, + "attlen": "", + "attprecision": "", + "attoptions": [], + "seclabels": [], + "defval": "1" + } + }, + { + "type": "create", + "name": "Create Column (Integer/Numeric type) with Generated feature with columns", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col_8_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for create", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": "", + "attprecision": "", + "attidentity": "a", + "colconstype": "g", + "genexpr": "dummy1 + dummy2", + "attoptions": [], + "seclabels": [] + }, + "expected_sql_file": "create_column_int_generated_with_existing_columns.sql", + "expected_msql_file": "create_column_int_generated_with_existing_columns.msql" + }, + { + "type": "alter", + "name": "Alter Column (Integer/Numeric type) with Generated feature with columns", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 8, + "name": "new_col_8_$%{}[]()&*^!@\"'`\\/#", + "genexpr": "dummy1 - dummy2", + "description": "Comment for alter", + "attacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [ + { + "privilege_type": "a", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, + { + "privilege_type": "x", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_column_generated_with_existing_columns.sql", + "expected_msql_file": "alter_column_generated_with_existing_columns.msql" + }, + { + "type": "delete", + "name": "Drop Column (Integer/Numeric type) with Generated feature with columns", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "new_col_8_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column with identity (Generated by default)", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col_9_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for create", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": true, + "attlen": "", + "attprecision": "", + "attoptions": [], + "seclabels": [], + "attidentity": "d", + "seqincrement": "1", + "seqstart": "1", + "seqmin": "1", + "seqmax": "99999", + "seqcache": "10", + "seqcycle": true, + "colconstype": "i" + }, + "expected_sql_file": "create_column_int_identity_by_default.sql", + "expected_msql_file": "create_column_int_identity_by_default.msql" + }, + { + "type": "alter", + "name": "Alter Column with identity (Generated by default)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 9, + "name": "new_col_9_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for alter", + "seqincrement": "2", + "seqmax": "200", + "seqcache": "2", + "seqcycle": true, + "seqmin": "1" + }, + "expected_sql_file": "alter_column_identity_by_default.sql", + "expected_msql_file": "alter_column_identity_by_default.msql" + }, + { + "type": "alter", + "name": "Alter Column with drop identity (Generated by default)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 9, + "colconstype": "n" + }, + "expected_sql_file": "alter_column_drop_identity_by_default.sql", + "expected_msql_file": "alter_column_drop_identity_by_default.msql" + }, + { + "type": "delete", + "name": "Drop Column Column with identity (Generated by default)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "new_col_9_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column with identity (BY DEFAULT) for combination of identity options & initiate START", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col_6_$%{}[]()&*^!@\"'`\\/#", + "cltype": "bigint", + "attacl": [], + "description": "demo comments", + "is_primary_key": false, + "attnotnull": true, + "attlen": "", + "attprecision": "", + "attidentity": "d", + "seqincrement": "1", + "seqstart": "1", + "seqmin": "1", + "seqmax": "10", + "seqcache": "1", + "seqcycle": true, + "colconstype": "i", + "attoptions": [], + "seclabels": [] + }, + "expected_sql_file": "create_column_identity_for_restart_seq.sql", + "expected_msql_file": "create_column_identity_for_restart_seq.msql" + }, + { + "type": "alter", + "name": "Alter identity Column (BY DEFAULT) to ALWAYS & Update START", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnotnull": true, + "attidentity": "a", + "seqstart": 2, + "seqcycle": false + }, + "expected_sql_file": "alter_column_identity_for_restart_seq.sql", + "expected_msql_file": "alter_column_identity_for_restart_seq.msql" + }, + { + "type": "alter", + "name": "Alter identity Column (ALWAYS) for combination of identity options & Update START", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "attnum": 9, + "attidentity": "a", + "seqincrement": "3", + "seqstart": "3", + "seqmin": "3", + "seqmax": "30", + "seqcache": "3", + "seqcycle": true + }, + "expected_sql_file": "alter_column_identity_for_comb_start_seq.sql", + "expected_msql_file": "alter_column_identity_for_comb_start_seq.msql" + }, + { + "type": "delete", + "name": "Drop Column with identity (ALWAYS)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "col_6_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column with text & default value", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col__1_$%{}[]()&*^!@\"'`\\/#", + "cltype": "text", + "attacl": [], + "description": "test comment", + "is_primary_key": false, + "attnotnull": false, + "attlen": "", + "attprecision": "", + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [], + "defval": "'xyz'" + }, + "expected_sql_file": "create_column_text_with_default_value.sql", + "expected_msql_file": "create_column_text_with_default_value.msql" + }, + { + "type": "alter", + "name": "Alter Column with text & update default value", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "name": "col__1_$%{}[]()&*^!@\"'`\\/#", + "defval": "'changed default value'", + "attacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [ + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "expected_sql_file": "alter_column_text_with_default_value.sql", + "expected_msql_file": "alter_column_text_with_default_value.msql" + }, + { + "type": "delete", + "name": "Drop Column with identity (ALWAYS)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "col__1_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column with time with time zone & default value using function", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col__2_$%{}[]()&*^!@\"'`\\/#", + "cltype": "time with time zone", + "attacl": [], + "description": "test comment", + "min_val_attlen": 0, + "max_val_attlen": 6, + "is_primary_key": false, + "attnotnull": false, + "attlen": "4", + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [], + "defval": "now()" + }, + "expected_sql_file": "create_column_timestamp_with_default_value_using_function.sql", + "expected_msql_file": "create_column_timestamp_with_default_value_using_function.msql" + }, + { + "type": "alter", + "name": "Alter Column with time with time zone & update length", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "name": "col__2_$%{}[]()&*^!@\"'`\\/#", + "attlen": "6", + "attnotnull": true, + "description": "test comment modification" + }, + "expected_sql_file": "alter_column_timestamp_with_default_value_using_function.sql", + "expected_msql_file": "alter_column_timestamp_with_default_value_using_function.msql" + }, + { + "type": "delete", + "name": "Drop Column with identity (ALWAYS)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "col__2_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column with interger_array and options", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col__3_$%{}[]()&*^!@\"'`\\/#", + "cltype": "integer[]", + "attacl": [], + "description": "comment", + "is_primary_key": false, + "attnotnull": true, + "attlen": "", + "attprecision": "", + "attidentity": "a", + "colconstype": "n", + "attoptions": [ + { + "name": "n_distinct", + "value": "1" + } + ], + "seclabels": [] + }, + "expected_sql_file": "create_column_with_interger_array_and_options.sql", + "expected_msql_file": "create_column_with_interger_array_and_options.msql" + }, + { + "type": "alter", + "name": "Alter Column with interger_array and options", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "name": "col__3_$%{}[]()&*^!@\"'`\\/#", + "attoptions": { + "changed": [ + { + "name": "n_distinct", + "value": "2" + } + ] + } + }, + "expected_sql_file": "alter_column_with_interger_array_and_options.sql", + "expected_msql_file": "alter_column_with_interger_array_and_options.msql" + }, + { + "type": "delete", + "name": "Drop Column with identity (ALWAYS)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "col__3_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column with compression", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col_comp_$%{}[]()&*^!@\"'`\\/#", + "cltype": "character varying", + "attacl": [], + "is_primary_key": false, + "attnotnull": true, + "attlen": "", + "attprecision": "", + "attcompression": "pglz", + "attoptions": [], + "seclabels": [], + "defval": "1" + }, + "expected_sql_file": "create_column_comp.sql", + "expected_msql_file": "create_column_comp.msql" + }, + { + "type": "alter", + "name": "Alter Column compression type", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "name": "col_comp_$%{}[]()&*^!@\"'`\\/#", + "attcompression": "lz4" + }, + "expected_sql_file": "alter_column_compression.sql", + "expected_msql_file": "alter_column_compression.msql" + }, + { + "type": "delete", + "name": "Drop Column with compression", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "col_comp_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Column with storage", + "endpoint": "NODE-column.obj", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql", + "data": { + "name": "col_1111_$%{}[]()&*^!@\"'`\\/#", + "description": "Comment for create", + "cltype": "character varying", + "collspcname": "pg_catalog.\"C\"", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": "50", + "attstorage": "m", + "attprecision": "", + "attoptions": [], + "seclabels": [] + }, + "expected_sql_file": "create_column_with_storage.sql", + "expected_msql_file": "create_column_with_storage.msql" + }, + { + "type": "alter", + "name": "Alter Column storage type", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "msql_endpoint": "NODE-column.msql_id", + "data": { + "name": "col_1111_$%{}[]()&*^!@\"'`\\/#", + "attstorage": "p" + }, + "expected_sql_file": "alter_column_storage.sql", + "expected_msql_file": "alter_column_storage.msql" + }, + { + "type": "delete", + "name": "Drop Column with storage", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "name": "col_1111_$%{}[]()&*^!@\"'`\\/#" + } + } + ] + } + \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/16_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/16_plus/create.sql new file mode 100644 index 000000000..89ac8fe62 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/16_plus/create.sql @@ -0,0 +1,67 @@ +{% import 'columns/macros/security.macros' as SECLABEL %} +{% import 'columns/macros/privilege.macros' as PRIVILEGE %} +{% import 'macros/variable.macros' as VARIABLE %} +{% import 'types/macros/get_full_type_sql_format.macros' as GET_TYPE %} +{### Add column ###} +{% if data.name and data.cltype %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.table)}} + ADD COLUMN {{conn|qtIdent(data.name)}} {% if is_sql %}{{data.displaytypname}}{% else %}{{ GET_TYPE.CREATE_TYPE_SQL(conn, data.cltype, data.attlen, data.attprecision, data.hasSqrBracket) }}{% endif %}{% if data.collspcname %} + COLLATE {{data.collspcname}}{% endif %}{% if data.attnotnull %} + NOT NULL{% endif %}{% if data.defval is defined and data.defval is not none and data.defval != '' and data.colconstype != 'g' %} + DEFAULT {{data.defval}}{% endif %}{% if data.colconstype == 'i' %}{% if data.attidentity and data.attidentity == 'a' %} GENERATED ALWAYS AS IDENTITY{% elif data.attidentity and data.attidentity == 'd' %} GENERATED BY DEFAULT AS IDENTITY{% endif %} +{% if data.seqincrement or data.seqcycle or data.seqincrement or data.seqstart or data.seqmin or data.seqmax or data.seqcache %} ( {% endif %} +{% if data.seqcycle is defined and data.seqcycle %} +CYCLE {% endif %}{% if data.seqincrement is defined and data.seqincrement|int(-1) > -1 %} +INCREMENT {{data.seqincrement|int}} {% endif %}{% if data.seqstart is defined and data.seqstart|int(-1) > -1%} +START {{data.seqstart|int}} {% endif %}{% if data.seqmin is defined and data.seqmin|int(-1) > -1%} +MINVALUE {{data.seqmin|int}} {% endif %}{% if data.seqmax is defined and data.seqmax|int(-1) > -1%} +MAXVALUE {{data.seqmax|int}} {% endif %}{% if data.seqcache is defined and data.seqcache|int(-1) > -1%} +CACHE {{data.seqcache|int}} {% endif %} +{% if data.seqincrement or data.seqcycle or data.seqincrement or data.seqstart or data.seqmin or data.seqmax or data.seqcache %}){% endif %} +{% endif %}{% endif %}{% if data.colconstype == 'g' and data.genexpr and data.genexpr != '' %} GENERATED ALWAYS AS ({{data.genexpr}}) STORED{% endif %}; + +{### Add comments ###} +{% if data and data.description and data.description != None %} +COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, data.name)}} + IS {{data.description|qtLiteral(conn)}}; + +{% endif %} +{### Add variables to column ###} +{% if data.attoptions %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.table)}} + {{ VARIABLE.SET(conn, 'COLUMN', data.name, data.attoptions) }} + +{% endif %} +{### Alter column statistics value ###} +{% if data.attstattarget is defined and data.attstattarget > -1 %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.table)}} + ALTER COLUMN {{conn|qtTypeIdent(data.name)}} SET STATISTICS {{data.attstattarget}}; + +{% endif %} +{### Alter column storage value ###} +{% if data.attstorage is defined and data.attstorage != data.defaultstorage %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.table)}} + ALTER COLUMN {{conn|qtTypeIdent(data.name)}} SET STORAGE {%if data.attstorage == 'p' %} +PLAIN{% elif data.attstorage == 'm'%}MAIN{% elif data.attstorage == 'e'%} +EXTERNAL{% elif data.attstorage == 'x'%}EXTENDED{% elif data.attstorage == 'd' %} +DEFAULT{% endif %}; + +{% endif %} +{### Alter column compression value ###} +{% if data.attcompression is defined and data.attcompression is not none and data.attcompression != '' %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.table)}} + ALTER COLUMN {{conn|qtTypeIdent(data.name)}} SET COMPRESSION {{data.attcompression}}; + +{% endif %} +{### ACL ###} +{% if data.attacl %} +{% for priv in data.attacl %} +{{ PRIVILEGE.APPLY(conn, data.schema, data.table, data.name, priv.grantee, priv.without_grant, priv.with_grant) }} +{% endfor %} +{% endif %} +{### Security Lables ###} +{% if data.seclabels %} +{% for r in data.seclabels %} +{{ SECLABEL.APPLY(conn, 'COLUMN',data.schema, data.table, data.name, r.provider, r.label) }} +{% endfor %} +{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/16_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/16_plus/update.sql new file mode 100644 index 000000000..df61aed45 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/16_plus/update.sql @@ -0,0 +1,216 @@ +{% import 'columns/macros/security.macros' as SECLABEL %} +{% import 'columns/macros/privilege.macros' as PRIVILEGE %} +{% import 'macros/variable.macros' as VARIABLE %} +{% import 'types/macros/get_full_type_sql_format.macros' as GET_TYPE %} +{### Rename column name ###} +{% if data.name and data.name != o_data.name %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.table)}} + RENAME {{conn|qtIdent(o_data.name)}} TO {{conn|qtIdent(data.name)}}; + +{% endif %} +{### Alter column type and collation ###} +{% if (data.cltype and data.cltype != o_data.cltype) or (data.attlen is defined and data.attlen != o_data.attlen) or (data.attprecision is defined and data.attprecision != o_data.attprecision) or (data.collspcname and data.collspcname != o_data.collspcname) or data.col_type_conversion is defined %} +{% if data.col_type_conversion is defined and data.col_type_conversion == False %} +-- WARNING: +-- The SQL statement below would normally be used to alter the datatype for the {{o_data.name}} column, however, +-- the current datatype cannot be cast to the target datatype so this conversion cannot be made automatically. + +{% endif %} +{% if data.col_type_conversion is defined and data.col_type_conversion == False %} -- {% endif %}ALTER TABLE {{conn|qtIdent(data.schema, data.table)}} +{% if data.col_type_conversion is defined and data.col_type_conversion == False %} -- {% endif %} ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} TYPE {{ GET_TYPE.UPDATE_TYPE_SQL(conn, data, o_data) }}{% if data.collspcname and data.collspcname != o_data.collspcname %} + COLLATE {{data.collspcname}}{% elif o_data.collspcname %} COLLATE {{o_data.collspcname}}{% endif %}; +{% endif %} +{### Alter column default value ###} +{% if is_view_only and data.defval is defined and data.defval is not none and data.defval != '' and data.defval != o_data.defval %} +ALTER VIEW {{conn|qtIdent(data.schema, data.table)}} + ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} SET DEFAULT {{data.defval}}; + +{% elif data.defval is defined and data.defval is not none and data.defval != '' and data.defval != o_data.defval %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.table)}} + ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} SET DEFAULT {{data.defval}}; + +{% endif %} +{### Drop column default value ###} +{% if data.defval is defined and (data.defval == '' or data.defval is none) and data.defval != o_data.defval %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.table)}} + ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} DROP DEFAULT; + +{% endif %} +{### Alter column not null value ###} +{% if 'attnotnull' in data and data.attnotnull != o_data.attnotnull %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.table)}} + ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} {% if data.attnotnull %}SET{% else %}DROP{% endif %} NOT NULL; + +{% endif %} +{% if data.seqincrement or (data.seqcycle or (data.seqcycle == False and data.seqcycle != o_data.seqcycle)) or data.seqincrement or data.seqstart or data.seqmin or data.seqmax or data.seqcache %} +{% set attidentity_params = true %}{% else %} +{% set attidentity_params = false %}{% endif %} +{### Alter column - add identity ###} +{% if data.colconstype == 'i' and 'attidentity' in data and o_data.attidentity == '' and data.attidentity != o_data.attidentity %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.table)}} + ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} {% if data.attidentity == 'a' %}ADD GENERATED ALWAYS AS IDENTITY{% else%}ADD GENERATED BY DEFAULT AS IDENTITY{% endif %} +{% if data.seqincrement or data.seqcycle or data.seqincrement or data.seqstart or data.seqmin or data.seqmax or data.seqcache %} ( {% endif %} +{% if data.seqcycle is defined and data.seqcycle %} +CYCLE {% endif %}{% if data.seqincrement is defined and data.seqincrement|int(-1) > -1 %} +INCREMENT {{data.seqincrement|int}} {% endif %}{% if data.seqstart is defined and data.seqstart|int(-1) > -1%} +START {{data.seqstart|int}} {% endif %}{% if data.seqmin is defined and data.seqmin|int(-1) > -1%} +MINVALUE {{data.seqmin|int}} {% endif %}{% if data.seqmax is defined and data.seqmax|int(-1) > -1%} +MAXVALUE {{data.seqmax|int}} {% endif %}{% if data.seqcache is defined and data.seqcache|int(-1) > -1%} +CACHE {{data.seqcache|int}} {% endif %} +{% if data.seqincrement or data.seqcycle or data.seqincrement or data.seqstart or data.seqmin or data.seqmax or data.seqcache %}){% endif %}; + +{### Alter column - change identity - sequence options ###} +{% elif 'attidentity' in data or attidentity_params %} +{% if 'attidentity' in data and data.attidentity != '' and o_data.attidentity != '' and data.attidentity != o_data.attidentity %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.table)}} + ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} SET GENERATED {% if data.attidentity == 'a' %}ALWAYS{% else%}BY DEFAULT{% endif %}{% if attidentity_params == false %};{% endif %} +{% elif attidentity_params %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.table)}} + ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %}{% endif %} +{% if data.seqcycle %} SET CYCLE{% elif (data.seqcycle == False and o_data.seqcycle and data.seqcycle != o_data.seqcycle) %} SET NO CYCLE{% endif %} +{% if data.seqincrement is defined and data.seqincrement|int(-1) > -1 %} SET INCREMENT {{data.seqincrement|int}}{% endif %} +{% if data.seqstart is defined and data.seqstart|int(-1) > -1%} RESTART SET START {{data.seqstart|int}}{% endif %} +{% if data.seqmin is defined and data.seqmin|int(-1) > -1%} SET MINVALUE {{data.seqmin|int}}{% endif %} +{% if data.seqmax is defined and data.seqmax|int(-1) > -1%} SET MAXVALUE {{data.seqmax|int}}{% endif %} +{% if data.seqcache is defined and data.seqcache|int(-1) > -1%} SET CACHE {{data.seqcache|int}}{% endif %}{% if attidentity_params == true %};{% endif %} + + +{% endif %} +{### Alter column - drop identity when column constraint is changed###} +{% if 'colconstype' in data and data.colconstype == 'n' and 'colconstype' in o_data and o_data.colconstype == 'i' %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.table)}} + ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} DROP IDENTITY; + +{% endif %} +{### Alter column statistics value ###} +{% if data.attstattarget is defined and data.attstattarget != o_data.attstattarget %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.table)}} + ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} SET STATISTICS {{data.attstattarget}}; + +{% endif %} +{### Alter column storage value ###} +{% if data.attstorage is defined and data.attstorage != o_data.attstorage %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.table)}} + ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} SET STORAGE {%if data.attstorage == 'p' %} +PLAIN{% elif data.attstorage == 'm'%}MAIN{% elif data.attstorage == 'e'%} +EXTERNAL{% elif data.attstorage == 'x'%}EXTENDED{% elif data.attstorage == 'd'%} +DEFAULT{% endif %}; + +{% endif %} +{### Alter column compression value ###} +{% if data.attcompression is defined and data.attcompression is not none and data.attcompression != '' %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.table)}} + ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} SET COMPRESSION {{data.attcompression}}; + +{% endif %} +{% if data.description is defined and data.description != None %} +{% if data.name %} +COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, data.name)}} +{% else %} +COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, o_data.name)}} +{% endif %} + IS {{data.description|qtLiteral(conn)}}; + +{% endif %} +{### Update column variables ###} +{% if 'attoptions' in data and data.attoptions != None and data.attoptions|length > 0 %} +{% set variables = data.attoptions %} +{% if 'deleted' in variables and variables.deleted|length > 0 %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.table)}} +{% if data.name %} + {{ VARIABLE.UNSET(conn, 'COLUMN', data.name, variables.deleted) }} +{% else %} + {{ VARIABLE.UNSET(conn, 'COLUMN', o_data.name, variables.deleted) }} +{% endif %} +{% endif %} +{% if 'added' in variables and variables.added|length > 0 %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.table)}} +{% if data.name %} + {{ VARIABLE.SET(conn, 'COLUMN', data.name, variables.added) }} +{% else %} + {{ VARIABLE.SET(conn, 'COLUMN', o_data.name, variables.added) }} +{% endif %} +{% endif %} +{% if 'changed' in variables and variables.changed|length > 0 %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.table)}} +{% if data.name %} + {{ VARIABLE.SET(conn, 'COLUMN', data.name, variables.changed) }} +{% else %} + {{ VARIABLE.SET(conn, 'COLUMN', o_data.name, variables.changed) }} +{% endif %} +{% endif %} +{% endif %} +{### Update column privileges ###} +{# Change the privileges #} +{% if data.attacl %} +{% if 'deleted' in data.attacl %} +{% for priv in data.attacl.deleted %} +{% if data.name %} +{{ PRIVILEGE.RESETALL(conn, data.schema, data.table, data.name, priv.grantee) }} +{% else %} +{{ PRIVILEGE.RESETALL(conn, data.schema, data.table, o_data.name, priv.grantee) }} +{% endif %} +{% endfor %} +{% endif %} +{% if 'changed' in data.attacl %} +{% for priv in data.attacl.changed %} +{% set is_grantee_changed = (priv.grantee != priv.old_grantee) %} +{% if data.name %} +{% if is_grantee_changed %} +{{ PRIVILEGE.RESETALL(conn, data.schema, data.table, data.name, priv.old_grantee) }} +{% else %} +{{ PRIVILEGE.RESETALL(conn, data.schema, data.table, data.name, priv.grantee) }} +{% endif %} +{{ PRIVILEGE.APPLY(conn, data.schema, data.table, data.name, priv.grantee, priv.without_grant, priv.with_grant) }} +{% else %} +{% if is_grantee_changed %} +{{ PRIVILEGE.RESETALL(conn, data.schema, data.table, o_data.name, priv.old_grantee) }} +{% else %} +{{ PRIVILEGE.RESETALL(conn, data.schema, data.table, o_data.name, priv.grantee) }} +{% endif %} +{{ PRIVILEGE.APPLY(conn, data.schema, data.table, o_data.name, priv.grantee, priv.without_grant, priv.with_grant) }} +{% endif %} +{% endfor %} +{% endif %} +{% if 'added' in data.attacl %} +{% for priv in data.attacl.added %} +{% if data.name %} +{{ PRIVILEGE.APPLY(conn, data.schema, data.table, data.name, priv.grantee, priv.without_grant, priv.with_grant) }} +{% else %} +{{ PRIVILEGE.APPLY(conn, data.schema, data.table, o_data.name, priv.grantee, priv.without_grant, priv.with_grant) }} +{% endif %} +{% endfor %} +{% endif %} +{% endif %} +{### Uppdate tablespace securitylabel ###} +{# The SQL generated below will change Security Label #} +{% if data.seclabels and data.seclabels|length > 0 %} +{% set seclabels = data.seclabels %} +{% if 'deleted' in seclabels and seclabels.deleted|length > 0 %} +{% for r in seclabels.deleted %} +{% if data.name %} +{{ SECLABEL.DROP(conn, 'COLUMN', data.schema, data.table, data.name, r.provider) }} +{% else %} +{{ SECLABEL.DROP(conn, 'COLUMN', data.schema, data.table, o_data.name, r.provider) }} +{% endif %} +{% endfor %} +{% endif %} +{% if 'added' in seclabels and seclabels.added|length > 0 %} +{% for r in seclabels.added %} +{% if data.name %} +{{ SECLABEL.APPLY(conn, 'COLUMN',data.schema, data.table, data.name, r.provider, r.label) }} +{% else %} +{{ SECLABEL.APPLY(conn, 'COLUMN',data.schema, data.table, o_data.name, r.provider, r.label) }} +{% endif %} +{% endfor %} +{% endif %} +{% if 'changed' in seclabels and seclabels.changed|length > 0 %} +{% for r in seclabels.changed %} +{% if data.name %} +{{ SECLABEL.APPLY(conn, 'COLUMN',data.schema, data.table, data.name, r.provider, r.label) }} +{% else %} +{{ SECLABEL.APPLY(conn, 'COLUMN',data.schema, data.table, o_data.name, r.provider, r.label) }} +{% endif %} +{% endfor %} +{% endif %} +{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/16_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/16_plus/create.sql new file mode 100644 index 000000000..93ea6ecee --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/16_plus/create.sql @@ -0,0 +1,233 @@ +{% import 'macros/schemas/security.macros' as SECLABEL %} +{% import 'macros/schemas/privilege.macros' as PRIVILEGE %} +{% import 'macros/variable.macros' as VARIABLE %} +{% import 'columns/macros/security.macros' as COLUMN_SECLABEL %} +{% import 'columns/macros/privilege.macros' as COLUMN_PRIVILEGE %} +{% import 'tables/sql/macros/constraints.macro' as CONSTRAINTS %} +{% import 'types/macros/get_full_type_sql_format.macros' as GET_TYPE %} +{#===========================================#} +{#====== MAIN TABLE TEMPLATE STARTS HERE ======#} +{#===========================================#} +{# + If user has not provided any details but only name then + add empty bracket with table name +#} +{% set empty_bracket = ""%} +{% if data.coll_inherits|length == 0 and data.columns|length == 0 and not data.typname and not data.like_relation and data.primary_key|length == 0 and data.unique_constraint|length == 0 and data.foreign_key|length == 0 and data.check_constraint|length == 0 and data.exclude_constraint|length == 0 %} +{% set empty_bracket = "\n(\n)"%} +{% endif %} +{% set with_clause = false%} +{% if data.fillfactor or data.parallel_workers or data.toast_tuple_target or (data.autovacuum_custom and data.add_vacuum_settings_in_sql) or data.autovacuum_enabled in ('t', 'f') or (data.toast_autovacuum and data.add_vacuum_settings_in_sql) or data.toast_autovacuum_enabled in ('t', 'f') %} +{% set with_clause = true%} +{% endif %} +CREATE {% if data.relpersistence %}UNLOGGED {% endif %}TABLE{% if add_not_exists_clause %} IF NOT EXISTS{% endif %} {{conn|qtIdent(data.schema, data.name)}}{{empty_bracket}} +{% if data.typname %} + OF {{ data.typname }} +{% endif %} +{% if data.like_relation or data.coll_inherits or data.columns|length > 0 or data.primary_key|length > 0 or data.unique_constraint|length > 0 or data.foreign_key|length > 0 or data.check_constraint|length > 0 or data.exclude_constraint|length > 0 %} +( +{% endif %} +{% if data.like_relation %} + LIKE {{ data.like_relation }}{% if data.like_default_value %} + + INCLUDING DEFAULTS{% endif %}{% if data.like_constraints %} + + INCLUDING CONSTRAINTS{% endif %}{% if data.like_indexes %} + + INCLUDING INDEXES{% endif %}{% if data.like_storage %} + + INCLUDING STORAGE{% endif %}{% if data.like_comments %} + + INCLUDING COMMENTS{% endif %}{% if data.like_compression %} + + INCLUDING COMPRESSION{% endif %}{% if data.like_generated %} + + INCLUDING GENERATED{% endif %}{% if data.like_identity %} + + INCLUDING IDENTITY{% endif %}{% if data.like_statistics %} + + INCLUDING STATISTICS{% endif %}{% if data.columns|length > 0 %}, +{% endif %} + +{% endif %} +{### Add columns ###} +{% if data.columns and data.columns|length > 0 %} +{% for c in data.columns %} +{% if c.name and c.cltype %} + {% if c.inheritedfromtable %}-- Inherited from table {{c.inheritedfromtable}}: {% elif c.inheritedfromtype %}-- Inherited from type {{c.inheritedfromtype}}: {% endif %}{{conn|qtIdent(c.name)}} {% if is_sql %}{{c.displaytypname}}{% else %}{{ GET_TYPE.CREATE_TYPE_SQL(conn, c.cltype, c.attlen, c.attprecision, c.hasSqrBracket) }}{% endif %}{%if c.attstorage is defined and c.attstorage != c.defaultstorage%} STORAGE {%if c.attstorage == 'p' %}PLAIN{% elif c.attstorage == 'm'%}MAIN{% elif c.attstorage == 'e'%}EXTERNAL{% elif c.attstorage == 'x'%}EXTENDED{% elif c.attstorage == 'd'%}DEFAULT{% endif %}{% endif %}{% if c.attcompression is defined and c.attcompression is not none and c.attcompression != '' %} COMPRESSION {{c.attcompression}}{% endif %}{% if c.collspcname %} COLLATE {{c.collspcname}}{% endif %}{% if c.attnotnull %} NOT NULL{% endif %}{% if c.defval is defined and c.defval is not none and c.defval != '' and c.colconstype != 'g' %} DEFAULT {{c.defval}}{% endif %} +{% if c.colconstype == 'i' and c.attidentity and c.attidentity != '' %} +{% if c.attidentity == 'a' %} GENERATED ALWAYS AS IDENTITY{% elif c.attidentity == 'd' %} GENERATED BY DEFAULT AS IDENTITY{% endif %} +{% if c.seqincrement or c.seqcycle or c.seqincrement or c.seqstart or c.seqmin or c.seqmax or c.seqcache %} ( {% endif %} +{% if c.seqcycle is defined and c.seqcycle %} +CYCLE {% endif %}{% if c.seqincrement is defined and c.seqincrement|int(-1) > -1 %} +INCREMENT {{c.seqincrement|int}} {% endif %}{% if c.seqstart is defined and c.seqstart|int(-1) > -1%} +START {{c.seqstart|int}} {% endif %}{% if c.seqmin is defined and c.seqmin|int(-1) > -1%} +MINVALUE {{c.seqmin|int}} {% endif %}{% if c.seqmax is defined and c.seqmax|int(-1) > -1%} +MAXVALUE {{c.seqmax|int}} {% endif %}{% if c.seqcache is defined and c.seqcache|int(-1) > -1%} +CACHE {{c.seqcache|int}} {% endif %} +{% if c.seqincrement or c.seqcycle or c.seqincrement or c.seqstart or c.seqmin or c.seqmax or c.seqcache %}){% endif %} +{% endif %} +{% if c.colconstype == 'g' and c.genexpr and c.genexpr != '' %} GENERATED ALWAYS AS ({{c.genexpr}}) STORED{% endif %} +{% if not loop.last %}, +{% endif %} +{% endif %} +{% endfor %} +{% endif %} +{# Macro to render for constraints #} +{% if data.primary_key|length > 0 %}{% if data.columns|length > 0 %},{% endif %} +{{CONSTRAINTS.PRIMARY_KEY(conn, data.primary_key[0])}}{% endif %}{% if data.unique_constraint|length > 0 %}{% if data.columns|length > 0 or data.primary_key|length > 0 %},{% endif %} +{{CONSTRAINTS.UNIQUE(conn, data.unique_constraint)}}{% endif %}{% if data.foreign_key|length > 0 %}{% if data.columns|length > 0 or data.primary_key|length > 0 or data.unique_constraint|length > 0 %},{% endif %} +{{CONSTRAINTS.FOREIGN_KEY(conn, data.foreign_key)}}{% endif %}{% if data.check_constraint|length > 0 %}{% if data.columns|length > 0 or data.primary_key|length > 0 or data.unique_constraint|length > 0 or data.foreign_key|length > 0 %},{% endif %} +{{CONSTRAINTS.CHECK(conn, data.check_constraint)}}{% endif %}{% if data.exclude_constraint|length > 0 %}{% if data.columns|length > 0 or data.primary_key|length > 0 or data.unique_constraint|length > 0 or data.foreign_key|length > 0 or data.check_constraint|length > 0 %},{% endif %} +{{CONSTRAINTS.EXCLUDE(conn, data.exclude_constraint)}}{% endif %} +{% if data.like_relation or data.coll_inherits or data.columns|length > 0 or data.primary_key|length > 0 or data.unique_constraint|length > 0 or data.foreign_key|length > 0 or data.check_constraint|length > 0 or data.exclude_constraint|length > 0 %} + +){% endif %}{% if data.relkind is defined and data.relkind == 'p' %} PARTITION BY {{ data.partition_scheme }}{% endif %} +{% if not data.coll_inherits and not data.spcname and not with_clause and not data.amname %};{% endif %} + +{### If we are inheriting it from another table(s) ###} +{% if data.coll_inherits %} + INHERITS ({% for val in data.coll_inherits %}{% if loop.index != 1 %}, {% endif %}{{val}}{% endfor %}){% if not data.spcname and not with_clause and not data.amname %};{% endif %} +{% endif %} + +{% if data.default_amname and data.default_amname != data.amname and data.amname is not none %} +USING {{data.amname}} +{% elif data.amname and not data.default_amname %} +USING {{data.amname}}{% if not data.spcname and not with_clause %};{% endif %} +{% endif %} + +{% if with_clause %} +{% set ns = namespace(add_comma=false) %} +WITH ( +{% if data.fillfactor %}{% set ns.add_comma = true%} + FILLFACTOR = {{ data.fillfactor }}{% endif %}{% if data.parallel_workers %} +{% if ns.add_comma %}, +{% endif %} + parallel_workers = {{ data.parallel_workers }}{% set ns.add_comma = true%}{% endif %}{% if data.toast_tuple_target %} +{% if ns.add_comma %}, +{% endif %} + toast_tuple_target = {{ data.toast_tuple_target }}{% set ns.add_comma = true%}{% endif %}{% if data.autovacuum_enabled in ('t', 'f') %} +{% if ns.add_comma %}, +{% endif %} + autovacuum_enabled = {% if data.autovacuum_enabled == 't' %}TRUE{% else %}FALSE{% endif %}{% set ns.add_comma = true%}{% endif %}{% if data.toast_autovacuum_enabled in ('t', 'f') %} +{% if ns.add_comma %}, +{% endif %} + toast.autovacuum_enabled = {% if data.toast_autovacuum_enabled == 't' %}TRUE{% else %}FALSE{% endif %}{% set ns.add_comma = true%}{% endif %}{% if data.autovacuum_custom %} +{% for opt in data.vacuum_table %}{% if opt.name and opt.value is defined %} +{% if ns.add_comma %}, +{% endif %} + {{opt.name}} = {{opt.value}}{% set ns.add_comma = true%}{% endif %} +{% endfor %}{% endif %}{% if data.toast_autovacuum %} +{% for opt in data.vacuum_toast %}{% if opt.name and opt.value is defined %} +{% if ns.add_comma %}, +{% endif %} + toast.{{opt.name}} = {{opt.value}}{% set ns.add_comma = true%}{% endif %} +{% endfor %}{% endif %} + +{% if data.spcname %}){% else %});{% endif %} + +{% endif %} +{### SQL for Tablespace ###} +{% if data.spcname %} +TABLESPACE {{ conn|qtIdent(data.spcname) }}; +{% endif %} +{### Alter SQL for Owner ###} +{% if data.relowner %} + +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.name)}} + OWNER to {{conn|qtIdent(data.relowner)}}; +{% endif %} + +{#####################################################} +{## Enable Row Level Security Policy on table ##} +{#####################################################} +{% if data.rlspolicy %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.name)}} + ENABLE ROW LEVEL SECURITY; +{% endif %} + +{#####################################################} +{## Force Enable Row Level Security Policy on table ##} +{#####################################################} +{% if data.forcerlspolicy %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.name)}} + FORCE ROW LEVEL SECURITY; +{% endif %} + +{### Security Labels on Table ###} +{% if data.seclabels and data.seclabels|length > 0 %} + +{% for r in data.seclabels %} +{{ SECLABEL.SET(conn, 'TABLE', data.name, r.provider, r.label, data.schema) }} +{% endfor %} +{% endif %} +{### ACL on Table ###} +{% if data.revoke_all %} +{% for priv in data.revoke_all %} +{{ PRIVILEGE.UNSETALL(conn, "TABLE", priv, data.name, data.schema)}} +{% endfor %} +{% endif %} +{% if data.relacl %} + +{% for priv in data.relacl %} +{{ PRIVILEGE.SET(conn, 'TABLE', priv.grantee, data.name, priv.without_grant, priv.with_grant, data.schema) }} +{% endfor %} +{% endif %} +{### SQL for COMMENT ###} +{% if data.description %} +COMMENT ON TABLE {{conn|qtIdent(data.schema, data.name)}} + IS {{data.description|qtLiteral(conn)}}; +{% endif %} +{#===========================================#} +{#====== MAIN TABLE TEMPLATE ENDS HERE ======#} +{#===========================================#} +{#===========================================#} +{# COLUMN SPECIFIC TEMPLATES STARTS HERE #} +{#===========================================#} +{% if data.columns and data.columns|length > 0 %} +{% for c in data.columns %} +{% if c.description %} + +COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.name, c.name)}} + IS {{c.description|qtLiteral(conn)}}; +{% endif %} +{### Add variables to column ###} +{% if c.attoptions and c.attoptions|length > 0 %} + +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.name)}} + {{ VARIABLE.SET(conn, 'COLUMN', c.name, c.attoptions) }} + +{% endif %} +{### Alter column statistics value ###} +{% if c.attstattarget is defined and c.attstattarget > -1 %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.name)}} + ALTER COLUMN {{conn|qtTypeIdent(c.name)}} SET STATISTICS {{c.attstattarget}}; + +{% endif %} +{### ACL ###} +{% if c.attacl and c.attacl|length > 0 %} + +{% for priv in c.attacl %} +{{ COLUMN_PRIVILEGE.APPLY(conn, data.schema, data.name, c.name, priv.grantee, priv.without_grant, priv.with_grant) }} +{% endfor %} +{% endif %} +{### Security Lables ###} +{% if c.seclabels and c.seclabels|length > 0 %} + +{% for r in c.seclabels %} +{{ COLUMN_SECLABEL.APPLY(conn, 'COLUMN',data.schema, data.name, c.name, r.provider, r.label) }} +{% endfor %} +{% endif %} +{% endfor %} +{% endif %} +{#===========================================#} +{# COLUMN SPECIFIC TEMPLATES ENDS HERE #} +{#===========================================#} +{#======================================#} +{# CONSTRAINTS SPECIFIC TEMPLATES #} +{#======================================#} +{{CONSTRAINTS.CONSTRAINT_COMMENTS(conn, data.schema, data.name, data.primary_key)}} +{{CONSTRAINTS.CONSTRAINT_COMMENTS(conn, data.schema, data.name, data.unique_constraint)}} +{{CONSTRAINTS.CONSTRAINT_COMMENTS(conn, data.schema, data.name, data.foreign_key)}} +{{CONSTRAINTS.CONSTRAINT_COMMENTS(conn, data.schema, data.name, data.check_constraint)}} +{{CONSTRAINTS.CONSTRAINT_COMMENTS(conn, data.schema, data.name, data.exclude_constraint)}} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/16_plus/create_table_with_column_storage.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/16_plus/create_table_with_column_storage.sql new file mode 100644 index 000000000..06d16132a --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/16_plus/create_table_with_column_storage.sql @@ -0,0 +1,16 @@ +-- Table: public.simple_table_storage_$%{}[]()&*^!@"'`\/# + +-- DROP TABLE IF EXISTS public."simple_table_storage_$%{}[]()&*^!@""'`\/#"; + +CREATE TABLE IF NOT EXISTS public."simple_table_storage_$%{}[]()&*^!@""'`\/#" +( + col4 character varying(30) STORAGE EXTERNAL COLLATE pg_catalog."default" +) + +TABLESPACE pg_default; + +ALTER TABLE IF EXISTS public."simple_table_storage_$%{}[]()&*^!@""'`\/#" + OWNER to postgres; + +COMMENT ON TABLE public."simple_table_storage_$%{}[]()&*^!@""'`\/#" + IS 'test comment'; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/16_plus/create_table_with_column_storage_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/16_plus/create_table_with_column_storage_msql.sql new file mode 100644 index 000000000..d386e8c16 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/16_plus/create_table_with_column_storage_msql.sql @@ -0,0 +1,10 @@ +CREATE TABLE public."simple_table_storage_$%{}[]()&*^!@""'`\/#" +( + col4 character varying(30) STORAGE EXTERNAL +); + +ALTER TABLE IF EXISTS public."simple_table_storage_$%{}[]()&*^!@""'`\/#" + OWNER to postgres; + +COMMENT ON TABLE public."simple_table_storage_$%{}[]()&*^!@""'`\/#" + IS 'test comment'; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/16_plus/test.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/16_plus/test.json new file mode 100644 index 000000000..e60271b4a --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/16_plus/test.json @@ -0,0 +1,2339 @@ +{ + "scenarios": [ + { + "type": "create", + "name": "Create Table without primary key", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col3", + "cltype": "boolean", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col4", + "cltype": "character varying", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 30, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col5", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": 20, + "attprecision": 10, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col6", + "cltype": "timestamp with time zone", + "attacl": [], + "min_val_attlen": 0, + "max_val_attlen": 6, + "is_primary_key": false, + "attnotnull": false, + "attlen": 5, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_without_primary_key.sql", + "expected_msql_file": "create_table_without_primary_key_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table to change column data types", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#", + "columns": { + "changed": [ + { + "attnum": 1, + "cltype": "bigint" + }, + { + "attnum": 2, + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "cltype": "character varying" + }, + { + "attnum": 6, + "attlen": null, + "cltype": "time without time zone" + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_change_col_data_type.sql", + "expected_msql_file": "alter_table_change_col_data_type_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add pk", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#", + "columns": { + "changed": [ + { + "attnum": 1, + "attnotnull": true, + "is_primary_key": true + } + ] + }, + "primary_key": { + "added": [ + { + "columns": [ + { + "column": "col1" + } + ], + "include": [] + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_add_pk_not_null_constraint.sql", + "expected_msql_file": "alter_table_add_pk_not_null_constraint_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add null constraint, rename column", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#", + "columns": { + "changed": [ + { + "attnum": 1, + "name": "col1_rename", + "is_primary_key": false + }, + { + "attnum": 4, + "attnotnull": true + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_add_null_constraint_rename_col.sql", + "expected_msql_file": "alter_table_add_null_constraint_rename_col_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table add pk", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with primary key", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [ + { + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"'`\\\\/#" + } + ], + "include": [] + } + ], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "integer", + "attacl": [], + "is_primary_key": true, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "json", + "attacl": [], + "is_primary_key": false, + "attnotnull": true, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_pk.sql", + "expected_msql_file": "create_table_with_pk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add columns", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#", + "columns": { + "added": [ + { + "name": "col3_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": 10, + "attprecision": 5, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col4_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_add_cols.sql", + "expected_msql_file": "alter_table_add_cols_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table delete columns", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#", + "columns": { + "deleted": [ + { + "attoptions": [], + "attacl": [], + "seclabels": [], + "name": "col2_$%{}[]()&*^!@\\\"'`\\\\/#", + "atttypid": 114, + "attnum": 2, + "cltype": "json", + "collspcname": "", + "description": null, + "edit_types": [ + "json", + "jsonb" + ], + "is_primary_key": false, + "attstattarget": -1, + "attnotnull": true, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attndims": 0, + "atttypmod": -1, + "attstorage": "x", + "defval": null, + "typname": "json", + "displaytypname": "json", + "elemoid": 114, + "typnspname": "pg_catalog", + "defaultstorage": "x", + "indkey": "1", + "isdup": false, + "is_fk": false, + "is_sys_column": false, + "relname": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#", + "is_view_only": false, + "is_pk": false, + "old_attidentity": "a" + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_delete_cols.sql", + "expected_msql_file": "alter_table_delete_cols_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table delete columns", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with pk & check constraint", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "create table comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [ + { + "name": "custom_pk", + "comment": "custom pk created", + "fillfactor": "11", + "condeferrable": true, + "condeferred": true, + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"'`\\\\/#" + } + ], + "include": [] + } + ], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "time with time zone", + "attacl": [], + "min_val_attlen": 0, + "max_val_attlen": 6, + "is_primary_key": false, + "attnotnull": false, + "attlen": 5, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "character", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 12, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [ + { + "name": "chk_const", + "consrc": "col2 != null", + "convalidated": false, + "comment": "chk const comment" + } + ], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_pk_chk.sql", + "expected_msql_file": "create_table_with_pk_chk_msql.sql" + }, { + "type": "alter", + "name": "Alter Table add unique constraint", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "unique_constraint": { + "added": [ + { + "name": "unique", + "fillfactor": "13", + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"'`\\\\/#" + } + ], + "include": [] + } + ] + } + }, + "expected_sql_file": "alter_table_add_unique_const.sql", + "expected_msql_file": "alter_table_add_unique_const_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table delete constraints", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "check_constraint": { + "deleted": [ + { + "name": "chk_const", + "consrc": "col2 <> NULL::bpchar", + "connoinherit": false, + "convalidated": false, + "relname": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "nspname": "public", + "comment": "chk const comment", + "conislocal": true + } + ] + }, + "unique_constraint": { + "deleted": [ + { + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"\"'`\\\\/#" + } + ], + "name": "unique", + "comment": null, + "spcname": "pg_default", + "fillfactor": "13", + "condeferrable": false, + "condeferred": false, + "include": [], + "col_count": 1, + "conislocal": true + } + ] + } + }, + "expected_sql_file": "alter_table_delete_constraints.sql", + "expected_msql_file": "alter_table_delete_constraints_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with pk & chk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table for FK reference", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "data": { + "name": "fk_reference_tbl", + "columns": [ + { + "name": "id", + "cltype": "integer", + "is_primary_key": true + }, + { + "name": "name", + "cltype": "bigint" + } + ], + "primary_key": [ + { + "columns": [ + { + "column": "id" + } + ], + "include": [] + } + ], + "unique_constraint": [ + { + "name": "", + "columns": [ + { + "column": "name" + } + ], + "include": [] + } + ], + "is_partitioned": false, + "schema": "public", + "spcname": "pg_default" + }, + "store_object_id": true + }, + { + "type": "create", + "name": "Create Table with fk constraint", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col3", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [ + { + "name": "fk_test", + "comment": "fk comment", + "condeferrable": true, + "confmatchtype": true, + "columns": [ + { + "local_column": "col1", + "references": "", + "referenced": "id" + } + ], + "confupdtype": "a", + "confdeltype": "a", + "autoindex": false, + "coveringindex": null + } + ], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "create_table_with_fk.sql", + "expected_msql_file": "create_table_with_fk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add one more fk", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "foreign_key": { + "added": [ + { + "name": "fk2", + "columns": [ + { + "local_column": "col2", + "references": "", + "referenced": "name" + } + ], + "confupdtype": "a", + "confdeltype": "a", + "autoindex": false, + "coveringindex": null + } + ] + } + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "alter_table_add_another_fk.sql", + "expected_msql_file": "alter_table_add_another_fk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add exclude constraint", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "exclude_constraint": { + "added": [ + { + "name": "ex_constr", + "amname": "btree", + "columns": [ + { + "column": "col1", + "is_exp": false, + "order": false, + "nulls_order": false, + "operator": "=", + "is_sort_nulls_applicable": false + } + ], + "include": [] + } + ] + } + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "alter_table_add_exclude_constraint.sql", + "expected_msql_file": "alter_table_add_exclude_constraint_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with fk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with custom auto-vacuum", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "custom auto vacuum", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "t", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "character varying[]", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 10, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "date", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor", + "value": 0.2 + }, + { + "name": "autovacuum_analyze_threshold", + "value": 55 + }, + { + "name": "autovacuum_freeze_max_age", + "value": 20000000 + }, + { + "name": "autovacuum_vacuum_cost_delay", + "value": 25 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 10 + }, + { + "name": "autovacuum_vacuum_scale_factor", + "value": 0.3 + }, + { + "name": "autovacuum_vacuum_threshold", + "value": 60 + }, + { + "name": "autovacuum_freeze_min_age", + "value": 500000 + }, + { + "name": "autovacuum_freeze_table_age", + "value": 1300000 + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "autovacuum_custom": true + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_custom_autovacuum.sql", + "expected_msql_file": "create_table_with_custom_autovacuum_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add toast table", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#", + "autovacuum_enabled": "x", + "toast_autovacuum": true, + "toast_autovacuum_enabled": "f", + "vacuum_table": { + "changed": [ + { + "name": "autovacuum_analyze_threshold", + "value": 60 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 100 + } + ] + }, + "vacuum_toast": { + "changed": [ + { + "name": "autovacuum_freeze_max_age", + "value": 2000000 + }, + { + "name": "autovacuum_vacuum_cost_delay", + "value": 50 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 13 + }, + { + "name": "autovacuum_vacuum_threshold", + "value": 70 + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_with_toast_table.sql", + "expected_msql_file": "alter_table_with_toast_table_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with fk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with advanced options", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "relhasoids": true, + "description": "test comment", + "relpersistence": true, + "fillfactor": "50", + "parallel_workers": "", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "double precision", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "numrange", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": true, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "rlspolicy": true + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_advanced_options.sql", + "expected_msql_file": "create_table_with_advanced_options_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table update grants", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#", + "rlspolicy": false, + "forcerlspolicy": false, + "relacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [ + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_update_grants.sql", + "expected_msql_file": "alter_table_update_grants_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with advanced options", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#" + } + },{ + "type": "create", + "name": "Create Table for like table", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "data": { + "name": "like_tbl", + "columns": [ + { + "name": "id", + "cltype": "integer", + "is_primary_key": true + }, + { + "name": "name", + "cltype": "text" + } + ], + "primary_key": [ + { + "columns": [ + { + "column": "id" + } + ], + "include": [] + } + ], + "unique_constraint": [ + { + "name": "", + "columns": [ + { + "column": "name" + } + ], + "include": [] + } + ], + "is_partitioned": false, + "schema": "public", + "spcname": "pg_default" + }, + "store_object_id": true + },{ + "type": "create", + "name": "Create Table using like table", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_like_tbl$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "test ", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": true, + "like_constraints": true, + "like_indexes": true, + "like_storage": true, + "like_comments": true, + "like_identity": true, + "like_statistics": true, + "like_generated": true, + "like_compression": true, + "like_relation": "public.like_tbl" + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "create_table_with_lik_tbl.sql", + "expected_msql_file": "create_table_with_lik_tbl_msql.sql" + },{ + "type": "delete", + "name": "Delete Table with advanced options", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_like_tbl$%{}[]()&*^!@\"'`\\/#" + } + },{ + "type": "create", + "name": "Create Table with list partition", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_patition_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "partition table", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_active", + "values_in": "'ACTIVE'", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "list", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "status" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_partition.sql", + "expected_msql_file": "create_table_with_partition_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with list partition", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_patition_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with range partition", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_range_patition_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_arr_small PARTITION", + "values_from": "20", + "values_to": "25", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "range", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "arr" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_range_partition.sql", + "expected_msql_file": "create_table_with_range_partition_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with range partition", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_range_patition_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with hash partition", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_hash_patition_$%{}[]()&*^!@\\\"'`\\\\/#", + "relowner": "postgres", + "relacl": [], + "description": "hash partition", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_part11", + "values_modulus": "2", + "values_remainder": "1", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "hash", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "name", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "id" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_hash_partition.sql", + "expected_msql_file": "create_table_with_hash_partition_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with hash partition", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_hash_patition_$%{}[]()&*^!@\\\"'`\\\\/#" + } + }, + { + "type": "create", + "name": "Create Table with range partition with collate and opclass", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "partition_table_with_collate_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "partition table", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_arr_small", + "values_from": "'20'", + "values_to": "'25'", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "range", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "status", + "collationame": "\"C\"", + "op_class": "text_pattern_ops" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_partition_table_with_collate.sql", + "expected_msql_file": "create_partition_table_with_collate_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table ", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "partition_table_with_collate_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with compression columns", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "simple_table_comp_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col4", + "cltype": "character varying", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 30, + "attprecision": null, + "attidentity": "a", + "attcompression": "pglz", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col5", + "cltype": "bit", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attidentity": "a", + "attcompression": "lz4", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col6", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [] + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_column_compression.sql", + "expected_msql_file": "create_table_with_column_compression_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table to change column compression type", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_comp_$%{}[]()&*^!@\"'`\\/#", + "columns": { + "changed": [ + { + "attnum": 1, + "attcompression": "lz4" + }, + { + "attnum": 2, + "attcompression": "pglz" + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_change_col_comp.sql", + "expected_msql_file": "alter_table_change_col_comp_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table to change column data type and compression type", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_comp_$%{}[]()&*^!@\"'`\\/#", + "columns": { + "changed": [ + { + "attnum": 3, + "cltype": "character varying", + "attcompression": "lz4" + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_change_col_type_comp.sql", + "expected_msql_file": "alter_table_change_col_type_comp_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table ", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "simple_table_comp_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with column storage", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "simple_table_storage_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col4", + "cltype": "character varying", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 30, + "attprecision": null, + "attidentity": "a", + "attstorage": "e", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [] + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_column_storage.sql", + "expected_msql_file": "create_table_with_column_storage_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table ", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "simple_table_storage_$%{}[]()&*^!@\"'`\\/#" + } + } + ] + } + \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/16_plus/create_table_with_column_storage.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/16_plus/create_table_with_column_storage.sql new file mode 100644 index 000000000..696985d2c --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/16_plus/create_table_with_column_storage.sql @@ -0,0 +1,16 @@ +-- Table: public.simple_table_storage_$%{}[]()&*^!@"'`\/# + +-- DROP TABLE IF EXISTS public."simple_table_storage_$%{}[]()&*^!@""'`\/#"; + +CREATE TABLE IF NOT EXISTS public."simple_table_storage_$%{}[]()&*^!@""'`\/#" +( + col4 character varying(30) STORAGE EXTERNAL COLLATE pg_catalog."default" +) + +TABLESPACE pg_default; + +ALTER TABLE IF EXISTS public."simple_table_storage_$%{}[]()&*^!@""'`\/#" + OWNER to enterprisedb; + +COMMENT ON TABLE public."simple_table_storage_$%{}[]()&*^!@""'`\/#" + IS 'test comment'; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/16_plus/create_table_with_column_storage_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/16_plus/create_table_with_column_storage_msql.sql new file mode 100644 index 000000000..94f540598 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/16_plus/create_table_with_column_storage_msql.sql @@ -0,0 +1,10 @@ +CREATE TABLE public."simple_table_storage_$%{}[]()&*^!@""'`\/#" +( + col4 character varying(30) STORAGE EXTERNAL +); + +ALTER TABLE IF EXISTS public."simple_table_storage_$%{}[]()&*^!@""'`\/#" + OWNER to enterprisedb; + +COMMENT ON TABLE public."simple_table_storage_$%{}[]()&*^!@""'`\/#" + IS 'test comment'; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/16_plus/test.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/16_plus/test.json new file mode 100644 index 000000000..a8f526937 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/16_plus/test.json @@ -0,0 +1,2353 @@ +{ + "scenarios": [ + { + "type": "create", + "name": "Create Table without primary key", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col3", + "cltype": "boolean", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col4", + "cltype": "character varying", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 30, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col5", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": 20, + "attprecision": 10, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col6", + "cltype": "timestamp with time zone", + "attacl": [], + "min_val_attlen": 0, + "max_val_attlen": 6, + "is_primary_key": false, + "attnotnull": false, + "attlen": 5, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_without_primary_key.sql", + "expected_msql_file": "create_table_without_primary_key_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table to change column data types", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#", + "columns": { + "changed": [ + { + "attnum": 1, + "cltype": "bigint" + }, + { + "attnum": 2, + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "cltype": "character varying" + }, + { + "attnum": 6, + "attlen": null, + "cltype": "time without time zone" + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_change_col_data_type.sql", + "expected_msql_file": "alter_table_change_col_data_type_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add pk", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#", + "columns": { + "changed": [ + { + "attnum": 1, + "attnotnull": true, + "is_primary_key": true + } + ] + }, + "primary_key": { + "added": [ + { + "columns": [ + { + "column": "col1" + } + ], + "include": [] + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_add_pk_not_null_constraint.sql", + "expected_msql_file": "alter_table_add_pk_not_null_constraint_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add null constraint, rename column", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#", + "columns": { + "changed": [ + { + "attnum": 1, + "name": "col1_rename", + "is_primary_key": false + }, + { + "attnum": 4, + "attnotnull": true + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_add_null_constraint_rename_col.sql", + "expected_msql_file": "alter_table_add_null_constraint_rename_col_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table add pk", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with primary key", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [ + { + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"'`\\\\/#" + } + ], + "include": [] + } + ], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "integer", + "attacl": [], + "is_primary_key": true, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "json", + "attacl": [], + "is_primary_key": false, + "attnotnull": true, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_pk.sql", + "expected_msql_file": "create_table_with_pk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add columns", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#", + "columns": { + "added": [ + { + "name": "col3_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": 10, + "attprecision": 5, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col4_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_add_cols.sql", + "expected_msql_file": "alter_table_add_cols_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table delete columns", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#", + "columns": { + "deleted": [ + { + "attoptions": [], + "attacl": [], + "seclabels": [], + "name": "col2_$%{}[]()&*^!@\\\"'`\\\\/#", + "atttypid": 114, + "attnum": 2, + "cltype": "json", + "collspcname": "", + "description": null, + "edit_types": [ + "json", + "jsonb" + ], + "is_primary_key": false, + "attstattarget": -1, + "attnotnull": true, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attndims": 0, + "atttypmod": -1, + "attstorage": "x", + "defval": null, + "typname": "json", + "displaytypname": "json", + "elemoid": 114, + "typnspname": "pg_catalog", + "defaultstorage": "x", + "indkey": "1", + "isdup": false, + "is_fk": false, + "is_sys_column": false, + "relname": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#", + "is_view_only": false, + "is_pk": false, + "old_attidentity": "a" + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_delete_cols.sql", + "expected_msql_file": "alter_table_delete_cols_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table delete columns", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with pk & check constraint", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "create table comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [ + { + "name": "custom_pk", + "comment": "custom pk created", + "fillfactor": "11", + "condeferrable": true, + "condeferred": true, + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"'`\\\\/#" + } + ], + "include": [] + } + ], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "time with time zone", + "attacl": [], + "min_val_attlen": 0, + "max_val_attlen": 6, + "is_primary_key": false, + "attnotnull": false, + "attlen": 5, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "character", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 12, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [ + { + "name": "chk_const", + "consrc": "col2 != null", + "convalidated": false, + "comment": "chk const comment" + } + ], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_pk_chk.sql", + "expected_msql_file": "create_table_with_pk_chk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add unique constraint", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "unique_constraint": { + "added": [ + { + "name": "unique", + "fillfactor": "13", + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"'`\\\\/#" + } + ], + "include": [] + } + ] + } + }, + "expected_sql_file": "alter_table_add_unique_const.sql", + "expected_msql_file": "alter_table_add_unique_const_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table delete constraints", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "check_constraint": { + "deleted": [ + { + "name": "chk_const", + "consrc": "col2 <> NULL::bpchar", + "connoinherit": false, + "convalidated": false, + "relname": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "nspname": "public", + "comment": "chk const comment", + "conislocal": true + } + ] + }, + "unique_constraint": { + "deleted": [ + { + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"\"'`\\\\/#" + } + ], + "name": "unique", + "comment": null, + "spcname": "pg_default", + "fillfactor": "13", + "condeferrable": false, + "condeferred": false, + "include": [], + "col_count": 1, + "conislocal": true + } + ] + } + }, + "expected_sql_file": "alter_table_delete_constraints.sql", + "expected_msql_file": "alter_table_delete_constraints_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with pk & chk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table for FK reference", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "data": { + "name": "fk_reference_tbl", + "columns": [ + { + "name": "id", + "cltype": "integer", + "is_primary_key": true + }, + { + "name": "name", + "cltype": "bigint" + } + ], + "primary_key": [ + { + "columns": [ + { + "column": "id" + } + ], + "include": [] + } + ], + "unique_constraint": [ + { + "name": "", + "columns": [ + { + "column": "name" + } + ], + "include": [] + } + ], + "is_partitioned": false, + "schema": "public", + "spcname": "pg_default" + }, + "store_object_id": true + }, + { + "type": "create", + "name": "Create Table with fk constraint", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col3", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [ + { + "name": "fk_test", + "comment": "fk comment", + "condeferrable": true, + "confmatchtype": true, + "columns": [ + { + "local_column": "col1", + "references": "", + "referenced": "id" + } + ], + "confupdtype": "a", + "confdeltype": "a", + "autoindex": false, + "coveringindex": null + } + ], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "create_table_with_fk.sql", + "expected_msql_file": "create_table_with_fk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add one more fk", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "foreign_key": { + "added": [ + { + "name": "fk2", + "columns": [ + { + "local_column": "col2", + "references": "", + "referenced": "name" + } + ], + "confupdtype": "a", + "confdeltype": "a", + "autoindex": false, + "coveringindex": null + } + ] + } + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "alter_table_add_another_fk.sql", + "expected_msql_file": "alter_table_add_another_fk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add exclude constraint", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "exclude_constraint": { + "added": [ + { + "name": "ex_constr", + "amname": "btree", + "columns": [ + { + "column": "col1", + "is_exp": false, + "order": false, + "nulls_order": false, + "operator": "=", + "is_sort_nulls_applicable": false + } + ], + "include": [] + } + ] + } + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "alter_table_add_exclude_constraint.sql", + "expected_msql_file": "alter_table_add_exclude_constraint_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with fk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with custom auto-vacuum", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "custom auto vacuum", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "t", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "character varying[]", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 10, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "date", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor", + "value": 0.2 + }, + { + "name": "autovacuum_analyze_threshold", + "value": 55 + }, + { + "name": "autovacuum_freeze_max_age", + "value": 20000000 + }, + { + "name": "autovacuum_vacuum_cost_delay", + "value": 25 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 10 + }, + { + "name": "autovacuum_vacuum_scale_factor", + "value": 0.3 + }, + { + "name": "autovacuum_vacuum_threshold", + "value": 60 + }, + { + "name": "autovacuum_freeze_min_age", + "value": 500000 + }, + { + "name": "autovacuum_freeze_table_age", + "value": 1300000 + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false, + "autovacuum_custom": true + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_custom_autovacuum.sql", + "expected_msql_file": "create_table_with_custom_autovacuum_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add toast table", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#", + "autovacuum_enabled": "x", + "toast_autovacuum": true, + "toast_autovacuum_enabled": "f", + "vacuum_table": { + "changed": [ + { + "name": "autovacuum_analyze_threshold", + "value": 60 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 100 + } + ] + }, + "vacuum_toast": { + "changed": [ + { + "name": "autovacuum_freeze_max_age", + "value": 2000000 + }, + { + "name": "autovacuum_vacuum_cost_delay", + "value": 50 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 13 + }, + { + "name": "autovacuum_vacuum_threshold", + "value": 70 + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_with_toast_table.sql", + "expected_msql_file": "alter_table_with_toast_table_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with fk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with advanced options", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "relhasoids": true, + "description": "test comment", + "relpersistence": true, + "fillfactor": "50", + "parallel_workers": "", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "double precision", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "numrange", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": true, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false, + "rlspolicy": true + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_advanced_options.sql", + "expected_msql_file": "create_table_with_advanced_options_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table update grants", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#", + "rlspolicy": false, + "forcerlspolicy": false, + "relacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [ + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_update_grants.sql", + "expected_msql_file": "alter_table_update_grants_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with advanced options", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table for like table", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "data": { + "name": "like_tbl", + "columns": [ + { + "name": "id", + "cltype": "integer", + "is_primary_key": true + }, + { + "name": "name", + "cltype": "text" + } + ], + "primary_key": [ + { + "columns": [ + { + "column": "id" + } + ], + "include": [] + } + ], + "unique_constraint": [ + { + "name": "", + "columns": [ + { + "column": "name" + } + ], + "include": [] + } + ], + "is_partitioned": false, + "schema": "public", + "spcname": "pg_default" + }, + "store_object_id": true + }, + { + "type": "create", + "name": "Create Table using like table", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_like_tbl$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "test ", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": true, + "like_constraints": true, + "like_indexes": true, + "like_storage": true, + "like_comments": true, + "like_generated": true, + "like_identity": true, + "like_statistics": true, + "like_compression": true, + "like_relation": "public.like_tbl" + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "create_table_with_lik_tbl.sql", + "expected_msql_file": "create_table_with_lik_tbl_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with advanced options", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_like_tbl$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with list partition", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_patition_$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "partition table", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_active", + "values_in": "'ACTIVE'", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "list", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "status" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_partition.sql", + "expected_msql_file": "create_table_with_partition_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with list partition", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_patition_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with range partition", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_range_patition_$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_arr_small PARTITION", + "values_from": "20", + "values_to": "25", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "range", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "arr" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_range_partition.sql", + "expected_msql_file": "create_table_with_range_partition_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with range partition", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_range_patition_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with hash partition", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_hash_patition_$%{}[]()&*^!@\\\"'`\\\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "hash partition", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_part11", + "values_modulus": "2", + "values_remainder": "1", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "hash", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "name", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "id" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_hash_partition.sql", + "expected_msql_file": "create_table_with_hash_partition_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with hash partition", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_hash_patition_$%{}[]()&*^!@\\\"'`\\\\/#" + } + }, + { + "type": "create", + "name": "Create Table with range partition with collate and opclass", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "partition_table_with_collate_$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "partition table", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_arr_small", + "values_from": "'20'", + "values_to": "'25'", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "range", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "status", + "collationame": "\"C\"", + "op_class": "text_pattern_ops" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_partition_table_with_collate.sql", + "expected_msql_file": "create_partition_table_with_collate_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table ", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "partition_table_with_collate_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with compression columns", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "simple_table_comp_$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col4", + "cltype": "character varying", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 30, + "attprecision": null, + "attidentity": "a", + "attcompression": "pglz", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col5", + "cltype": "bit", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attidentity": "a", + "attcompression": "lz4", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col6", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [] + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_column_compression.sql", + "expected_msql_file": "create_table_with_column_compression_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table to change column compression type", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_comp_$%{}[]()&*^!@\"'`\\/#", + "columns": { + "changed": [ + { + "attnum": 1, + "attcompression": "lz4" + }, + { + "attnum": 2, + "attcompression": "pglz" + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_change_col_comp.sql", + "expected_msql_file": "alter_table_change_col_comp_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table to change column data type and compression type", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_comp_$%{}[]()&*^!@\"'`\\/#", + "columns": { + "changed": [ + { + "attnum": 3, + "cltype": "character varying", + "attcompression": "lz4" + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_change_col_type_comp.sql", + "expected_msql_file": "alter_table_change_col_type_comp_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table ", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "simple_table_comp_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with column storage", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "simple_table_storage_$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col4", + "cltype": "character varying", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 30, + "attprecision": null, + "attidentity": "a", + "attstorage": "e", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [] + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_column_storage.sql", + "expected_msql_file": "create_table_with_column_storage_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table ", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "simple_table_storage_$%{}[]()&*^!@\"'`\\/#" + } + } + ] + } diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/table_test_data.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/table_test_data.json index 0c9301ba8..b0777413a 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/table_test_data.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/table_test_data.json @@ -733,6 +733,42 @@ "error_msg": null, "test_result_data": {} } + }, + { + "name": "Create: Add Table with column storage.", + "is_positive_test": true, + "inventory_data": { + "server_min_version": 160000, + "skip_msg": "Creating table with column storage is not supported by PPAS/PG 16.0 and below." + }, + "test_data": { + "description": "Create Table API Test", + "columns": [ + { + "name": "col1", + "cltype": "character varying", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 30, + "attprecision": null, + "attidentity": "a", + "attstorage": "e", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ] + }, + "mocking_required": false, + "mock_data": {}, + "expected_data": { + "status_code": 200, + "error_msg": null, + "test_result_data": {} + } } ], "table_delete": [