From 7bf12b6929cf9d1c951e743a56699631a25290a1 Mon Sep 17 00:00:00 2001 From: Andy Yang Date: Fri, 24 Mar 2023 14:47:48 -0400 Subject: [PATCH 1/9] sql: add mixed version test for system.privileges user ID migration This patch adds a mixed version logic test that ensures granting of system privileges continues to work properly in a cluster that has both 22.2 and 23.1 nodes. The relevant version gate being tested here is V23_1SystemPrivilegesTableHasUserIDColumn. Release note: None --- .../mixed_version_system_privileges_user_id | 27 +++++++++++++++++++ .../BUILD.bazel | 2 +- .../generated_test.go | 7 +++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 pkg/sql/logictest/testdata/logic_test/mixed_version_system_privileges_user_id diff --git a/pkg/sql/logictest/testdata/logic_test/mixed_version_system_privileges_user_id b/pkg/sql/logictest/testdata/logic_test/mixed_version_system_privileges_user_id new file mode 100644 index 000000000000..00676b9724e1 --- /dev/null +++ b/pkg/sql/logictest/testdata/logic_test/mixed_version_system_privileges_user_id @@ -0,0 +1,27 @@ +# LogicTest: cockroach-go-testserver-upgrade-to-master + +# Grant system privileges in a mixed version cluster. + +statement ok +CREATE USER testuser1 + +upgrade 1 + +user root nodeidx=1 + +statement ok +REVOKE SELECT ON crdb_internal.tables FROM public + +statement ok +GRANT SYSTEM MODIFYCLUSTERSETTING TO testuser1 + +user root nodeidx=2 + +statement ok +GRANT SYSTEM CANCELQUERY TO testuser1 + +query TTTT +SELECT username, path, privileges, grant_options FROM system.privileges +---- +public /vtable/crdb_internal/tables {} {} +testuser1 /global/ {CANCELQUERY,MODIFYCLUSTERSETTING} {} diff --git a/pkg/sql/logictest/tests/cockroach-go-testserver-upgrade-to-master/BUILD.bazel b/pkg/sql/logictest/tests/cockroach-go-testserver-upgrade-to-master/BUILD.bazel index 89a8eb52fbc5..61aaa697b225 100644 --- a/pkg/sql/logictest/tests/cockroach-go-testserver-upgrade-to-master/BUILD.bazel +++ b/pkg/sql/logictest/tests/cockroach-go-testserver-upgrade-to-master/BUILD.bazel @@ -11,7 +11,7 @@ go_test( "//pkg/cmd/cockroach-short", # keep "//pkg/sql/logictest:testdata", # keep ], - shard_count = 4, + shard_count = 5, tags = [ "cpu:2", ], diff --git a/pkg/sql/logictest/tests/cockroach-go-testserver-upgrade-to-master/generated_test.go b/pkg/sql/logictest/tests/cockroach-go-testserver-upgrade-to-master/generated_test.go index 257083c4a40f..cb6376d2d537 100644 --- a/pkg/sql/logictest/tests/cockroach-go-testserver-upgrade-to-master/generated_test.go +++ b/pkg/sql/logictest/tests/cockroach-go-testserver-upgrade-to-master/generated_test.go @@ -99,3 +99,10 @@ func TestLogic_mixed_version_role_members_user_ids( defer leaktest.AfterTest(t)() runLogicTest(t, "mixed_version_role_members_user_ids") } + +func TestLogic_mixed_version_system_privileges_user_id( + t *testing.T, +) { + defer leaktest.AfterTest(t)() + runLogicTest(t, "mixed_version_system_privileges_user_id") +} From 0865a548c29963085d3d89c1ba379ae07e65ad45 Mon Sep 17 00:00:00 2001 From: Andy Yang Date: Fri, 24 Mar 2023 17:31:12 -0400 Subject: [PATCH 2/9] sql: add mixed version test for system.database_role_settings user IDs This patch adds a mixed version logic test that ensures setting default session variables continues to work properly in a cluster that has both 22.2 and 23.1 nodes. The relevant version gate being tested here is V23_1DatabaseRoleSettingsHasRoleIDColumn. Release note: None --- ...xed_version_database_role_settings_role_id | 27 +++++++++++++++++++ .../BUILD.bazel | 2 +- .../generated_test.go | 7 +++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 pkg/sql/logictest/testdata/logic_test/mixed_version_database_role_settings_role_id diff --git a/pkg/sql/logictest/testdata/logic_test/mixed_version_database_role_settings_role_id b/pkg/sql/logictest/testdata/logic_test/mixed_version_database_role_settings_role_id new file mode 100644 index 000000000000..fed783d3fe65 --- /dev/null +++ b/pkg/sql/logictest/testdata/logic_test/mixed_version_database_role_settings_role_id @@ -0,0 +1,27 @@ +# LogicTest: cockroach-go-testserver-upgrade-to-master + +# Set default session variables in a mixed version cluster. + +statement ok +CREATE USER testuser1 + +upgrade 1 + +user root nodeidx=1 + +statement ok +ALTER ROLE ALL SET timezone = 'America/New_York' + +statement ok +ALTER ROLE testuser1 SET application_name = 'my app' + +user root nodeidx=2 + +statement ok +ALTER ROLE testuser1 SET index_recommendations_enabled = false + +query TT +SELECT role_name, settings FROM system.database_role_settings +---- +· {timezone=America/New_York} +testuser1 {"application_name=my app",index_recommendations_enabled=false} diff --git a/pkg/sql/logictest/tests/cockroach-go-testserver-upgrade-to-master/BUILD.bazel b/pkg/sql/logictest/tests/cockroach-go-testserver-upgrade-to-master/BUILD.bazel index 61aaa697b225..423f7e7b1745 100644 --- a/pkg/sql/logictest/tests/cockroach-go-testserver-upgrade-to-master/BUILD.bazel +++ b/pkg/sql/logictest/tests/cockroach-go-testserver-upgrade-to-master/BUILD.bazel @@ -11,7 +11,7 @@ go_test( "//pkg/cmd/cockroach-short", # keep "//pkg/sql/logictest:testdata", # keep ], - shard_count = 5, + shard_count = 6, tags = [ "cpu:2", ], diff --git a/pkg/sql/logictest/tests/cockroach-go-testserver-upgrade-to-master/generated_test.go b/pkg/sql/logictest/tests/cockroach-go-testserver-upgrade-to-master/generated_test.go index cb6376d2d537..48b3a2c8d7c9 100644 --- a/pkg/sql/logictest/tests/cockroach-go-testserver-upgrade-to-master/generated_test.go +++ b/pkg/sql/logictest/tests/cockroach-go-testserver-upgrade-to-master/generated_test.go @@ -79,6 +79,13 @@ func TestLogic_mixed_version_can_login( runLogicTest(t, "mixed_version_can_login") } +func TestLogic_mixed_version_database_role_settings_role_id( + t *testing.T, +) { + defer leaktest.AfterTest(t)() + runLogicTest(t, "mixed_version_database_role_settings_role_id") +} + func TestLogic_mixed_version_external_connections_owner_id( t *testing.T, ) { From 3b3b5730e9c2e4af8050072b7e91edac5ba6d045 Mon Sep 17 00:00:00 2001 From: Andy Yang Date: Fri, 24 Mar 2023 18:26:13 -0400 Subject: [PATCH 3/9] backupccl: update TestRestoreOldVersions subtest for system.privileges This patch updates the TestRestoreOldVersions subtest for the system.privileges table to also test that a row for the public role is correctly restored. Release note: None --- .../backupccl/restore_old_versions_test.go | 1 + .../create-system-privileges.sql | 2 ++ ...6059393 => BACKUP-LOCK-850743482728284161} | 0 .../v22.2.6/BACKUP-STATISTICS | Bin 3919 -> 3945 bytes .../v22.2.6/BACKUP_MANIFEST | Bin 2886 -> 2890 bytes .../v22.2.6/BACKUP_MANIFEST-CHECKSUM | 2 +- .../v22.2.6/data/849140167931461633.sst | Bin 1721 -> 0 bytes .../v22.2.6/data/849140168228208642.sst | Bin 1183 -> 0 bytes .../v22.2.6/data/849140168235778051.sst | Bin 1179 -> 0 bytes .../v22.2.6/data/850743486781980673.sst | Bin 0 -> 1888 bytes .../v22.2.6/data/850743487039143939.sst | Bin 0 -> 1069 bytes .../v22.2.6/data/850743487047237634.sst | Bin 0 -> 1259 bytes ...aaabbcdf92c2d4c6c6d1c7c6c7c6cec6c8cecffffe | Bin 0 -> 2821 bytes ...2c2d4c6c6d1c7c6c7c6cec6c8cecffffe-CHECKSUM | 1 + ...aaabbcdf92c2d4c6c6d1c9cfcccecbcdcccccafffe | Bin 0 -> 2727 bytes ...2c2d4c6c6d1c9cfcccecbcdcccccafffe-CHECKSUM | 1 + ...abbcdf92c2d4cccecbd1cccfcccbcbccc7c8c9fffe | Bin 2818 -> 0 bytes ...2d4cccecbd1cccfcccbcbccc7c8c9fffe-CHECKSUM | 1 - ...abbcdf92c2d4ccceccd1c6c8c6cbcac7c9cdc9fffe | Bin 2723 -> 0 bytes ...2d4ccceccd1c6c8c6cbcac7c9cdc9fffe-CHECKSUM | 1 - 20 files changed, 6 insertions(+), 3 deletions(-) rename pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/{BACKUP-LOCK-849140163936059393 => BACKUP-LOCK-850743482728284161} (100%) delete mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/data/849140167931461633.sst delete mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/data/849140168228208642.sst delete mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/data/849140168235778051.sst create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/data/850743486781980673.sst create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/data/850743487039143939.sst create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/data/850743487047237634.sst create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cdcbdfcdcdc5cdcac5cfc7d1cdc8c9cdcac6dfd4cfcfcfcfdfaaabbcdf92c2d4c6c6d1c7c6c7c6cec6c8cecffffe create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cdcbdfcdcdc5cdcac5cfc7d1cdc8c9cdcac6dfd4cfcfcfcfdfaaabbcdf92c2d4c6c6d1c7c6c7c6cec6c8cecffffe-CHECKSUM create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cdcbdfcdcdc5cdcac5cfc8d1c6c7cfcbc7cedfd4cfcfcfcfdfaaabbcdf92c2d4c6c6d1c9cfcccecbcdcccccafffe create mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cdcbdfcdcdc5cdcac5cfc8d1c6c7cfcbc7cedfd4cfcfcfcfdfaaabbcdf92c2d4c6c6d1c9cfcccecbcdcccccafffe-CHECKSUM delete mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cec6dfcfc9c5cccfc5cecbd1cdcdc7cbcbcbdfd4cfcfcfcfdfaaabbcdf92c2d4cccecbd1cccfcccbcbccc7c8c9fffe delete mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cec6dfcfc9c5cccfc5cecbd1cdcdc7cbcbcbdfd4cfcfcfcfdfaaabbcdf92c2d4cccecbd1cccfcccbcbccc7c8c9fffe-CHECKSUM delete mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cec6dfcfc9c5cccfc5ceccd1c6cfcbcbc9cddfd4cfcfcfcfdfaaabbcdf92c2d4ccceccd1c6c8c6cbcac7c9cdc9fffe delete mode 100644 pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cec6dfcfc9c5cccfc5ceccd1c6cfcbcbc9cddfd4cfcfcfcfdfaaabbcdf92c2d4ccceccd1c6c8c6cbcac7c9cdc9fffe-CHECKSUM diff --git a/pkg/ccl/backupccl/restore_old_versions_test.go b/pkg/ccl/backupccl/restore_old_versions_test.go index cd893abe06bf..00c52be2ab69 100644 --- a/pkg/ccl/backupccl/restore_old_versions_test.go +++ b/pkg/ccl/backupccl/restore_old_versions_test.go @@ -366,6 +366,7 @@ func fullClusterRestoreSystemPrivilegesWithoutIDs(exportDir string) func(t *test sqlDB.Exec(t, fmt.Sprintf("RESTORE FROM '%s' WITH UNSAFE_RESTORE_INCOMPATIBLE_VERSION", localFoo)) sqlDB.CheckQueryResults(t, "SELECT * FROM system.privileges", [][]string{ + {"public", "/vtable/crdb_internal/tables", "{}", "{}", "4"}, {"testuser1", "/global/", "{VIEWACTIVITY}", "{}", "100"}, {"testuser2", "/global/", "{MODIFYCLUSTERSETTING}", "{}", "101"}, }) diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/create-system-privileges.sql b/pkg/ccl/backupccl/testdata/restore_old_versions/create-system-privileges.sql index 7859591ac733..1959ba9bf781 100644 --- a/pkg/ccl/backupccl/testdata/restore_old_versions/create-system-privileges.sql +++ b/pkg/ccl/backupccl/testdata/restore_old_versions/create-system-privileges.sql @@ -14,3 +14,5 @@ CREATE USER testuser2; GRANT SYSTEM VIEWACTIVITY TO testuser1; GRANT SYSTEM MODIFYCLUSTERSETTING TO testuser2; + +REVOKE SELECT ON crdb_internal.tables FROM public; diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/BACKUP-LOCK-849140163936059393 b/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/BACKUP-LOCK-850743482728284161 similarity index 100% rename from pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/BACKUP-LOCK-849140163936059393 rename to pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/BACKUP-LOCK-850743482728284161 diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/BACKUP-STATISTICS b/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/BACKUP-STATISTICS index 01a9f53c9703fb11d03bb09801a1b90f0b847c6c..3d9bbfe25409865d1134b90ca8514f0942f12a00 100644 GIT binary patch literal 3945 zcmai1Yiv|S7`=11yB(%my1i0ZR(TZ?YPHRZC29R(DoBAFAWamZ{HaTO(=2YgWOrL0 z{#jE=3M8fyH9VS9Y*Vm26cx0MC?bzWrB)<_U_~sZBA8g48Yz#~Z)UFUy)#SU2bbRa zopZkL%$XTVmf;l7Yw`AvfB&KBw=^FvFAvnl!sX@JC?z)yA3S@z#pN07I9cac3srqO zabn~{Tlr&~=EiQ1;#K@gsqbaQtCp&Svo#M%Y>o%AHJGHprkHFV#)imZ)?4ql5}PWr zA$=-I#j4MtDF}$LNtDTmJfw^f-MN2591@8{s{RCV!;n}DR8|LT6hzYCr&KKx4#yaE zs!2VSQDgEt!cH*o^uP&`Tg`Rj{mj6IlfRx({kYJjuOzd8Zkpza$K%Cb_$#hvJ8V1M6a_Q|baqU0{6)xBNfn z`A<9fV;6rk^T$5^XyuP%AdEc4Y{e&;YxDwk!T49+|Koy`A2)7c<6k>9^u5FHgaFMU z7{*W0s$oiuQ{Z3GB&Iq@H6uN;S0Z)5G#acQz#Y1}qvl-Gz2V#1o+a*1^hN9l9&EuL%_OIJv%}|aiH_5y7Mpzwkw>B1DOyFSHX1V` z`Qb=apeDFE5DSKBy0hS8=Kmj~Mn%McoRg{WI!iNZ0I@z2j2ii&V1-c=HQ>{1_%uU{ z8j(6+ix}16m{DG7tgWr83f5HRSBEQU(L^XB8dOA?4CKZ>Miwc;6CpRvcl*UD=t;q+ z7~Itr(lez6BZUll;g$rY$ASgw5%-CSyx1in={X=EZ4Hx3oCWP3YP~A9n*yfqWiju* z@=-mFxl^Cd4~^OPE;V-CSE$F3MptfX>(Px$VrkQ{!;|6F;Ph-uXF+t63Z`=84M~OO zUQ{U{1YCCIF5JJVEg@o*wT>&2M)n}4a&_P*aTc0(Q6*%i-KdR(*Bf~ojA-mBSYQpL zCu+6PJcvas5(v?EY#Y*dMt~RDUKCg>Od2T{=_H>uH##CVr=ld?l};urSpD%2#d<_{ zgMApJ&mge-eG{~ZQI$NG6G#c30t?-Bxl26G=@RhcJYL^<0{KxP(x>oqaVyLr-d)QW z&&`7pPvTlg@J!=@dC)DB3a-$uK07C}aaV-4N;AlER^M~CQ=B4k9VFDJ6Wfg^EeeLs z>IM0m+s=w~H2nuy`Y-n!ejDj@%h@*$hn~8AMubv7MX2p^F;!1@N>FOy_|V5$!_EJQ zPzO>4U6R8}`+LPwZmmVe?B`CSSjnPhDP%5)qs#&WySE$`U7!ZGGXr-v{anutwEd?F zR4KG=j|8QIh)~gc3hn#xkf=%x93Ps)R8RdSLb)pztl8gzcg0HPils0~Hs<0dp}*mg zLGd7>qwQm^+&F)!8G!~ZZ0nE;=^&QEBpNvk+HgaJ@W}KgDk7p0N}%5&IgI zU_bQNfAk&EXbNp(gEU@vbHH|JG{9D|g`^b0{WK4FcHjF>cHpBDKj9HP#{)>K2$1#pd zPTUyz&<1|#(z0>3S1D5bO33$?Qly4d!s&)TO^I}_>FGKRR-jW1IxnL`WI4-ja-&42 zN^~e#OtP@*b7=|!CTuX}GbS%t!I=6}Qk_U*QiD&CY^W1!;Ye$9n}Uc3{>##0(P)Bk zXBphZj2n{m)|Bn$kOHW z@H=;^<5#a6t;2O%4m66}HjP;c9@34NT>7*mM@J~iy-6Mcxjaq7c#c;sQl{q9*^nBh zS)w)8RO^8yk;d}MrQyo*s+vG;d2OU}NqJ>;WA)O=${N33-S}XXkWV(YJ8C{T!qeHd zM@omzQcPzPB9B5og<3;Pdpx1XDx$Hba9i_x;Y4$k+P456=0A8C*BfFw7?~8q?E+12 z1H`IWb6l@zX>QQl;yOH91drxvaXt19u*LM&XhN@#=quZsnws01Dq5ov8pK+zK}4L% zNM#g|TAT~UxP9fEJVOtjV8%Fn>HLeqd}$;kz@TG)N>H`T2K9;u!9eaBl8{J7+WJl+ zxB$`}-ubJTuDJ`7+lT(8K6VGI`BqqTZ?tE4LZLkdzh#zX4eVW`Sgq#r<`rqMAqR7q z)v`$gQ~79%q++f}Q>BU!7)55;bDzIEXo~1>49qCvAs-{Aa_#B~u@-Z4nkp@ZpY`@w zbd_GdT8}3xVZa(l=W6ZoajFd4rnJ@pk);pp4 zQ2+%C`QqCEb%?L0ml)5*vo}N@T879ocjnhf7IcMX)qh1~<6RNxLV576rSYk~VmzW< z5yIisZF{9jL&0!Zi-2z3!BMdobBiZG*>MsD>5;P^91h*LS%R9o+JxHP9){|!@zbKJ zxp$|7KFJb3|Cy-jLaLxkN?GXcq!`Lu%l9dhG4km?D&=D?-s$oQ;04gY;VZw1rDVY3 z;Tj`DsV7+fY@eH8Wl`ke2?^uE+~vn?bpI^`O{al<-%5eh1eQPtjZy~v{-g-yleJ(Ck*_}x zBiV7W1Uk&;dF+S$HhpzeEQGdze@H%gVSI&kU39`Bu{k|N%X|iCI{)4%eoV}SGWiFz z?f;~Ia5fZeJHB(nOd+$M=u|iMCfU?1hS6W#z9K(638$0^H1VTXwoy|$Io58 ze0DcSbLdoEK&QTDkDjgz=;^2I(doK?PCKLL>H>Ps8NE;!&jJvyjNYgV=nZG|W?evUJ|*OEfF||7 zs$wbo@}tstE}P4bjps)u^3vFNcGxtnOp-o@7?LF?!88yuI6%I>6h(go89J14ZETPk zmvZBo?D$wV=gC|{3>C__9CXt2gfElD0b5OavJ)e@>_m3Lkx9@GGLS`%kVAt@Vka8@ zN-)Ti8o>e0>r0VzKLbOHTraGTj-t;&hOlMC1F0FDFi)74w#-28PCSSyMP1g*%qqjK zGI#)!Rl~5{Pbso&s2Ym|Os~EFr?0&F!R52N({KtL0^*M;{38leHB+maEXl((F^TE7 zuYLcW-+Xxa?C$Bkn6@94m1T{A+yI?q01G5=_A2)_*zG)Ms!ybQqw2rfeK76flY@GFR}Krnv{?{K)5z3pXP zU11Olg+L#fZ=*4;i+CP__PXE|2#ylRB4KfbV6PBCSU8{juvmrgq_f`z_=%7vzy&06 zJ~$roWSYDHhw#n?Wm(S1P2O&xlSgTE0sbEzu$O1$z|S7bJdq~WAbAObs}TGhlD0M1 zAy`G=Sp>d`BH?-gfi(o)Lbtt*z!d~m32>4iUM9eK0*H?h_}>Uqj~ZpoWGNn|;bcT| z`jZ&xsuR7CnR3EpXY1&_8z+iJc|l+7B5Ds3v&DEwAzc+c`Svlhk$7=@h&JxSTcSQh zw$sue@IginO!UCoE?R>`k3K-258fj24@pd$nq}$bMUzc5xnU0`yG;;eIy__$0Z|-8_94-r?ryI4e=JHkYw|SO1R0mr2}L zGKz|&8)cK-)#Pyr_uG$4x^?2d?mVBtgTBP)yUiZMm@X-nZq-!HaX-OqXHyb5{L*0S z_4{nl@0AQnmyf+D57Qwal~Q(Mhw+RP(o9nO)%Z0wDB;`xM?GTU5-JQedKb; z58$G=oU_*WEbb?$b?R4dJA2 z?sq6|s%pE)Dh?>Y(-4TSlJ@UAF3vh%^MM}dn#f_b$0ViefQ47@w0%>D1E zBUs>@Dxs~Yer<(E$&H8k|3`DCLjdRDvIEmjpSR;dzmoNx>pN#_GUIni{0fQbqOrWJ zl`WHHTScs8AJAPCw8Oa1C>+y@mfa_zt_onYRUn9LFXH?v?^p4GT@pt2dyH_`fE~vMNj#cx9yY?@)Y1#!3pI>){ zz53Q3mGh<6-8zVM>syr~d+FE5Tlec8KYsBZY2UZ(c>Q@F{%IfHW)_z;wN}zp`Iu2K z**lxk)fDdc*T}8faB*9$tUp}SD(Mu*nccn^O(TX+8sLIZ1)7RDIpDUvqWm%~%nhb7G)Z!)YpZ!Z?eH;lF zG46TMcdF=mMhr+78|W0{Oo>e-h;jSG2I%W|>J_Szs3a?NrLTfFoKqI?fR8#zCxIOj zwPp2B57{J-DTgP!a*ud{3*d1LH1m+B_=J7ZtzgQqmb5AZxwy|b-)EfbGcN8KuE{f8 z+%sH*XWR_NCwZFhaGTQnlnO%oD zn|7PM?g=l_7=pWv-tI2XClCKEIUkd5*G_z?;hl;A7D6mypk`}3i(XpH(dbDQ#mj|w zxd5+MViB7^$9|3Qy9oDty^m~a53^E}%Y!1PbJ2Ye%ziOSJ`h~db{Sk-QIM_g2+8 zHL0$O?W(4jM%k$VI$S#^XTQ~OT87-kZ=hqwh!ISpr>;}2Y@cyA>+Oy*`p5dpLQh*^}+QX%!q>#0X3= zuJFI%qI0TsKjlE@BG9=w^sQ{Ho=M=-3A|HVv25ifxoDKjTG4Iob4}SZhqs3d6xfTX`MgCUjRxMS;eX6#g)Jm3GU{p@R z{l2k?MR+i{#9L)pfU##eVo}N&xj%jR!L>`Txj%iG3~v2Wh}NdSAux{^ARZAuN2@9C z39AVs?X)~jHfV8Iu}F-lk=$R{sHp;`D~4$;RyC7Z=n4AOtFOJ=3i@IU`a%GGu{Y>} z8V~x>)PtC`G}B_1dSm>_U%vO=ht06{80@70w%#M-z8V+yB%J~rmzU!bAI+bGm|iqShDRobbE)Jbnaprzc#OLxBW1GtB>RsanV8ItOy)8| zS{+rS@v()>#AvoCjgMqTCbETmv7kx$LZL90&y0>`i=$)XqvGI9NhvS#Bhs)mEb*BE zRjD4=%e=Czj^!qanVHW{C#zaXQ%vp9c4J{dFX~EZZ$U3B)f2P3R`O%=SZ=RUsg$(6 zuH?wXe6m)4sB9cB7n1b#ZOm;fT_x0orKccx7BaWL^PPJ>C4FY?>^H9Uk>~e3ejdV$ za2HLcc1-V|x$l9)dymZRpS$Pvu);cE#`j#Y5G<~9|JvVj=&C6I06=f8x&QzG literal 2886 zcmV-M3%T?kiwFP!00000|IAu@Y#dkBzxU3}?)chHCflT$Z@w0$BU(07$C-WDUK@cN zJC%}@O2Ki9uuvznJ7as&_0D!@ws9&UT!|KMaYLz46@f~v7FDf8O9@4oq;D0qf`1SQ zA%TPf;!#0qc@$9ziJ*DUzP#(T6(L#j-8=W(^E)7j zqdBxz6VTe1?9oFt0X_7fJvvtt&^c%HXiY$mI-|#G0(#6DJzf*g<7@V4y(XY_XYQGr zfSz%7dA25?XPwatH37ZgJl&`XXu}y@tO@9%GrCk0&?RT|Vog9VJ}6{yfF|+(s$waJ za@p}zR!WWL(&=1U%8h2z!=`Da8NVoFh$^b)heuqzB6z+}ZR zEca7_EE%fCA_3EH|KN>p|L*1Yp4y*;li)ZIU!(BL6sD@CRxw$Uhe=`r(;Mp-A9(4t z_nz86br93`qmr_uF_0Ue;|ySd1Wx?lDZm2>EP^sv1}hM(LU0~}sSMt=sF;hIdO|VH zGe$*a5H~>6p3t6CfQQXOX&lqd8KbB%1UEnfZ!u$Q5UF{kXll(eLpW~Zl693KxdD2> z6XIIJI!etv0CBur(U+9USq8FD2&@tt0E-?L(cfRPd17o>9N<9`NFWC$!5k=~GEpY) zC27EWnjVJac?h3?F&ZQQ3!aAH0t6Q!col-TAovMHmm!!tjrTZQ%ii{~t}Zi(g+ic@ z%(c;2uZuVjL3>^BG6biH(~+>aOt6=UAS|3uepswPxa#b80e&Q;32*^PoDYtNJeedf zz#+VMURjdUa+9|k=;TonU4Yl&0eg8y4*cw~%o9ms1Cp;p@HPa0hoo)I2N0|v@CX85 zLy>U3fWQUc&}se6r*X0j9ylW-y;IrUMDbk&Jo z$V@t6vbS~g-i%`fqcpECbP=^jiJ3xuNFiMnJ^A)Avz2&pe2BL0!)u~GM7GnCAn-w2 z4ovjG+Ai9FM2|i|o)2Cn@k=D8P0h0O(t^pxn%r;zlij8f5mWal#j57`p~KoExWA~F z*6n3gu{4z-xIvooBz{RdIb=`CIFmduF)=ZF?6zA@&K|z)MDs4gxX;lzd$z1O86~Q< zh4-nMm4=Ms7$>^8#V8~(+w6j}|oen2Ys#EMVJD!}W)cf7W)ynOg z`TA;jdT%rf*dX0Bz~O#34frIv(A_+J6W-(I>3UY8W^FHH`>y^CiGNMvzM@f3EZr!X z?7k+COSs>DT-2?zw|3|GG#>ON?&vmq3}d>eSh`hJHOKt~vztvw;KVlvTdzN4gDx$& z0%T`_qtwi~hC~rHOQ=UI24KWcjRYk$3EBkHRZ1IoSCa{KZTsIFp6gO41 zU1Svpl;G(T{jD|+g{=m{++BEIlpWdm;MSwSMIgZ(+I}$#Y-I-CU#HCd@2DeK;F~I; zov40og{R1^hxv!2InyD4^KjXLX{XN*;X%KW^_}ZGXJ<0ww@Ca9iRpr|w4{|RlVw{) ztYsh2T@JKozwd@rdl(;O4Aay4Jn3k=VKjuA3c7a_IR@|NVsI>kSX6fyOG*} z)HcKAUnG8?^pc!WcF)oqw%f(ujAQOz-6Xo8-Xc0y&0Fr;Ki{Tl7d(7^-4*ugJ9|{l z6N*|Zc(V`AN0l!ZiS%jF6a@BGS*U?z}J zHA~TpCPR0nN?X6^P=xm z(e;cNkS;dRDb_P3HjyCK+b1?a-@H>VQ{`AWUZ%@^WxVB_GLHv*)ImB4?2xD(tABdP zCOJ$wJlU0d#0y*ik87Zrhdjl{?2~R8Q--yuRT#+C`;7B_#<@P@>OI3Xd4{X^4A%7+>%I$iLU5^Fa zI-f#rfzR!=QEt5pADDz25WEh-Zy`%VMrE&DxpF1Wt4WY1ZIn4U)f2D4N?fR_8E6I-uwF@9(V7S0!tb%r+qWz z&Int|5vWNe(*^p9Znf8nFdX zuW#wxU0jV=UyR0jqk&=B?iQolO)9K`g3ks3~o4`&ncd(!FQ^zbNmOS%U?n4bRRRJ@`UHO179?>6S=^@6Sx59alfQaL-bZ#g$Ak7f@l<#JIw=t`!> z=i=4UT_xj8DIcdV?P9KD=?bCFFFpvtBar#Vk;nVjK7NEf|LN8BJASbjJP+YTxQ`|i zd!`Og-+KFrgC}PX&mKEDdu;loJx{fnkF}ZK)n8U9I04E8S=l}o! diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/BACKUP_MANIFEST-CHECKSUM b/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/BACKUP_MANIFEST-CHECKSUM index 23204aa4b53d..2edeef319287 100644 --- a/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/BACKUP_MANIFEST-CHECKSUM +++ b/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/BACKUP_MANIFEST-CHECKSUM @@ -1 +1 @@ -U�IS \ No newline at end of file +���� \ No newline at end of file diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/data/849140167931461633.sst b/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/data/849140167931461633.sst deleted file mode 100644 index 95e19945871c3cd93cc426f2b55381da2585af16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1721 zcmaJ>Z)_7~7=PdXS+BQaYs+qQV;dbCbr^bSyR~bXOk^_37;`FYfRb|Uz3Yx$@5fL!$3>1O4Qi+@JTk z=Xu`e`8~hieMh!}MHPFqdxo=M(ZgIHcJRhzfF9iyr`^)o&<2)FuGx5*$C}^#e*zjFy%73>9y-`2h9c z#w!l5516M)dcfOl`0Mt|bu)8bvj*&CnZjO{ucphF>5Y#YFI#|)wj6D%0n|X?z5!jctMTMlIBAJoo7%TF9tjbFwfO|kCqTUF+KI=QIzGXdF zMLMgRq-c*UvC(cvD;rT9E=Rj8amgsGPdhdtMdihq{lW3G7pYSdV>5ZhP|05$R8Uk# zsAt{an<<)L06FT)Ve&rE?+$t@w<_)%iNim zJa%s{#EJBebs`a$n2>n|F#;b&qJpeZ>QLsJyL9yK`VY&$;7I41s4TeLuC*<#?z&`8 z^SYP4xdVT{2R=W!I8tNT;3^ zGv;fSTVGD^)5B}_vI-oj@WFm68vApUzO?$;n)73%le7^;u|;PG4q$G4;`)30F-&pb zT0EY$$tY%g(rrUYSxO*R3ghXq?xuQo+`2%wP41{Heuwm#>xNIS+&mgy4QO*+cEN#$ zsq+CqIm(iX3nQY+tl+UWQpr!u*Xc%TKNUJ^Y3y4#U>eo!eA1C@d{Q zY(77pxQW*wXs~B$MmwvlB8M(DE|HXJLmz&sTSu6(pr=^lHKhs1J$#?+ucwHtBk`h zhk&EX(iGR@&B%fttCvrCJ3-B2L&K0B6r0Xv_rQvx>HO>89}dt5LWSp^xCXC6fS1(( zfDS)l$S^#o9d9Cu zqIiOpSyhsw5A_s|N)K(6DNja^K7H8=#+ zi-c9R-g*QR|Y^T+9@d zQBM4f%Eu8P%sP%$Sw`Xe&@q!aA0h#%7#G~8f`3^AN@D;-RtPJK8pd!SCMHM`ZI5<| zl7^PHN==5G5+qR@29XcvfXihCWC2XiWn=^-#?)?LUH~OI&Z^9O5FltcHv$b^USX10 zlv)X(zyP(%$_t8NFDoSRq!flj0xlSdQ7ljn5Ct%fq?SlS~Nm;)@Ie#m6X=3869pin{A9$E+@IC$#wV3 zdrsP9J}8J_GX)U^QBY9XbPT}_MBM6&pD4&){CE&Q!1+|cA^I{z&q=!JlYcmH&+q&{ zfB)b8J#2zZwMzRr3%3v%<%=`l&w z`_CLqgYhGeO&*0IX=fzxJeFA2R-&&oQp;)j(vKI_Qb0JW`wdPCBcM(^$(&~+Qs)$ICtZ=BO7YzGZ-5v?;8Q5#{9X*+> zr)Gx^ygd1xTKYUQTNnX(_pKkkfdHno&iY-`h1Y7v zZ&?*groaj2l^8`zW!cHW_}USuS&k~4A7>}U-EY5(**#*So-ohx)}Jh-$_sVp8o(2W7ypg8v(uiOb#=?X~v-81l{ zbn_8ho5y#6(Qx3^PEoUpsy6>XRZNMA7_Qm`S*}T1h_!tpVus_;56FtuLMxWdNMO13 z@!>(Z*6_INDboHAEXVt5p51g@w1OSWZX?SSL7I?VUFlydSOpEjf zgi_0Mmt5@o?LpZvJfHD9UE{rYYev;#w77d>awcb!Rbm(S7N+i*n#obdbCP|rpz=1%)Ko4U!1sNN>jKf8Vm>)l@PNW0%Rp*Vulg5PLqzLL?N*W zkHvY#Wp^gVRA!Z>I(&kGP&-OW1HEyh;KwPl(^-DC`l}%?i{QZ1plC zo49q>0LlRL0tYj+6$IoI?5#ksYf&VGEm{DvFch6-V%y;=wwruY6q&^44HLKKnZyKg z3_2vJ6Xf|Mz^+NbpcLV>yG`5nSs-tNZqq^C8M}L@P>Vp~vcMuVu5E)nrcQSAoTN)X z-~pa(@}H}_=^jU^$d(>B8v(BI?8wCq*(#wXLZUWnBQ6D-h-Z58Az2Frc&(d6OmI!o z)KG5(alI@=+f^?3=@0fHNZt~sA9R!P?#@Xs_TBOte=~LgekAYeNJ9eqe-lgi?bY*_ G#Q6u|v|)Mx diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/data/849140168235778051.sst b/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/data/849140168235778051.sst deleted file mode 100644 index c74467daa9a7930c00c7b0784d285115410530a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1179 zcmaJ=U1(fI6rQ=e+xwH7bk`)CHBwottx>v@xQQ($Mk2*ZYl}*x6h$tx_nz!tI`=0t zv)SD~NL5;riav&b4@LSGNkPRv2t|D>)Q3Lklc2uz*{D$35Ti4@A@#|*4BT^O&N<)t zzB9jO+vwoP#>(G)x4!-O2ET}x(a4#b_q>hcZy)L?C&mw2im&7w=v@ShOFEIa4o` zpD#bFzRBD+dJF@>e;d*hN_HOY6=max&LZ;h)|@@9!O=>C)#MJ(cCEVG-0w zjj10}qXGgVX^jC1;{e)3lcW=l=5fklA#9U{kV)W5q>0f%+-fB1>Urq=$8F_ve!`kj zOcrPqvJMFYUEXx8A*CFrN`O6@y{?*FpKI>pAcSIfKBj5f8MHhvNwvIOwh>TCi3l&i<&52jm26V+qS_S5dfbAxA|R&B6GD254mCwAsc9P) z<3zKi*Ql9Y0mTvW9U_0?n=(&!zyb zA)tXQ*2oSF6!8*eO{J6|0Wbv^Vqd+209gY#0$vA_q`+w$2sD^674318u~c$vKaQIb z>Gs&wU0~P55KA6{*yrxYDy9wQylY`dGa4uH_n>wz^4l2Y0aR7`+y>x%zN8PyhaB6+N;yoGI@nQ|PW`)^eI$ dJ>TfF!-pdLo%O`!Oi7#nzqAOOSJ%JN`(GSUcGLg> diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/data/850743486781980673.sst b/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/data/850743486781980673.sst new file mode 100644 index 0000000000000000000000000000000000000000..f3ba542b86bb645e7c7e24774799bf7ce9769c2c GIT binary patch literal 1888 zcmaJ>eQXnD7=PYgOYd&Ct{rVR#=4a;LHr2#LHI*~7^4``h>?gfMjbkQZzJemzD?VEpL;%k zzvp>I91{5Ko3i<$l!z;U2B6^14HduMa%w(xbuaE$XYl?YASfu=oE-=p;7(;;J>)qv zu>QpN^^~)(udlI?{PbDMtn}~^8&55RPDmq*rzAUg{mF0`=n{5LYZ$=Bgxyf!+nn9r zrT}*g?RqU(2OLEY7rSaXqQ0Xo1l(VzH~NDiV8(J2MCRMw76$IV<2COE$v;J(way4x zoqLF)^Rst+b0}Md?IR~xJkGH;9=HeUUOupp2YA!Gu&4L3h_{Z`G0P+f%-ogD*KjPZ z5*G7uN>h_K&`V%$-|wurayIS{?H*k<%lj-FVrmBWFT8s=(g+@=CY!sZe$Nq-q`x?& z2clRpG*Pa)!?c-o7wu`_p5T^@*&4dGb-XW?ZUPTmG>C5R{qa240(nKnSoHOB6TOi3 zEZ{uLN)Ff-xYMDxk5(JZ0^Wbm_$M1yz;thMjZ5Js&aCS6gt$k3D_>&^x%;n+E&X{f z6LRP6dda^vA1UGQfF6#H5;x)gvK7S5&XLg#{2ORN#}ImXX;1jXLV&V@ec8WrPHL-v z9_ib>wfw?s5B2~6%0=0220Y#ooXK{c+xN@69C#Vlp2Uh2S7JGZucK_X|GAs1;Zn<% z+Ac49om*ck2XsR;NV#evDMk$fS>gLb#B#L%(<{hpRa6Ow?TtNZN|Q5Q3vKbv)uTOF zO37FX=xbXV;CKM1aWrM9n)eQNDSMldNn#l&{ki6q2;fn}V)hL&N*-F?50UbJ|b@yeX)Dt}d-zk+nr16YlRNi#^4{oBi=UX{!=QsAvy4n-QsVbyZBEE=GgY3D!Tm9 z^GwyfVZ`(N+!Yjf?T4}h`g`d9>iszLA2IE;MO8VKP=wWDA}(iyxMYU6v$UHqtBHi5YcxbA z*`Abf_Guc{b%OqKMNB3$)9FY=O`3h6_mW)H-bi=c&=&=&YU=$mUWesH)xp|uZM|P7 z(_!FPX3_k5e?m-0qcr^$vq)eS`6&j}r0E#F_blr#$I7pYtYPWgEYZcW*%REJP>pHBN z^$<>g&OuYaO?m~^fzneR1sN+bqX(E=q-qJ#5Uv^l?Lku%nCO!BH8-=F0ywP5%*^NT zqIII2B24Lmgk_R2R-$A|B%mEAfwdSG$hy%)Mbcq9WhbyJDOpY$8l8ufR6>}nagui( zadu>GnK;(VxI9E`VmLs2;z{^{7^t#D*48A`Qy6*dSNnmWp^GG-b3SH$@^{F;)|^RmZ)yg~?gx6i e?V46(?o$Hlcg*^jE;METe@qfCjl8(u{Qd(=;zrv5 literal 0 HcmV?d00001 diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/data/850743487039143939.sst b/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/data/850743487039143939.sst new file mode 100644 index 0000000000000000000000000000000000000000..7f03a8fc0082e19e531766dd17d514f7f2954fa7 GIT binary patch literal 1069 zcmaJ<&2Jk;6rWkg@p`jy?0i5JnvyCOf{ISQC>63SKp|;ewT(pFmQulLcK5{@Wp;L% z87JOy0SQ$Jy&|EWDseyvI3OXRO3*V0ZauXUe?Y~B&jXhVX6&@|#FIvvdGp@yz4!aQ z>xBE=!<8D8Xp!=bL{(r@vIwi78&4$T}?v{3z3Y& zfC&v!P`;q?BvPZdtIfaj%Kp^t=ieoN{NgnWco@y%;){hBj%ZN2t3WQ{jp+_gLz7c$ z`1em<+@5N@mH&R>q}QzCVeDUOtzCY7wcWbZYF{ay@kfr;m(RY2st;cI%q=gie7$n? z;ZI(3+C)yC-*}_7er5IC#m)BGo11IxcI(3FSzFN>w&%`|`e)=7en7Q<28KRy9(|(5 ztEWFg^&y!?J1P!I$jya>R6$Jo0}>`;=nl&0Fo6UediFWLh;(EWOm2o!qL{O1Q@WsGe|*~b#7twc0S0J&u+rkWDPuE9;GJc5CPHoTZI6>^Wd&>N^8 zD5V2K2atiHfr9r$YT2?jQySU@Y3H$|yCZl&TptyA72F#j5)PuHw^4Z%r!t|M93~-m z3J)Z(>@r2{_ShCsWeD5OW-CwOUCO&)KV#sgVGvOoLyX)CPC#~mq!~ymVudCOB}2RD za-M1Fj$zSFNPot@?h5-Q3_?o=s^pJhlhc6{1{3=9Ba@Kw*lciL=>bPmrNezNY)Bdz zbRuX1hb6q4V{7Z2m{s6lztz=uT;Gv&uMc7;_}uZm!x8K=wyfF3MZYf0zm3Kp?`9_Z kSf;t}oKK67qdL#dH1OThv764c_5HtD4Su`z<+t|y3#TMOQ~&?~ literal 0 HcmV?d00001 diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/data/850743487047237634.sst b/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/data/850743487047237634.sst new file mode 100644 index 0000000000000000000000000000000000000000..39ad36acd1c34888fabf84e2010567f8ac70a1e7 GIT binary patch literal 1259 zcmaJ=UuYaf7~i?ed3&2Py(Bgs@!yH@3e_7f*Yt840-BKi3AGiprisWhyZdFc&Ft(t zGk3X-4?gHarJ$uCD2Tr3iy(@END;KqYTu+U#TTKVk9}yVE&5`d*}GhQa^Q}gZ|D2X z@6Wf!)2(;k8FOh{NZ>f)K4HN&kwL@^bjEn_#2Zgdz4_eD0y28*kF^{BSk)&MBX^TW z#NDVIBaW!lDlhWLYrDFw@-he+Fu(lM*;^Nj*Uw(Pizbj5e&`tiE(h61-GArr(aHez zEm8Q|s!q)|4>s3ZjaF^inQqi(nohmef|+`axXx^I);ZupvsJ#NVSoJd&d*r|o87kp zOc9THAOO?A1twsZ_>-%@T^U?){X*$utGeKFTC3NVmXFnE+M9rOtotXAEO*w9ymHz*Ogm1naB}U`@j6*K$a=cY?R@rjMiZDW3*a4P z9fvTIV0+-SeP8LvVdM>{H#}MfQKbfp#|# zxUI%ZQ!qw`kY@JC$OP&T+Ez&k>;YATfw^kbJi{D8A#fjX6ay#B6UKNpuWV;+N@K~* zJ&3hKoN7#S7pRy=>hs|Nh+J_GQawJ@6egth8>%6qp8A^8q`0CqGjSH8}ICEc0Zua zE|JodN@24_Vuf%#WACohS$jJ6G@D9@t)Mhh(unp$Re`ETs8U;rJ`{?yqy?1#q5=t_ zN_?px4Uf`DlnPKKA|VL!+n(`cW@lFsQKY?dea}6=^E=1qo^xj~$Yc82AAk4ZQ&%rP zzn7yqbhas=v)^z=k2eMM_+!rKTvI^j+|g4_0X^l8o@ol`8F%z-Q$Ww2bw=l#0y^)` zz1S4ci|#HjH3jsNJ9@1tpx4}|8%+UixTA|r0bO)QuQvtsx;uKKDWEqV6UK0eCjbAc zVk-wrqUaAGLq{^6J>6s; zK@8=}xad6Fx}p0U!5|j7QX@FD{>D-yJ-|RmL_D0I!x`(eWoxSp(o?S0CVhN)^S5-`2-?w`N<(tDSm-&=q);3yD(OyM6kwyab$wN-pJpHnh0rRo1+eI25rh3DhbP8?#Q`1^fCNfl z1}uUasu4BvA(95Xuj!kRd>X>#6ls|N0vHhOzI+@hM==9cm;wJ#K~A#Tp`#iL>LzCrywlWAw1*mcL9Dfq6u&z zNn8MqhdfyzFTnkH_mZ+I7v(l@x6sL>0=fV{h6kPHqjKnHpJkpX5F3!Z1i@7Z{sBqH znrjfOBk&{w-$Jo)y@0?50&k+*-a_CC0_y}gLl7?z;8g;M4-@!52vZN4hGwx84-0TQ zCOP{ljC9qFUdYV2VX`|tdhf!SifJtA%RNNx5n{fQ3@N0mqA%Y$W;PQqt`E`XeRxaU zhsbeS0fas%%AtuqSjR;hkm%C~$oIjUB>o|ZX-l(h-B`BROq(0_VY1gWB4X-6rP|P3 zKXh6989Y!`Ec?Eis@R&!5Zn+=`4aEYZVuUHn5PQ+rl+SD?!Nc%@r6V89&6ua80TD# z3#V(En^EFgQ@l^jueW3r*ErF`Eyf{<(azhKOZttCFW@_!D3D|at?UAmV_4;g1i-l# zah^q7+#)Wrh=)Al37#x~4G6awLRSg=9)VFqXLqy(PXQD6Yo|9IJ6%qmk#4cm?s#&( zp7gteE6wdU^7YN|^zL{Ta6o!#fWre`8VE@8pnG}xPQ1&@(@9q1W^FBF2d@4-i7%5l zS2Zh&t(%6$?rHP5ga@3*Roy;)Pj8+t;-Ns|^Sx$|VN6#QTelmk=DMF?cCvX19D8mk zef>cPw6W|7klh82Q1j2})=NbO@%Klr|o~MK5i{u*(VPa)4Zp z_yJtpRxW8P7uw22wr*!S`5uK|rSM?gtZMSAwpw-y+`Vb1lCz?h___;cynT8Jto=Bv zTZdeV+p5|gvWg2z@b!toRyPiX%?85a{diBD9ohZh)uX^eAi)yadNB$dWhUO6Q0D!0 z)e$TROqI}fRKJeG6XfQ@{1fq<=@P*CxSYUr(&xwVP*BMR&JCQiJ(=;lBz}>^bj4g< z)ePHW*|dnYoddduf_50^%<@UCVmo~j>Zt&>8f9lO(S7lLob^$*6-=pl@Zr{i$+1F+ z01CctG1%6Lc8PG}y+g$Jlln&6VQUCrQuV2zyChKoBIhW|Dra%FQrE(&KIgAKpL12- z($*0!ET%@bdCJi0J)}3Mjx@A2Tdp?@hH6!q@+OQ%%*mFm*cy}R<)SPiLR+iVnQZr0 zZX7eAjH=m+UbPsyCso>-R%zH~U3O2KTu+yOo{Vl9vQl5R7~G;L3K15s_1z}3`rMT=oFJoiESi^N&CbW=r``vYg8>$%hu>xu7)?AQC|c=k|Pt zJ)a4=bw5Sif`Hpw&J9?dpZQKsyoWH2ITl(N0c`LPP%G$$tu&P+L-0-ix$o?*p4`S@ys=B8p z)l;!u*A&Y%+zOz}wR3j<+bySM#9i_RI$?|$!zB9Zy4A|g8Fw?@`$r(2^6r*GOIk0d z12g2v3fboja1jB?3+n^{T#NwDCm<+>y%TKfiR5P_zC>bNtLqQyRc%?b*ijx9$Z1TU zdFD?)dAFZNY#%0TioMcHsL#YT_j72>&f%fuy2GU3M>1p|Cl57$rqegAf@_NygDEBz z{x4i~&ZPHKE_5yiol8RB&c^DA3_h2^yR|jjQC^iRreSCmueBd*%bsI+XS6`>HLzx) z_6YTt=VoxWv9+(q=O-fCb}wg(1stp;)_2Kq(*cIQ?tU%@$5TT&WTTP-sxC*gs> zSi~Yc6kg)3Gc3T^w;Zu3?~c5mzWm^$ORso8eVGn#{ql&`X24Ofh!`Lq7d}U;dH)Hk z2_v1fe2r|;;;mwl7*iv8zpzpBWlYyh%U-T)7PHhB^s852c{>gIasv8N2z|Lf=%E@P z`icCPFllR+&8+mt_@lpi=biW4Ve1LlD&Ljj)EC@lqo%W__>)Y zhmXH}z5eefh7WwO_%g)wvNw#1{uu zrG82`cx6?c7@H>M<~}={t!q_Hv9zN*&7~#1qAS${W!+Hfr|0*ql_ungu>(r2R@Dx8 zk|R@#*@khyVV*L|S^8Rz+0AC^gu1ly7z9s32DJQp6~c>f4^8HG%^sS&=e}bHjxQWq zxcm6R-E+sCd8)&Fro;S>4)c3D%024Z0v`M~00960%$GK24JiNs!#8_> literal 0 HcmV?d00001 diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cdcbdfcdcdc5cdcac5cfc7d1cdc8c9cdcac6dfd4cfcfcfcfdfaaabbcdf92c2d4c6c6d1c7c6c7c6cec6c8cecffffe-CHECKSUM b/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cdcbdfcdcdc5cdcac5cfc7d1cdc8c9cdcac6dfd4cfcfcfcfdfaaabbcdf92c2d4c6c6d1c7c6c7c6cec6c8cecffffe-CHECKSUM new file mode 100644 index 000000000000..c99aa077d4f3 --- /dev/null +++ b/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cdcbdfcdcdc5cdcac5cfc7d1cdc8c9cdcac6dfd4cfcfcfcfdfaaabbcdf92c2d4c6c6d1c7c6c7c6cec6c8cecffffe-CHECKSUM @@ -0,0 +1 @@ +B:�| \ No newline at end of file diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cdcbdfcdcdc5cdcac5cfc8d1c6c7cfcbc7cedfd4cfcfcfcfdfaaabbcdf92c2d4c6c6d1c9cfcccecbcdcccccafffe b/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cdcbdfcdcdc5cdcac5cfc8d1c6c7cfcbc7cedfd4cfcfcfcfdfaaabbcdf92c2d4c6c6d1c9cfcccecbcdcccccafffe new file mode 100644 index 0000000000000000000000000000000000000000..a5b9a8c3ce17e2a023da02075f87fb30478222de GIT binary patch literal 2727 zcmV;Y3Rv|YiwFP!00000|IAu_XdKtIzxU3}?&wOg#~VAIH@v(z8D8?%6ImIpJ}m2x zB1<(mP6Mv26e>!`vpZMPIIEe>&TK3PN)`GMZwD)yAUO$lv!PnVh!y5v2*(Ui~|-qV{+3BCE4e6%o+ zbM{%=A!{5I?!d#C(eyRL6aRGz zh(H0Wpa#~#1_b9Icm{&GalC6)vsa0JLbL5NR$b?iFvPOKqCKa82-_ExaL%w7tSaFs zVTc96WX`o9Gs{}lChcoRaNfnG8ahV{L+ntnNXUeBj9K_9#Q9p?SkvlfImkmP@=9(2 zEC*QRaDT<+iF08IKmps7^mRx-1L3z|js*q4gBKyV2*D)? z-h$w52!09CRS1?&<2@eNYOuX(=<6Kfp%mGpr#o0o+oGO4Yq7A$R(? z8pSzaS)_{8CZsPza1DaLLE81^V+b}7cnX1UpoCm6BCv_TTj;j85x9!L1_jPh)Qc2& zjRNu`6#f^&%)^#RY@QKe5zZu5&iy||hVH2saeHybiaU8>3 zvH4tE7!F{%*EAwy<{_=xAYL50%>5)DtZKG%e@)jMqH~lm%re1>cUdoo>@lq~#RD@l zGmH1!cl6}qk^4@x?=p%9Jd2BGYsAYaNvj#rXBIYEGK%M%?BkY`kmPvhoy#TtYU8u` zPFDqr>Y`OWU}^%Z8j}D7&m+P2NJx4l#2$%IL?R{9MX(9sHYIe8!tYZUH4J`Nn|O+t zdVrkWvUa+hJY(Io(;j$wp`MPriz_SaH;VPmi1glM7H~oOX+Xe(ei{f#@}c{A`cAyZ z&(mpEl5TA;V~3&sEsd|xc%W)kG{>+^o8Q+KaRm>$Usnz1?7h83zJ!Ov6`$!fdyHbX zsyT+!(1{m*irdW>6ma7C;q3W$yP(Y#e*xWn!7*mxd`qH8x+SF%%MlnkHlsiV&4LbM zx=Cr{L0t0FMgqH4_Uz-SqiCcsQ(N z!{CO&*_q7vZ5qEsW422OnuIm|QQU7@!o`mcwmbwJVgX_YR8hC-sfDYa&-`l&eOC6M4{8AtNb; zxE=_x2SVV1pT!b#nNVYMEK6UJlaRNK)U z!sU9oD2s_8>$N(U@BYe7VlG;v6GtMJ&f zTMT8q95$*tTIQ4k_{LJQ3z6d5t+o^=b(^| znGnWI@M9*VBO|m$Mo33SXo-xU!Nk1CiUT5cGa1@uCi@44Kc?`ly5?wQ%_e>s99?9M zWOb&|+#sXf_#|`dFmKadv)3o$i!_cBZew@*)2H(%{+eG(t?txLe4*u?N&uE(EOKOK zXFH32TFlAhNtVPb#CU}WZ%|@U+ds#Ch44EF4+g!DYLf?fr7h%9k<-2CJ_Z&(mn0uZ z{?bkvWh>lz?=?trdm+bP$VJ?GpJHx7$nC93Zi5RSScIDpT!!FxkY^#M^VhFmzn&NM zA}G-=%4s;)7q1}T^+N{#iNU)aVrr%nzfPq#Zb$JzFsZj&`tTlkJGE)X+@pA?s@aa( z2(G>8{w|X5#@N4A^-fKur((NKG}|)03ZToibAI8QEvIG7UHS$(<&2!bBnRfY)ynP} zcQfAmuRwg*zgvntX}z2d-B4pM)POS}!~~=-tWyLC2?B(GfUp?$Pq6JLlAqA{GL3Pq zZaidE$qKRgaS;~j8O)x0_76XLub)Qj0H$l2v)YT)XOouuIW*?x@$gFBWisd^Il7ON zhgmq+=`XF4=ZlS@Xt%HK+LXKW20k-M<)vThf1Z<(&&_MOGzn> z->ta+i(`jpCdOtaN>Wju)RaS0%caAU;}zx5SZVC=czL=~CdzcVT%MXPO-_whCZ`Tf z%ER+j&0G=3lu>0=5lch5RzG8yqPC__P0Ud9^Pif_*GZLVHaWiAT3$9PhE_dTHcYL4 zc46Q8^prX^aZsz(s^p-*a_sO@zF|IKT4&5Ms8jm#>SGW*1v$|2-)j(Fg8NvyuxIYb z{Jr;|ICygL$l^UG7w?%r>5elU#&aFUcXb%w*I|5rhjG5c`0X9W@8~c-(qUZbFkb2~ hKHgz`B4hk#kY#V>5D!G~?*IS*|NpK{p7Z}F002PgXh{G7 literal 0 HcmV?d00001 diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cdcbdfcdcdc5cdcac5cfc8d1c6c7cfcbc7cedfd4cfcfcfcfdfaaabbcdf92c2d4c6c6d1c9cfcccecbcdcccccafffe-CHECKSUM b/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cdcbdfcdcdc5cdcac5cfc8d1c6c7cfcbc7cedfd4cfcfcfcfdfaaabbcdf92c2d4c6c6d1c9cfcccecbcdcccccafffe-CHECKSUM new file mode 100644 index 000000000000..ad1fd3872906 --- /dev/null +++ b/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cdcbdfcdcdc5cdcac5cfc8d1c6c7cfcbc7cedfd4cfcfcfcfdfaaabbcdf92c2d4c6c6d1c9cfcccecbcdcccccafffe-CHECKSUM @@ -0,0 +1 @@ +�w \ No newline at end of file diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cec6dfcfc9c5cccfc5cecbd1cdcdc7cbcbcbdfd4cfcfcfcfdfaaabbcdf92c2d4cccecbd1cccfcccbcbccc7c8c9fffe b/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cec6dfcfc9c5cccfc5cecbd1cdcdc7cbcbcbdfd4cfcfcfcfdfaaabbcdf92c2d4cccecbd1cccfcccbcbccc7c8c9fffe deleted file mode 100644 index f50d55fe0981b6a65fce489e05d38208b0367f61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2818 zcmV+d3;pyTiwFP!00000|IAu_XdKtIzxU3}?&wOg#~VAIH}B=W$?%e{C$c=dE6I`y zMV1n&TK3PN)>2QZ|b;dD8aOZn52XRnlyD&syg2xC84EI zTKZ25#V!2^ZQArBrGY|S=6hy$*1K8>Q)AHGJNMl4JHK=0+;i?O202Wh|H=onn?pxpZ^{ekcy*CeMz)>K+LE%>^Of@X6Zm}c}^Taf!H!fUy z@Rc{-e|qoieoQ-$3}sbgAU8y38NdPw9Q&^mfCmy-0X47&)*(0p!FdQ~OL)hMVy$TE zF~zb@nRS&x+z?IsLc2}?9<~b=aYnc1&8o%_+z<`?#f+mtq?VMbrM1h9;H-m7)>Ve& zhUg(*h)acan3{hO;%u$1uPXJ^3}m4YS|zps7JV#Yu)pN+#5k}xz=J%Hz$BOfi=c*T zM2)5S$=R#=_zktd zlX>zY9KpMnlvTMXw|TpTP9EjaMfg8>$XQ;JLqGd0^F*H5faIGHybHl!A?aB2Aq49P zJc__qP%K<8BCvtL>*$7e5V(xMIswiQ#4`kVfdJzD1pXJo)P1I*SuDlFJe-b6&VB?V zU3H@uGBa+N>`sr~TX3dg8cX_e4^exVn6D&53hAoo%Xf~M&BTlAL$rAxUKjTva-5b2 zp%033Xrd3+anS}O`t$+veegPoUm-DVX|}B!%NCnybHhGN_L@dSOx>$g8=C8fE^BYa zgH^?{@2shct*H#b4bzk_@iW@ZA-fFoRDR#|^z_1!J8nC^aOjR>?YoTP0axR~>6+$d zl(^Ou?^E;ZEg8i%PV{h#aY$mc^Y-PEeq-ZP_+}>xB-ueLyTIfaRyiU8aIQt1XAu{- zh>I-ZA&+>1C-Yzf!Yzi-y9E9Xfl)(eceDjh9us$Kr#BrtT~3}tx7cZSJUL%a`rW~m z=Ju=k`dWB;cRUL?AiXre;XyAA1SEOTy*zz0-sR=#Br9>VwwAF2SO1d4zaa5I)vPGC zZWwbdS$>t<*>}$j6>kl}f zjb%@O>@IManm^Z)DB@-bNyK6ZMvT-*P(m}HLoi*Vv~dqEdTAquT~0uk1LShV58&dq za!Fgc&{i(8bvx6^w)v{CI?oB(DoE5#q*DW~X?bAzOjo_?q9dapd zt7?15DlRC&*Cz&BT|E>w8wiVc<2`Y9WcPztj{*;Y1Siqfi&5YxGx6SpGViaej$lDx zs)V+q`gIhZAU7Z8{}<1hE&-g6%Lz;;ef}>V4l3Eexq)-GCo_JX#LtqLu9&NdMbdeM%h_RbYDDzvp&kUf+;l*-rrgeaXR zs9db3ck3Y0t#4O~?5AHpnBK4Z`~<~&tbO0M8VO3T%wNcen`J`F4*qhqY z)eIgC*2rmXxVWQX==U@Z-qo-(w059!URBMoiMmg^0Jp;{HDya}ajbkR1 zQ8io9s}@7|q)J=UDh=DL%kF72(9`9gC!?E&tkjn+2Dd0mdC3Ro|JYg|$HGNSdR`2i zDtev~L(;_-I>jVYVjBr!(mt^T`qex28db~GvNgIkP{W(fDNA@LKpm!&&<=^(w)&@! zY%+-{mnWxkk9mO$;c+cA^N^?bjC0bhVal{uv^oR1q|dm(XPoCVF6kMr%`;rmGhB;j zybQ)?d72;Kv6IQr7BksD3H%{}uU8dYDJz!dmBHaf)<{}s8m{#-+SN}orw(&B?KOLS zEV@Wz2<`@Yr?-4Ed+aaS#e{UHcH%QF?^F!15MdERHQU=+^wVOF$4|02UM|ARg?RlE zi`e=(_EUs^jPRh}`^c7d4=c5~JS=j$7u|=!{HNpO1HlvRlu1XZzw6_`Lp!!hfLf zPFph+!;W63VjH)kc)(xO+bw-?kGz%IG-d5=c&Msaw%qWqy~zG9k`G|)-Kx5$Ce>51 zUDp)LG~5cH%e8ZM{;MsgWyD?b20CGk7{es`>blj+&KY+t-unk2p7QRNLQ7gNrvo$O z$O_r#3~&(v$qVZQ0bGm#&LxtxhBz}{`xK`Ki)vMaFX0au|5&QGmA3Xe8 zKaJQvOx6^8rI%2jiEHlX(3qXW!^?GtNxzR|$UaUUYW_^8Z(0S{7BL1>Oe*|Oxagco z@26boTnsvwgub1P)t55(Tn6vf)@(<4Rj!zZp;f%reylBfj^Ulr0=d_~nu*#Y)L)*P z!P&;vzH&<#1x=@ z-_pIixE8U#5|8y(1EaD%Fpz6CkV`SpFY>oLw`#cx9#FL#?(mOFKpCY8Phe>vX|?c#Vqv&{gE#|_2BPPpf4w&FNM&T`-2{;@u8o{ z-Gxb8vutLiKgPfP_){;v(GFWrz+MSq>wPjFsPSM=(>cI_S#T80z@yBN`putz@Z_y$ zUt9a=k#~NtetGeEi0NgsFj|-z9m{3!Efzy!#vwz{>BdTH+7gF=`b&Km@jsiFLjt7OPT*Zr0MG! U!~!1tI{*Ox|HC>pkP0aP0Keda&Hw-a diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cec6dfcfc9c5cccfc5cecbd1cdcdc7cbcbcbdfd4cfcfcfcfdfaaabbcdf92c2d4cccecbd1cccfcccbcbccc7c8c9fffe-CHECKSUM b/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cec6dfcfc9c5cccfc5cecbd1cdcdc7cbcbcbdfd4cfcfcfcfdfaaabbcdf92c2d4cccecbd1cccfcccbcbccc7c8c9fffe-CHECKSUM deleted file mode 100644 index 73a9cf3a075e..000000000000 --- a/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cec6dfcfc9c5cccfc5cecbd1cdcdc7cbcbcbdfd4cfcfcfcfdfaaabbcdf92c2d4cccecbd1cccfcccbcbccc7c8c9fffe-CHECKSUM +++ /dev/null @@ -1 +0,0 @@ -^X� \ No newline at end of file diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cec6dfcfc9c5cccfc5ceccd1c6cfcbcbc9cddfd4cfcfcfcfdfaaabbcdf92c2d4ccceccd1c6c8c6cbcac7c9cdc9fffe b/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cec6dfcfc9c5cccfc5ceccd1c6cfcbcbc9cddfd4cfcfcfcfdfaaabbcdf92c2d4ccceccd1c6c8c6cbcac7c9cdc9fffe deleted file mode 100644 index 0ae37bb69d51c9fb33fa33d36d2ccc7f28494e78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2723 zcmV;U3S9LciwFP!00000|IAu_Y#c`wpPAjgTaWEzb4{9MMPa+5<+63$_4y-?k&t7z zQj$_BI4%+vVzYNUwl_WRUT^mrrxL=IpyWy#N`AR z5_-nl<=Li$p7owyXiDe>@7wjJgx0;MOHBz~@}6F7O6W!J>7}NGUV2czy)cV&_G#N8 zD;yMV!h@L6^cBP8);NBR!vmPETbAR0D$u5-6CO#JedkASe)spUy!X`JBAffod6Yod8mdt>`aYTkVqocENS}xB37BI+0r22y2rfc!34+%kcpHMB zL39~{g_C%f$F&-4uNwL)hj=JO_UOqD7Spz<^AL2l1usKzf;yRy#bt`WOhvNrK83Pa zgYb;E-$nSbm?j`ZBncrn5sGw?z6gi#?nP}yEvaqMZlO~|MRXB<7!SD9N7X3K0m~v) zq}Cz*1_bXw@J~p)-h2ST8Ul|X@J*DE>qP|C5qJ&V@HPUM5m=+Z8H#$E0?$)GzMsPX zMVPtIGKtMIA}qqG#LAhEV`S)_dLcLM$z*r7dT+tGie)YuOI@h;Ff~_6O9~mf9IWrG zna$|Miy_*446jSZ5V=7sf+z+hHF7Zk>xO6@Qa#211u=My#xK*DwTa^x=910l+QP68 z)7_>K88i24)dun6u)*BhaDP>^ox5tf<`A8ugh7@GR{Vy>zI#t{^H8nMVge2;{rM?&n82t_1PB3%UQ5N=UI?@;&;6h;k$-_a(XBBt&pr#G#g z4NjhsjkMDqczUj$j=PI1E9_T`^|grf?qn8lLHcPx!2Nz22ubpx`+53iyvxtiX;zYM zZ7pMmq5dt6e?#NGs#Vb(!!m7tPg}$l-0yx}HJsCTbQk#&9t>A}rrYc>jM=K@7*0bc zUic|)Ctpy&v2PD%&%f0LZ7%r>=#3W~X6DYdB#NY4QW~)wfstb~3RKWE=pd$Rls4|c zB|mK>u&XKPYKUBo`2j-GS0U}I5cw*^zHVna`96c6XYfGXsuFdDtd!jXcW>6ICnE$V5j^aV+s)Dwo`gIMSpf@k`k0x`bM}QFEa)s%p&yV22u#ydf8wO{4 zGUIn>{0xoRinX#rOvmQ=EX6wR0o_GGJB<6R@<~#0+&&3)RRG(KvOAgDc=8a=2PoSL zrp!Eee`~?ydLhLCrNFivZtJRDp$*`}KgIuy{|j@7s2~zSW1{?87_k z$}-U#RidjWt+LJE)RwNMaep{R&1%Et9SzgCr$N-Zb;{6-`!eggXa`TiU8r&f=PPv* zRrP(r>|+P9i@PX4~qY9z|4{e?3SX~lj#k!e;+MhEMb=POXBy27 zGTPNoGPe%%HtjZheKNjC<0#<u$%}dslxP>_ zB%JAqR}k>}HwOQO!8;vdYNivvPNg<(hjCvpsk>YH@E&<9wQ0uO+wnkEvmLb&Tzk>I zT_oR%v45-TotjKn#de)&wq<%1zy{aO`MGbkoR%?n=^N;jGjalx9GKgvR(8+0Yw_NH z8RCQf-BRR9>*aLlh8laJ2AlyQCLn!bogzR;5Fi8ugvGFbf^9vK{FugX&=}Y1#=SFj>WgDxbX3u)-v*;su&htK8kZnEmQ#;a<@GEGwPTl=xL>^X*a z#uLD|+o@-HY zE6H&u64D^IdLw554f>XiyNhd~_2s12TOEwc_RvA0)j=V{!Jx?B?%YZW72KzjMXgbF z^fIRl3hob`MLfcT(Iws*#{-N5&k>Ib-jny!morbk`>#LxKYf{sZv6^~CDY(2SU?<* zk4v9s^+NCsPo$AfR=z~HSn+4^NKTkh{9oAUg)(MqmhCLniOntc1pVQ!J^8?&GN3P| zpf5(ymwJO9nF*kuD108%4zV3>xi`jt@Ys_tzTOVoNWor?U>iL$9-8rCPq76cfEjQU zOv9txfd0K-zyHK-XJ1|Y#F4lEtbb$SIf&UMYh-xj;P6->e{ZQYTpFGbt}7{}(OVVw ze{tmC)Y!<>SV=1Cp$_9phw)N}@zDDHhj<`@{{;X5|NpeP&4vFb001}{Vio`Z diff --git a/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cec6dfcfc9c5cccfc5ceccd1c6cfcbcbc9cddfd4cfcfcfcfdfaaabbcdf92c2d4ccceccd1c6c8c6cbcac7c9cdc9fffe-CHECKSUM b/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cec6dfcfc9c5cccfc5ceccd1c6cfcbcbc9cddfd4cfcfcfcfdfaaabbcdf92c2d4ccceccd1c6c8c6cbcac7c9cdc9fffe-CHECKSUM deleted file mode 100644 index 98cac927d12f..000000000000 --- a/pkg/ccl/backupccl/testdata/restore_old_versions/system-privileges-restore/v22.2.6/progress/BACKUP-CHECKPOINT-13cdcfcdccd2cfccd2cec6dfcfc9c5cccfc5ceccd1c6cfcbcbc9cddfd4cfcfcfcfdfaaabbcdf92c2d4ccceccd1c6c8c6cbcac7c9cdc9fffe-CHECKSUM +++ /dev/null @@ -1 +0,0 @@ -�o�{ \ No newline at end of file From 10177c0f47000c7b50e51728b9d4c00441a2bd3a Mon Sep 17 00:00:00 2001 From: Rafi Shamim Date: Mon, 27 Mar 2023 15:52:28 -0400 Subject: [PATCH 4/9] sql: buffer COPY OUT data Rather than sending each COPY result row one-by-one, now the data will get buffered, then flushed when the buffer size limit is reached or when sending ReadyForQuery. Release note: None --- pkg/sql/conn_executor.go | 17 +++----- pkg/sql/conn_io.go | 37 +++++++++++++--- pkg/sql/copy_to.go | 12 +++--- pkg/sql/internal.go | 2 +- pkg/sql/pgwire/command_result.go | 30 +++++++++++++ pkg/sql/pgwire/conn.go | 72 +++++++++++++++---------------- pkg/sql/pgwire/pgwirebase/conn.go | 11 ----- 7 files changed, 111 insertions(+), 70 deletions(-) diff --git a/pkg/sql/conn_executor.go b/pkg/sql/conn_executor.go index ef8a0a0721df..be97b96143dd 100644 --- a/pkg/sql/conn_executor.go +++ b/pkg/sql/conn_executor.go @@ -16,7 +16,6 @@ import ( "io" "math" "math/rand" - "strconv" "strings" "sync/atomic" "time" @@ -2281,9 +2280,10 @@ func (ex *connExecutor) execCmd() (retErr error) { ex.phaseTimes.SetSessionPhaseTime(sessionphase.SessionQueryReceived, tcmd.TimeReceived) ex.phaseTimes.SetSessionPhaseTime(sessionphase.SessionStartParse, tcmd.ParseStart) ex.phaseTimes.SetSessionPhaseTime(sessionphase.SessionEndParse, tcmd.ParseEnd) - res = ex.clientComm.CreateCopyOutResult(pos) + copyRes := ex.clientComm.CreateCopyOutResult(tcmd, pos) + res = copyRes stmtCtx := withStatement(ctx, tcmd.Stmt) - ev, payload = ex.execCopyOut(stmtCtx, tcmd) + ev, payload = ex.execCopyOut(stmtCtx, tcmd, copyRes) // Note: we write to ex.statsCollector.phaseTimes, instead of ex.phaseTimes, // because: @@ -2586,7 +2586,7 @@ func isCopyToExternalStorage(cmd CopyIn) bool { } func (ex *connExecutor) execCopyOut( - ctx context.Context, cmd CopyOut, + ctx context.Context, cmd CopyOut, res CopyOutResult, ) (retEv fsm.Event, retPayload fsm.EventPayload) { // First handle connExecutor state transitions. if _, isNoTxn := ex.machine.CurState().(stateNoTxn); isNoTxn { @@ -2774,16 +2774,11 @@ func (ex *connExecutor) execCopyOut( // above. txn := ex.planner.Txn() var err error - if numOutputRows, err = runCopyTo(ctx, &ex.planner, txn, cmd); err != nil { + if numOutputRows, err = runCopyTo(ctx, &ex.planner, txn, cmd, res); err != nil { return err } - // Finalize execution by sending the statement tag and number of rows read. - dummy := tree.CopyTo{} - tag := []byte(dummy.StatementTag()) - tag = append(tag, ' ') - tag = strconv.AppendInt(tag, int64(numOutputRows), 10 /* base */) - return cmd.Conn.SendCommandComplete(tag) + return nil }); copyErr != nil { ev := eventNonRetriableErr{IsCommit: fsm.False} payload := eventNonRetriableErrPayload{err: copyErr} diff --git a/pkg/sql/conn_io.go b/pkg/sql/conn_io.go index 6c202eaf1f1e..da3644b45048 100644 --- a/pkg/sql/conn_io.go +++ b/pkg/sql/conn_io.go @@ -364,9 +364,6 @@ var _ Command = CopyIn{} type CopyOut struct { ParsedStmt parser.Statement Stmt *tree.CopyTo - // Conn is the network connection. Execution of the CopyFrom statement takes - // control of the connection. - Conn pgwirebase.Conn // TimeReceived is the time at which the message was received // from the client. Used to compute the service latency. TimeReceived time.Time @@ -682,7 +679,7 @@ type ClientComm interface { // CreateCopyInResult creates a result for a Copy-in command. CreateCopyInResult(pos CmdPos) CopyInResult // CreateCopyOutResult creates a result for a Copy-out command. - CreateCopyOutResult(pos CmdPos) CopyOutResult + CreateCopyOutResult(cmd CopyOut, pos CmdPos) CopyOutResult // CreateDrainResult creates a result for a Drain command. CreateDrainResult(pos CmdPos) DrainResult @@ -883,9 +880,20 @@ type CopyInResult interface { } // CopyOutResult represents the result of a CopyOut command. Closing this result -// produces no output for the client. +// sends a CommandComplete message to the client. type CopyOutResult interface { ResultBase + + // SendCopyOut sends the copy out response to the client. + SendCopyOut( + ctx context.Context, cols colinfo.ResultColumns, format pgwirebase.FormatCode, + ) error + + // SendCopyData adds a COPY data row to the result. + SendCopyData(ctx context.Context, copyData []byte, isHeader bool) error + + // SendCopyDone sends the copy done response to the client. + SendCopyDone(ctx context.Context) error } // ClientLock is an interface returned by ClientComm.lockCommunication(). It @@ -1079,6 +1087,25 @@ func (r *streamingCommandResult) SetPortalOutput( ) { } +// SendCopyOut is part of the sql.CopyOutResult interface. +func (r *streamingCommandResult) SendCopyOut( + ctx context.Context, cols colinfo.ResultColumns, format pgwirebase.FormatCode, +) error { + return errors.AssertionFailedf("streamingCommandResult does not implement SendCopyOut") +} + +// SendCopyData is part of the sql.CopyOutResult interface. +func (r *streamingCommandResult) SendCopyData( + ctx context.Context, copyData []byte, isHeader bool, +) error { + return errors.AssertionFailedf("streamingCommandResult does not implement SendCopyData") +} + +// SendCopyDone is part of the pgwirebase.Conn interface. +func (r *streamingCommandResult) SendCopyDone(ctx context.Context) error { + return errors.AssertionFailedf("streamingCommandResult does not implement SendCopyDone") +} + // BulkJobInfoKey are for keys stored in pgwire.commandResult.bulkJobInfo. type BulkJobInfoKey string diff --git a/pkg/sql/copy_to.go b/pkg/sql/copy_to.go index 941b3d1217ea..8bfd0d6ad4f8 100644 --- a/pkg/sql/copy_to.go +++ b/pkg/sql/copy_to.go @@ -129,7 +129,7 @@ func (c *csvCopyToTranslater) headerRow(rcs colinfo.ResultColumns) ([]byte, bool } func runCopyTo( - ctx context.Context, p *planner, txn *kv.Txn, cmd CopyOut, + ctx context.Context, p *planner, txn *kv.Txn, cmd CopyOut, res CopyOutResult, ) (numOutputRows int, retErr error) { copyOptions, err := processCopyOptions(ctx, p, cmd.Stmt.Options) if err != nil { @@ -140,7 +140,7 @@ func runCopyTo( var t copyToTranslater switch cmd.Stmt.Options.CopyFormat { case tree.CopyFormatBinary: - //wireFormat = pgwirebase.FormatBinary + // wireFormat = pgwirebase.FormatBinary return 0, unimplemented.NewWithIssue( 97180, "binary format for COPY TO not implemented", @@ -203,7 +203,7 @@ func runCopyTo( }() // Send the message describing the columns to the client. - if err := cmd.Conn.BeginCopyOut(ctx, it.Types(), wireFormat); err != nil { + if err := res.SendCopyOut(ctx, it.Types(), wireFormat); err != nil { return 0, err } @@ -213,7 +213,7 @@ func runCopyTo( if row, ok, err := t.headerRow(it.Types()); err != nil { return err } else if ok { - if err := cmd.Conn.SendCopyData(ctx, row); err != nil { + if err := res.SendCopyData(ctx, row, true /* isHeader */); err != nil { return err } } @@ -231,7 +231,7 @@ func runCopyTo( if err != nil { return err } - if err := cmd.Conn.SendCopyData(ctx, row); err != nil { + if err := res.SendCopyData(ctx, row, false /* isHeader */); err != nil { return err } } @@ -239,7 +239,7 @@ func runCopyTo( }(); err != nil { return 0, err } - return numOutputRows, cmd.Conn.SendCopyDone(ctx) + return numOutputRows, res.SendCopyDone(ctx) } var encodeMap = func() map[byte]byte { diff --git a/pkg/sql/internal.go b/pkg/sql/internal.go index 3e306c3d241c..e3ab7eac3516 100644 --- a/pkg/sql/internal.go +++ b/pkg/sql/internal.go @@ -1204,7 +1204,7 @@ func (icc *internalClientComm) CreateCopyInResult(pos CmdPos) CopyInResult { } // CreateCopyOutResult is part of the ClientComm interface. -func (icc *internalClientComm) CreateCopyOutResult(pos CmdPos) CopyOutResult { +func (icc *internalClientComm) CreateCopyOutResult(cmd CopyOut, pos CmdPos) CopyOutResult { panic("unimplemented") } diff --git a/pkg/sql/pgwire/command_result.go b/pkg/sql/pgwire/command_result.go index 31da52ca745c..9e77a4813f8e 100644 --- a/pkg/sql/pgwire/command_result.go +++ b/pkg/sql/pgwire/command_result.go @@ -321,6 +321,36 @@ func (r *commandResult) SetPortalOutput( _ /* err */ = r.conn.writeRowDescription(ctx, cols, formatCodes, &r.conn.writerState.buf) } +// SendCopyOut is part of the sql.CopyOutResult interface. +func (r *commandResult) SendCopyOut( + ctx context.Context, cols colinfo.ResultColumns, format pgwirebase.FormatCode, +) error { + r.assertNotReleased() + r.conn.writerState.fi.registerCmd(r.pos) + return r.conn.bufferCopyOut(cols, format) +} + +// SendCopyData is part of the sql.CopyOutResult interface. +func (r *commandResult) SendCopyData(ctx context.Context, copyData []byte, isHeader bool) error { + if err := r.beforeAdd(); err != nil { + return err + } + if err := r.conn.bufferCopyData(copyData, r); err != nil { + return err + } + if !isHeader { + r.rowsAffected++ + } + return nil +} + +// SendCopyDone is part of the pgwirebase.Conn interface. +func (r *commandResult) SendCopyDone(ctx context.Context) error { + r.assertNotReleased() + r.conn.writerState.fi.registerCmd(r.pos) + return r.conn.bufferCopyDone() +} + // IncrementRowsAffected is part of the sql.RestrictedCommandResult interface. func (r *commandResult) IncrementRowsAffected(ctx context.Context, n int) { r.assertNotReleased() diff --git a/pkg/sql/pgwire/conn.go b/pkg/sql/pgwire/conn.go index 96b0550e0c84..1ce4eceb58e3 100644 --- a/pkg/sql/pgwire/conn.go +++ b/pkg/sql/pgwire/conn.go @@ -897,7 +897,6 @@ func (c *conn) handleSimpleQuery( if err := c.stmtBuf.Push( ctx, sql.CopyOut{ - Conn: c, ParsedStmt: stmts[i], Stmt: cp, TimeReceived: timeReceived, @@ -1261,34 +1260,6 @@ func (c *conn) BeginCopyIn( return c.msgBuilder.finishMsg(c.conn) } -// BeginCopyOut is part of the pgwirebase.Conn interface. -func (c *conn) BeginCopyOut( - ctx context.Context, columns []colinfo.ResultColumn, format pgwirebase.FormatCode, -) error { - c.msgBuilder.initMsg(pgwirebase.ServerMsgCopyOutResponse) - c.msgBuilder.writeByte(byte(format)) - c.msgBuilder.putInt16(int16(len(columns))) - for range columns { - c.msgBuilder.putInt16(int16(format)) - } - return c.msgBuilder.finishMsg(c.conn) -} - -// SendCopyData is part of the pgwirebase.Conn interface. -func (c *conn) SendCopyData(ctx context.Context, copyData []byte) error { - c.msgBuilder.initMsg(pgwirebase.ServerMsgCopyDataCommand) - if _, err := c.msgBuilder.Write(copyData); err != nil { - return err - } - return c.msgBuilder.finishMsg(c.conn) -} - -// SendCopyDone is part of the pgwirebase.Conn interface. -func (c *conn) SendCopyDone(ctx context.Context) error { - c.msgBuilder.initMsg(pgwirebase.ServerMsgCopyDoneCommand) - return c.msgBuilder.finishMsg(c.conn) -} - // SendCommandComplete is part of the pgwirebase.Conn interface. func (c *conn) SendCommandComplete(tag []byte) error { c.bufferCommandComplete(tag) @@ -1342,7 +1313,7 @@ func cookTag( tag := append(buf, tagStr...) switch stmtType { - case tree.RowsAffected: + case tree.RowsAffected, tree.CopyIn, tree.CopyOut: tag = append(tag, ' ') tag = strconv.AppendInt(tag, int64(rowsAffected), 10) @@ -1358,10 +1329,6 @@ func cookTag( tag = strconv.AppendInt(tag, int64(rowsAffected), 10) } - case tree.CopyIn, tree.CopyOut: - // Nothing to do. The CommandComplete message has been sent elsewhere. - panic(errors.AssertionFailedf("Copy statements should have been handled elsewhere " + - "and not produce results")) default: panic(errors.AssertionFailedf("unexpected result type %v", stmtType)) } @@ -1648,6 +1615,36 @@ func (c *conn) bufferNoDataMsg() { } } +func (c *conn) bufferCopyOut(columns []colinfo.ResultColumn, format pgwirebase.FormatCode) error { + c.msgBuilder.initMsg(pgwirebase.ServerMsgCopyOutResponse) + c.msgBuilder.writeByte(byte(format)) + c.msgBuilder.putInt16(int16(len(columns))) + for range columns { + c.msgBuilder.putInt16(int16(format)) + } + return c.msgBuilder.finishMsg(&c.writerState.buf) +} + +func (c *conn) bufferCopyData(copyData []byte, res *commandResult) error { + c.msgBuilder.initMsg(pgwirebase.ServerMsgCopyDataCommand) + if _, err := c.msgBuilder.Write(copyData); err != nil { + return err + } + if err := c.msgBuilder.finishMsg(&c.writerState.buf); err != nil { + return err + } + if err := c.maybeFlush(res.pos, res.bufferingDisabled); err != nil { + return err + } + c.maybeReallocate() + return nil +} + +func (c *conn) bufferCopyDone() error { + c.msgBuilder.initMsg(pgwirebase.ServerMsgCopyDoneCommand) + return c.msgBuilder.finishMsg(&c.writerState.buf) +} + // writeRowDescription writes a row description to the given writer. // // formatCodes specifies the format for each column. It can be nil, in which @@ -1854,8 +1851,11 @@ func (c *conn) CreateCopyInResult(pos sql.CmdPos) sql.CopyInResult { } // CreateCopyOutResult is part of the sql.ClientComm interface. -func (c *conn) CreateCopyOutResult(pos sql.CmdPos) sql.CopyOutResult { - return c.newMiscResult(pos, noCompletionMsg) +func (c *conn) CreateCopyOutResult(cmd sql.CopyOut, pos sql.CmdPos) sql.CopyOutResult { + res := c.newMiscResult(pos, commandComplete) + res.stmtType = cmd.Stmt.StatementReturnType() + res.cmdCompleteTag = cmd.Stmt.StatementTag() + return res } // pgwireReader is an io.Reader that wraps a conn, maintaining its metrics as diff --git a/pkg/sql/pgwire/pgwirebase/conn.go b/pkg/sql/pgwire/pgwirebase/conn.go index 1ae341bf1564..7a00ecdde474 100644 --- a/pkg/sql/pgwire/pgwirebase/conn.go +++ b/pkg/sql/pgwire/pgwirebase/conn.go @@ -31,17 +31,6 @@ type Conn interface { // the columns that are expected for the rows to be inserted. BeginCopyIn(ctx context.Context, columns []colinfo.ResultColumn, format FormatCode) error - // BeginCopyOut sends the message server message initiating the Copy-in - // subprotocol (COPY ... TO STDOUT). This message informs the client about - // the columns that are expected for the rows to be output in CopyData format. - BeginCopyOut(ctx context.Context, columns []colinfo.ResultColumn, format FormatCode) error - - // SendCopyData sends CopyData out to the connection. - SendCopyData(ctx context.Context, copyData []byte) error - - // SendCopyDone sends CopyDone to the connection. - SendCopyDone(ctx context.Context) error - // SendCommandComplete sends a serverMsgCommandComplete with the given // payload. SendCommandComplete(tag []byte) error From d945becf80e5cbd483bff7a7aa94e3a7587cea8d Mon Sep 17 00:00:00 2001 From: Rafi Shamim Date: Mon, 27 Mar 2023 15:57:04 -0400 Subject: [PATCH 5/9] pgwire: buffer startup messages when creating connection This avoids sending each ParameterStatus one-by-one. Release note: None --- pkg/sql/pgwire/conn.go | 46 +++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/pkg/sql/pgwire/conn.go b/pkg/sql/pgwire/conn.go index 1ce4eceb58e3..856d59300520 100644 --- a/pkg/sql/pgwire/conn.go +++ b/pkg/sql/pgwire/conn.go @@ -380,7 +380,7 @@ func (c *conn) serveImpl( defer reserved.Close(ctx) var err error for param, value := range testingStatusReportParams { - err = c.sendParamStatus(param, value) + err = c.bufferParamStatus(param, value) if err != nil { break } @@ -395,7 +395,12 @@ func (c *conn) serveImpl( close(dummyCh) procCh = dummyCh - if err := c.sendReadyForQuery(0 /* queryCancelKey */); err != nil { + if err := c.bufferInitialReadyForQuery(0 /* queryCancelKey */); err != nil { + return + } + // We don't have a CmdPos to pass in, since we haven't received any commands + // yet, so we just use the initial lastFlushed value. + if err := c.Flush(c.writerState.fi.lastFlushed); err != nil { return } } @@ -735,13 +740,6 @@ func (c *conn) processCommandsAsync( return retCh } -func (c *conn) sendParamStatus(param, value string) error { - c.msgBuilder.initMsg(pgwirebase.ServerMsgParameterStatus) - c.msgBuilder.writeTerminatedString(param) - c.msgBuilder.writeTerminatedString(value) - return c.msgBuilder.finishMsg(c.conn) -} - func (c *conn) bufferParamStatus(param, value string) error { c.msgBuilder.initMsg(pgwirebase.ServerMsgParameterStatus) c.msgBuilder.writeTerminatedString(param) @@ -778,37 +776,42 @@ func (c *conn) sendInitialConnData( for _, param := range statusReportParams { param := param value := connHandler.GetParamStatus(ctx, param) - if err := c.sendParamStatus(param, value); err != nil { + if err := c.bufferParamStatus(param, value); err != nil { return sql.ConnectionHandler{}, err } } // The two following status parameters have no equivalent session // variable. - if err := c.sendParamStatus("session_authorization", c.sessionArgs.User.Normalized()); err != nil { + if err := c.bufferParamStatus("session_authorization", c.sessionArgs.User.Normalized()); err != nil { return sql.ConnectionHandler{}, err } - if err := c.sendReadyForQuery(connHandler.GetQueryCancelKey()); err != nil { + if err := c.bufferInitialReadyForQuery(connHandler.GetQueryCancelKey()); err != nil { + return sql.ConnectionHandler{}, err + } + // We don't have a CmdPos to pass in, since we haven't received any commands + // yet, so we just use the initial lastFlushed value. + if err := c.Flush(c.writerState.fi.lastFlushed); err != nil { return sql.ConnectionHandler{}, err } return connHandler, nil } -// sendReadyForQuery sends the final messages of the connection handshake. -// This includes a BackendKeyData message and a ServerMsgReady +// bufferInitialReadyForQuery sends the final messages of the connection +// handshake. This includes a BackendKeyData message and a ServerMsgReady // message indicating that there is no active transaction. -func (c *conn) sendReadyForQuery(queryCancelKey pgwirecancel.BackendKeyData) error { +func (c *conn) bufferInitialReadyForQuery(queryCancelKey pgwirecancel.BackendKeyData) error { // Send our BackendKeyData to the client, so they can cancel the connection. c.msgBuilder.initMsg(pgwirebase.ServerMsgBackendKeyData) c.msgBuilder.putInt64(int64(queryCancelKey)) - if err := c.msgBuilder.finishMsg(c.conn); err != nil { + if err := c.msgBuilder.finishMsg(&c.writerState.buf); err != nil { return err } // An initial ServerMsgReady message is part of the handshake. c.msgBuilder.initMsg(pgwirebase.ServerMsgReady) c.msgBuilder.writeByte(byte(sql.IdleTxnBlock)) - if err := c.msgBuilder.finishMsg(c.conn); err != nil { + if err := c.msgBuilder.finishMsg(&c.writerState.buf); err != nil { return err } return nil @@ -1356,9 +1359,13 @@ func (c *conn) bufferRow(ctx context.Context, row tree.Datums, r *commandResult) } } if err := c.msgBuilder.finishMsg(&c.writerState.buf); err != nil { - panic(errors.NewAssertionErrorWithWrappedErrf(err, "unexpected err from buffer")) + return errors.NewAssertionErrorWithWrappedErrf(err, "unexpected err from buffer") + } + if err := c.maybeFlush(r.pos, r.bufferingDisabled); err != nil { + return errors.NewAssertionErrorWithWrappedErrf(err, "unexpected err from buffer") } - return c.maybeFlush(r.pos, r.bufferingDisabled) + c.maybeReallocate() + return nil } // bufferBatch serializes a batch and adds all the rows from it to the buffer. @@ -1399,6 +1406,7 @@ func (c *conn) bufferBatch(ctx context.Context, batch coldata.Batch, r *commandR if err := c.maybeFlush(r.pos, r.bufferingDisabled); err != nil { return err } + c.maybeReallocate() } } return nil From f7d1256e52722121b6a5e7bce29c40f6afe3d65e Mon Sep 17 00:00:00 2001 From: Rafi Shamim Date: Mon, 27 Mar 2023 17:02:35 -0400 Subject: [PATCH 6/9] sql: refactor CopyIn handling This makes it so we don't need to manually send a CommandComplete. Instead, when the CopyInResult is closed, CommandComplete will be sent, similar to how it works for other message types. Release note: None --- pkg/sql/conn_executor.go | 8 +++++--- pkg/sql/conn_io.go | 12 ++++++++++-- pkg/sql/copy_from.go | 9 +-------- pkg/sql/internal.go | 2 +- pkg/sql/pgwire/command_result.go | 6 ++++++ pkg/sql/pgwire/conn.go | 13 +++++-------- pkg/sql/pgwire/pgwirebase/conn.go | 4 ---- 7 files changed, 28 insertions(+), 26 deletions(-) diff --git a/pkg/sql/conn_executor.go b/pkg/sql/conn_executor.go index be97b96143dd..1ef824628f33 100644 --- a/pkg/sql/conn_executor.go +++ b/pkg/sql/conn_executor.go @@ -2265,9 +2265,10 @@ func (ex *connExecutor) execCmd() (retErr error) { ex.phaseTimes.SetSessionPhaseTime(sessionphase.SessionStartParse, tcmd.ParseStart) ex.phaseTimes.SetSessionPhaseTime(sessionphase.SessionEndParse, tcmd.ParseEnd) - res = ex.clientComm.CreateCopyInResult(pos) + copyRes := ex.clientComm.CreateCopyInResult(tcmd, pos) + res = copyRes stmtCtx := withStatement(ctx, tcmd.Stmt) - ev, payload = ex.execCopyIn(stmtCtx, tcmd) + ev, payload = ex.execCopyIn(stmtCtx, tcmd, copyRes) // Note: we write to ex.statsCollector.phaseTimes, instead of ex.phaseTimes, // because: @@ -2804,7 +2805,7 @@ func (ex *connExecutor) setCopyLoggingFields(stmt parser.Statement) { // connection any more until this returns. The copyMachine will do the reading // and writing up to the CommandComplete message. func (ex *connExecutor) execCopyIn( - ctx context.Context, cmd CopyIn, + ctx context.Context, cmd CopyIn, res CopyInResult, ) (retEv fsm.Event, retPayload fsm.EventPayload) { // First handle connExecutor state transitions. if _, isNoTxn := ex.machine.CurState().(stateNoTxn); isNoTxn { @@ -2862,6 +2863,7 @@ func (ex *connExecutor) execCopyIn( var numInsertedRows int if cm != nil { numInsertedRows = cm.numInsertedRows() + res.SetRowsAffected(ctx, numInsertedRows) } // These fields are not available in COPY, so use the empty value. f := tree.NewFmtCtx(tree.FmtHideConstants) diff --git a/pkg/sql/conn_io.go b/pkg/sql/conn_io.go index da3644b45048..c5fc74d58656 100644 --- a/pkg/sql/conn_io.go +++ b/pkg/sql/conn_io.go @@ -677,7 +677,7 @@ type ClientComm interface { // CreateEmptyQueryResult creates a result for an empty-string query. CreateEmptyQueryResult(pos CmdPos) EmptyQueryResult // CreateCopyInResult creates a result for a Copy-in command. - CreateCopyInResult(pos CmdPos) CopyInResult + CreateCopyInResult(cmd CopyIn, pos CmdPos) CopyInResult // CreateCopyOutResult creates a result for a Copy-out command. CreateCopyOutResult(cmd CopyOut, pos CmdPos) CopyOutResult // CreateDrainResult creates a result for a Drain command. @@ -874,9 +874,12 @@ type EmptyQueryResult interface { } // CopyInResult represents the result of a CopyIn command. Closing this result -// produces no output for the client. +// sends a CommandComplete message to the client. type CopyInResult interface { ResultBase + + // SetRowsAffected sets the number of rows affected by the COPY. + SetRowsAffected(ctx context.Context, n int) } // CopyOutResult represents the result of a CopyOut command. Closing this result @@ -1087,6 +1090,11 @@ func (r *streamingCommandResult) SetPortalOutput( ) { } +// SetRowsAffected is part of the sql.CopyInResult interface. +func (r *streamingCommandResult) SetRowsAffected(ctx context.Context, rows int) { + r.rowsAffected = rows +} + // SendCopyOut is part of the sql.CopyOutResult interface. func (r *streamingCommandResult) SendCopyOut( ctx context.Context, cols colinfo.ResultColumns, format pgwirebase.FormatCode, diff --git a/pkg/sql/copy_from.go b/pkg/sql/copy_from.go index 2e3ad399c288..4649f93738d8 100644 --- a/pkg/sql/copy_from.go +++ b/pkg/sql/copy_from.go @@ -15,7 +15,6 @@ import ( "context" "encoding/binary" "io" - "strconv" "strings" "time" "unicode/utf8" @@ -590,13 +589,7 @@ Loop: } } - // Finalize execution by sending the statement tag and number of rows - // inserted. - dummy := tree.CopyFrom{} - tag := []byte(dummy.StatementTag()) - tag = append(tag, ' ') - tag = strconv.AppendInt(tag, int64(c.insertedRows), 10 /* base */) - return c.conn.SendCommandComplete(tag) + return nil } const ( diff --git a/pkg/sql/internal.go b/pkg/sql/internal.go index e3ab7eac3516..a0815a2ca2ea 100644 --- a/pkg/sql/internal.go +++ b/pkg/sql/internal.go @@ -1199,7 +1199,7 @@ func (icc *internalClientComm) CreateEmptyQueryResult(pos CmdPos) EmptyQueryResu } // CreateCopyInResult is part of the ClientComm interface. -func (icc *internalClientComm) CreateCopyInResult(pos CmdPos) CopyInResult { +func (icc *internalClientComm) CreateCopyInResult(cmd CopyIn, pos CmdPos) CopyInResult { panic("unimplemented") } diff --git a/pkg/sql/pgwire/command_result.go b/pkg/sql/pgwire/command_result.go index 9e77a4813f8e..37aa6d030625 100644 --- a/pkg/sql/pgwire/command_result.go +++ b/pkg/sql/pgwire/command_result.go @@ -321,6 +321,12 @@ func (r *commandResult) SetPortalOutput( _ /* err */ = r.conn.writeRowDescription(ctx, cols, formatCodes, &r.conn.writerState.buf) } +// SetRowsAffected is part of the sql.CopyIn interface. +func (r *commandResult) SetRowsAffected(ctx context.Context, n int) { + r.assertNotReleased() + r.rowsAffected = n +} + // SendCopyOut is part of the sql.CopyOutResult interface. func (r *commandResult) SendCopyOut( ctx context.Context, cols colinfo.ResultColumns, format pgwirebase.FormatCode, diff --git a/pkg/sql/pgwire/conn.go b/pkg/sql/pgwire/conn.go index 856d59300520..f7d9a1a862c1 100644 --- a/pkg/sql/pgwire/conn.go +++ b/pkg/sql/pgwire/conn.go @@ -1263,12 +1263,6 @@ func (c *conn) BeginCopyIn( return c.msgBuilder.finishMsg(c.conn) } -// SendCommandComplete is part of the pgwirebase.Conn interface. -func (c *conn) SendCommandComplete(tag []byte) error { - c.bufferCommandComplete(tag) - return nil -} - // Rd is part of the pgwirebase.Conn interface. func (c *conn) Rd() pgwirebase.BufferedReader { return &pgwireReader{conn: c} @@ -1854,8 +1848,11 @@ func (c *conn) CreateErrorResult(pos sql.CmdPos) sql.ErrorResult { } // CreateCopyInResult is part of the sql.ClientComm interface. -func (c *conn) CreateCopyInResult(pos sql.CmdPos) sql.CopyInResult { - return c.newMiscResult(pos, noCompletionMsg) +func (c *conn) CreateCopyInResult(cmd sql.CopyIn, pos sql.CmdPos) sql.CopyInResult { + res := c.newMiscResult(pos, commandComplete) + res.stmtType = cmd.Stmt.StatementReturnType() + res.cmdCompleteTag = cmd.Stmt.StatementTag() + return res } // CreateCopyOutResult is part of the sql.ClientComm interface. diff --git a/pkg/sql/pgwire/pgwirebase/conn.go b/pkg/sql/pgwire/pgwirebase/conn.go index 7a00ecdde474..7e5599288740 100644 --- a/pkg/sql/pgwire/pgwirebase/conn.go +++ b/pkg/sql/pgwire/pgwirebase/conn.go @@ -30,8 +30,4 @@ type Conn interface { // subprotocol (COPY ... FROM STDIN). This message informs the client about // the columns that are expected for the rows to be inserted. BeginCopyIn(ctx context.Context, columns []colinfo.ResultColumn, format FormatCode) error - - // SendCommandComplete sends a serverMsgCommandComplete with the given - // payload. - SendCommandComplete(tag []byte) error } From 6ec1cd70f5181a050fea98cc0eb00a9d1652ec65 Mon Sep 17 00:00:00 2001 From: Faizan Qazi Date: Tue, 28 Mar 2023 14:35:16 -0400 Subject: [PATCH 7/9] sql/schemachangr: dropping column families ran into errors Previously, dropping column families was not implemented, when we eliminated oprules, we replaced the ops with NotImplementedForDrop, which wasn't sufficient for dropped columns. The column families are cleaned up when the column type itself is dropped, so we don't really need to do much here. To address this, this patch will add code to only assert that either the table is being dropped or the column family has been removed earlier. Fixes: #99796 Release note: None --- .../drop_database_multiregion_primary_region | 4 +- .../testdata/explain/drop_table_multiregion | 6 +- .../drop_table_multiregion_primary_region | 6 +- .../drop_database_multiregion_primary_region | 40 ++++++++---- .../explain_verbose/drop_table_multiregion | 56 ++++++++++++----- .../drop_table_multiregion_primary_region | 46 +++++++++----- pkg/cli/testdata/declarative-rules/deprules | 13 ++++ .../scexec/scmutationexec/column.go | 16 +++++ .../scexec/scmutationexec/scmutationexec.go | 6 +- .../schemachanger/scop/immediate_mutation.go | 10 +++ .../internal/opgen/opgen_column_family.go | 19 +++++- .../internal/rules/current/dep_drop_column.go | 14 +++++ .../internal/rules/current/testdata/deprules | 26 ++++++++ .../internal/rules/current/testdata/oprules | 4 ++ .../scplan/internal/rules/helpers.go | 15 +++++ .../rules/release_22_2/testdata/deprules | 4 ++ .../rules/release_22_2/testdata/oprules | 4 ++ .../scplan/testdata/drop_database | 60 ++++++++++++++---- .../schemachanger/scplan/testdata/drop_index | 10 ++- .../scplan/testdata/drop_owned_by | 20 +++--- .../schemachanger/scplan/testdata/drop_schema | 30 +++++++-- .../schemachanger/scplan/testdata/drop_table | 63 ++++++++++++++++--- .../drop_index_with_materialized_view_dep | 6 +- .../schemachanger/testdata/explain/drop_table | 6 +- .../testdata/explain/drop_table_udf_default | 6 +- .../drop_index_with_materialized_view_dep | 52 ++++++++++----- .../testdata/explain_verbose/drop_table | 58 ++++++++++++----- .../explain_verbose/drop_table_udf_default | 52 ++++++++++----- 28 files changed, 496 insertions(+), 156 deletions(-) diff --git a/pkg/ccl/schemachangerccl/testdata/explain/drop_database_multiregion_primary_region b/pkg/ccl/schemachangerccl/testdata/explain/drop_database_multiregion_primary_region index 78bbabddcb45..b4e64e1517a8 100644 --- a/pkg/ccl/schemachangerccl/testdata/explain/drop_database_multiregion_primary_region +++ b/pkg/ccl/schemachangerccl/testdata/explain/drop_database_multiregion_primary_region @@ -74,7 +74,6 @@ Schema change plan for DROP DATABASE ‹multi_region_test_db› CASCADE; │ ├── MarkDescriptorAsDropped {"DescriptorID":108} │ ├── RemoveObjectParent {"ObjectID":108,"ParentSchemaID":105} │ ├── RemoveBackReferenceInTypes {"BackReferencedDescriptorID":108} - │ ├── NotImplementedForPublicObjects {"DescID":108,"ElementType":"scpb.ColumnFamil..."} │ ├── MakePublicColumnWriteOnly {"ColumnID":1,"TableID":108} │ ├── SetColumnName {"ColumnID":1,"Name":"crdb_internal_co...","TableID":108} │ ├── MakePublicColumnNotNullValidated {"ColumnID":1,"TableID":108} @@ -97,6 +96,7 @@ Schema change plan for DROP DATABASE ‹multi_region_test_db› CASCADE; │ ├── NotImplementedForPublicObjects {"DescID":108,"ElementType":"scpb.Owner"} │ ├── RemoveUserPrivileges {"DescriptorID":108,"User":"admin"} │ ├── RemoveUserPrivileges {"DescriptorID":108,"User":"root"} + │ ├── AssertColumnFamilyIsRemoved {"TableID":108} │ ├── MarkDescriptorAsDropped {"DescriptorID":104} │ ├── DrainDescriptorName {"Namespace":{"DatabaseID":104,"DescriptorID":105,"Name":"public"}} │ ├── NotImplementedForPublicObjects {"DescID":105,"ElementType":"scpb.Owner"} @@ -234,7 +234,6 @@ Schema change plan for DROP DATABASE ‹multi_region_test_db› CASCADE; │ ├── MarkDescriptorAsDropped {"DescriptorID":108} │ ├── RemoveObjectParent {"ObjectID":108,"ParentSchemaID":105} │ ├── RemoveBackReferenceInTypes {"BackReferencedDescriptorID":108} - │ ├── NotImplementedForPublicObjects {"DescID":108,"ElementType":"scpb.ColumnFamil..."} │ ├── MakePublicColumnWriteOnly {"ColumnID":1,"TableID":108} │ ├── SetColumnName {"ColumnID":1,"Name":"crdb_internal_co...","TableID":108} │ ├── MakePublicColumnNotNullValidated {"ColumnID":1,"TableID":108} @@ -257,6 +256,7 @@ Schema change plan for DROP DATABASE ‹multi_region_test_db› CASCADE; │ ├── NotImplementedForPublicObjects {"DescID":108,"ElementType":"scpb.Owner"} │ ├── RemoveUserPrivileges {"DescriptorID":108,"User":"admin"} │ ├── RemoveUserPrivileges {"DescriptorID":108,"User":"root"} + │ ├── AssertColumnFamilyIsRemoved {"TableID":108} │ ├── RemoveColumnNotNull {"ColumnID":1,"TableID":108} │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":4294967295,"TableID":108} │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":4294967294,"TableID":108} diff --git a/pkg/ccl/schemachangerccl/testdata/explain/drop_table_multiregion b/pkg/ccl/schemachangerccl/testdata/explain/drop_table_multiregion index b88f724c4e0c..fb6b838ca30c 100644 --- a/pkg/ccl/schemachangerccl/testdata/explain/drop_table_multiregion +++ b/pkg/ccl/schemachangerccl/testdata/explain/drop_table_multiregion @@ -42,7 +42,6 @@ Schema change plan for DROP TABLE ‹multi_region_test_db›.‹public›.‹tab │ ├── MarkDescriptorAsDropped {"DescriptorID":108} │ ├── RemoveObjectParent {"ObjectID":108,"ParentSchemaID":105} │ ├── NotImplementedForPublicObjects {"DescID":108,"ElementType":"scpb.TablePartit..."} - │ ├── NotImplementedForPublicObjects {"DescID":108,"ElementType":"scpb.ColumnFamil..."} │ ├── MakePublicColumnWriteOnly {"ColumnID":1,"TableID":108} │ ├── SetColumnName {"ColumnID":1,"Name":"crdb_internal_co...","TableID":108} │ ├── MakePublicColumnNotNullValidated {"ColumnID":1,"TableID":108} @@ -62,7 +61,8 @@ Schema change plan for DROP TABLE ‹multi_region_test_db›.‹public›.‹tab │ ├── RemoveUserPrivileges {"DescriptorID":108,"User":"admin"} │ ├── RemoveUserPrivileges {"DescriptorID":108,"User":"root"} │ ├── RemoveDroppedColumnType {"ColumnID":2,"TableID":108} - │ └── UpdateTableBackReferencesInTypes {"BackReferencedTableID":108} + │ ├── UpdateTableBackReferencesInTypes {"BackReferencedTableID":108} + │ └── AssertColumnFamilyIsRemoved {"TableID":108} ├── PreCommitPhase │ ├── Stage 1 of 2 in PreCommitPhase │ │ ├── 27 elements transitioning toward ABSENT @@ -130,7 +130,6 @@ Schema change plan for DROP TABLE ‹multi_region_test_db›.‹public›.‹tab │ ├── MarkDescriptorAsDropped {"DescriptorID":108} │ ├── RemoveObjectParent {"ObjectID":108,"ParentSchemaID":105} │ ├── NotImplementedForPublicObjects {"DescID":108,"ElementType":"scpb.TablePartit..."} - │ ├── NotImplementedForPublicObjects {"DescID":108,"ElementType":"scpb.ColumnFamil..."} │ ├── MakePublicColumnWriteOnly {"ColumnID":1,"TableID":108} │ ├── SetColumnName {"ColumnID":1,"Name":"crdb_internal_co...","TableID":108} │ ├── MakePublicColumnNotNullValidated {"ColumnID":1,"TableID":108} @@ -155,6 +154,7 @@ Schema change plan for DROP TABLE ‹multi_region_test_db›.‹public›.‹tab │ ├── RemoveColumnNotNull {"ColumnID":2,"TableID":108} │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":4294967295,"TableID":108} │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":4294967294,"TableID":108} + │ ├── AssertColumnFamilyIsRemoved {"TableID":108} │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":1,"TableID":108} │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":2,"TableID":108} │ ├── MakeDeleteOnlyColumnAbsent {"ColumnID":4294967295,"TableID":108} diff --git a/pkg/ccl/schemachangerccl/testdata/explain/drop_table_multiregion_primary_region b/pkg/ccl/schemachangerccl/testdata/explain/drop_table_multiregion_primary_region index 72243ccf86c9..082fe55545c6 100644 --- a/pkg/ccl/schemachangerccl/testdata/explain/drop_table_multiregion_primary_region +++ b/pkg/ccl/schemachangerccl/testdata/explain/drop_table_multiregion_primary_region @@ -35,7 +35,6 @@ Schema change plan for DROP TABLE ‹multi_region_test_db›.‹public›.‹tab │ ├── MarkDescriptorAsDropped {"DescriptorID":108} │ ├── RemoveObjectParent {"ObjectID":108,"ParentSchemaID":105} │ ├── RemoveBackReferenceInTypes {"BackReferencedDescriptorID":108} - │ ├── NotImplementedForPublicObjects {"DescID":108,"ElementType":"scpb.ColumnFamil..."} │ ├── MakePublicColumnWriteOnly {"ColumnID":1,"TableID":108} │ ├── SetColumnName {"ColumnID":1,"Name":"crdb_internal_co...","TableID":108} │ ├── MakePublicColumnNotNullValidated {"ColumnID":1,"TableID":108} @@ -48,7 +47,8 @@ Schema change plan for DROP TABLE ‹multi_region_test_db›.‹public›.‹tab │ ├── DrainDescriptorName {"Namespace":{"DatabaseID":104,"DescriptorID":108,"Name":"table_regional_b...","SchemaID":105}} │ ├── NotImplementedForPublicObjects {"DescID":108,"ElementType":"scpb.Owner"} │ ├── RemoveUserPrivileges {"DescriptorID":108,"User":"admin"} - │ └── RemoveUserPrivileges {"DescriptorID":108,"User":"root"} + │ ├── RemoveUserPrivileges {"DescriptorID":108,"User":"root"} + │ └── AssertColumnFamilyIsRemoved {"TableID":108} ├── PreCommitPhase │ ├── Stage 1 of 2 in PreCommitPhase │ │ ├── 20 elements transitioning toward ABSENT @@ -101,7 +101,6 @@ Schema change plan for DROP TABLE ‹multi_region_test_db›.‹public›.‹tab │ ├── MarkDescriptorAsDropped {"DescriptorID":108} │ ├── RemoveObjectParent {"ObjectID":108,"ParentSchemaID":105} │ ├── RemoveBackReferenceInTypes {"BackReferencedDescriptorID":108} - │ ├── NotImplementedForPublicObjects {"DescID":108,"ElementType":"scpb.ColumnFamil..."} │ ├── MakePublicColumnWriteOnly {"ColumnID":1,"TableID":108} │ ├── SetColumnName {"ColumnID":1,"Name":"crdb_internal_co...","TableID":108} │ ├── MakePublicColumnNotNullValidated {"ColumnID":1,"TableID":108} @@ -115,6 +114,7 @@ Schema change plan for DROP TABLE ‹multi_region_test_db›.‹public›.‹tab │ ├── NotImplementedForPublicObjects {"DescID":108,"ElementType":"scpb.Owner"} │ ├── RemoveUserPrivileges {"DescriptorID":108,"User":"admin"} │ ├── RemoveUserPrivileges {"DescriptorID":108,"User":"root"} + │ ├── AssertColumnFamilyIsRemoved {"TableID":108} │ ├── RemoveColumnNotNull {"ColumnID":1,"TableID":108} │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":4294967295,"TableID":108} │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":4294967294,"TableID":108} diff --git a/pkg/ccl/schemachangerccl/testdata/explain_verbose/drop_database_multiregion_primary_region b/pkg/ccl/schemachangerccl/testdata/explain_verbose/drop_database_multiregion_primary_region index 253301e0f1bc..872e05b70737 100644 --- a/pkg/ccl/schemachangerccl/testdata/explain_verbose/drop_database_multiregion_primary_region +++ b/pkg/ccl/schemachangerccl/testdata/explain_verbose/drop_database_multiregion_primary_region @@ -271,8 +271,17 @@ EXPLAIN (ddl, verbose) DROP DATABASE multi_region_test_db CASCADE; │ │ ├── • ColumnFamily:{DescID: 108, Name: primary, ColumnFamilyID: 0} │ │ │ │ PUBLIC → ABSENT │ │ │ │ -│ │ │ └── • Precedence dependency from DROPPED Table:{DescID: 108} -│ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ ├── • Precedence dependency from DROPPED Table:{DescID: 108} +│ │ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 1} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967295} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ └── • Precedence dependency from ABSENT ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967294} +│ │ │ rule: "column type removed before column family" │ │ │ │ │ ├── • Column:{DescID: 108, ColumnID: 1} │ │ │ │ PUBLIC → WRITE_ONLY @@ -407,10 +416,6 @@ EXPLAIN (ddl, verbose) DROP DATABASE multi_region_test_db CASCADE; │ │ TypeIDs: │ │ - 106 │ │ -│ ├── • NotImplementedForPublicObjects -│ │ DescID: 108 -│ │ ElementType: scpb.ColumnFamily -│ │ │ ├── • MakePublicColumnWriteOnly │ │ ColumnID: 1 │ │ TableID: 108 @@ -503,6 +508,9 @@ EXPLAIN (ddl, verbose) DROP DATABASE multi_region_test_db CASCADE; │ │ DescriptorID: 108 │ │ User: root │ │ +│ ├── • AssertColumnFamilyIsRemoved +│ │ TableID: 108 +│ │ │ ├── • MarkDescriptorAsDropped │ │ DescriptorID: 104 │ │ @@ -997,8 +1005,17 @@ EXPLAIN (ddl, verbose) DROP DATABASE multi_region_test_db CASCADE; │ │ ├── • ColumnFamily:{DescID: 108, Name: primary, ColumnFamilyID: 0} │ │ │ │ PUBLIC → ABSENT │ │ │ │ -│ │ │ └── • Precedence dependency from DROPPED Table:{DescID: 108} -│ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ ├── • Precedence dependency from DROPPED Table:{DescID: 108} +│ │ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 1} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967295} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ └── • Precedence dependency from ABSENT ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967294} +│ │ │ rule: "column type removed before column family" │ │ │ │ │ ├── • Column:{DescID: 108, ColumnID: 1} │ │ │ │ PUBLIC → ABSENT @@ -1181,10 +1198,6 @@ EXPLAIN (ddl, verbose) DROP DATABASE multi_region_test_db CASCADE; │ │ TypeIDs: │ │ - 106 │ │ -│ ├── • NotImplementedForPublicObjects -│ │ DescID: 108 -│ │ ElementType: scpb.ColumnFamily -│ │ │ ├── • MakePublicColumnWriteOnly │ │ ColumnID: 1 │ │ TableID: 108 @@ -1277,6 +1290,9 @@ EXPLAIN (ddl, verbose) DROP DATABASE multi_region_test_db CASCADE; │ │ DescriptorID: 108 │ │ User: root │ │ +│ ├── • AssertColumnFamilyIsRemoved +│ │ TableID: 108 +│ │ │ ├── • RemoveColumnNotNull │ │ ColumnID: 1 │ │ TableID: 108 diff --git a/pkg/ccl/schemachangerccl/testdata/explain_verbose/drop_table_multiregion b/pkg/ccl/schemachangerccl/testdata/explain_verbose/drop_table_multiregion index 7fb4e8ad4765..cf68b26eac69 100644 --- a/pkg/ccl/schemachangerccl/testdata/explain_verbose/drop_table_multiregion +++ b/pkg/ccl/schemachangerccl/testdata/explain_verbose/drop_table_multiregion @@ -64,8 +64,20 @@ EXPLAIN (ddl, verbose) DROP TABLE multi_region_test_db.public.table_regional_by_ │ │ ├── • ColumnFamily:{DescID: 108, Name: primary, ColumnFamilyID: 0} │ │ │ │ PUBLIC → ABSENT │ │ │ │ -│ │ │ └── • Precedence dependency from DROPPED Table:{DescID: 108} -│ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ ├── • Precedence dependency from DROPPED Table:{DescID: 108} +│ │ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 1} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 108, ReferencedTypeIDs: [106 107], ColumnFamilyID: 0, ColumnID: 2} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967295} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ └── • Precedence dependency from ABSENT ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967294} +│ │ │ rule: "column type removed before column family" │ │ │ │ │ ├── • Column:{DescID: 108, ColumnID: 1} │ │ │ │ PUBLIC → WRITE_ONLY @@ -224,10 +236,6 @@ EXPLAIN (ddl, verbose) DROP TABLE multi_region_test_db.public.table_regional_by_ │ │ DescID: 108 │ │ ElementType: scpb.TablePartitioning │ │ -│ ├── • NotImplementedForPublicObjects -│ │ DescID: 108 -│ │ ElementType: scpb.ColumnFamily -│ │ │ ├── • MakePublicColumnWriteOnly │ │ ColumnID: 1 │ │ TableID: 108 @@ -314,11 +322,14 @@ EXPLAIN (ddl, verbose) DROP TABLE multi_region_test_db.public.table_regional_by_ │ │ ColumnID: 2 │ │ TableID: 108 │ │ -│ └── • UpdateTableBackReferencesInTypes -│ BackReferencedTableID: 108 -│ TypeIDs: -│ - 106 -│ - 107 +│ ├── • UpdateTableBackReferencesInTypes +│ │ BackReferencedTableID: 108 +│ │ TypeIDs: +│ │ - 106 +│ │ - 107 +│ │ +│ └── • AssertColumnFamilyIsRemoved +│ TableID: 108 │ ├── • PreCommitPhase │ │ @@ -465,8 +476,20 @@ EXPLAIN (ddl, verbose) DROP TABLE multi_region_test_db.public.table_regional_by_ │ │ ├── • ColumnFamily:{DescID: 108, Name: primary, ColumnFamilyID: 0} │ │ │ │ PUBLIC → ABSENT │ │ │ │ -│ │ │ └── • Precedence dependency from DROPPED Table:{DescID: 108} -│ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ ├── • Precedence dependency from DROPPED Table:{DescID: 108} +│ │ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 1} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 108, ReferencedTypeIDs: [106 107], ColumnFamilyID: 0, ColumnID: 2} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967295} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ └── • Precedence dependency from ABSENT ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967294} +│ │ │ rule: "column type removed before column family" │ │ │ │ │ ├── • Column:{DescID: 108, ColumnID: 1} │ │ │ │ PUBLIC → ABSENT @@ -712,10 +735,6 @@ EXPLAIN (ddl, verbose) DROP TABLE multi_region_test_db.public.table_regional_by_ │ │ DescID: 108 │ │ ElementType: scpb.TablePartitioning │ │ -│ ├── • NotImplementedForPublicObjects -│ │ DescID: 108 -│ │ ElementType: scpb.ColumnFamily -│ │ │ ├── • MakePublicColumnWriteOnly │ │ ColumnID: 1 │ │ TableID: 108 @@ -824,6 +843,9 @@ EXPLAIN (ddl, verbose) DROP TABLE multi_region_test_db.public.table_regional_by_ │ │ ColumnID: 4294967294 │ │ TableID: 108 │ │ +│ ├── • AssertColumnFamilyIsRemoved +│ │ TableID: 108 +│ │ │ ├── • MakeWriteOnlyColumnDeleteOnly │ │ ColumnID: 1 │ │ TableID: 108 diff --git a/pkg/ccl/schemachangerccl/testdata/explain_verbose/drop_table_multiregion_primary_region b/pkg/ccl/schemachangerccl/testdata/explain_verbose/drop_table_multiregion_primary_region index 07f7b5005556..95131beebdcb 100644 --- a/pkg/ccl/schemachangerccl/testdata/explain_verbose/drop_table_multiregion_primary_region +++ b/pkg/ccl/schemachangerccl/testdata/explain_verbose/drop_table_multiregion_primary_region @@ -58,8 +58,17 @@ EXPLAIN (ddl, verbose) DROP TABLE multi_region_test_db.public.table_regional_by_ │ │ ├── • ColumnFamily:{DescID: 108, Name: primary, ColumnFamilyID: 0} │ │ │ │ PUBLIC → ABSENT │ │ │ │ -│ │ │ └── • Precedence dependency from DROPPED Table:{DescID: 108} -│ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ ├── • Precedence dependency from DROPPED Table:{DescID: 108} +│ │ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 1} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967295} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ └── • Precedence dependency from ABSENT ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967294} +│ │ │ rule: "column type removed before column family" │ │ │ │ │ ├── • Column:{DescID: 108, ColumnID: 1} │ │ │ │ PUBLIC → WRITE_ONLY @@ -168,10 +177,6 @@ EXPLAIN (ddl, verbose) DROP TABLE multi_region_test_db.public.table_regional_by_ │ │ TypeIDs: │ │ - 106 │ │ -│ ├── • NotImplementedForPublicObjects -│ │ DescID: 108 -│ │ ElementType: scpb.ColumnFamily -│ │ │ ├── • MakePublicColumnWriteOnly │ │ ColumnID: 1 │ │ TableID: 108 @@ -227,9 +232,12 @@ EXPLAIN (ddl, verbose) DROP TABLE multi_region_test_db.public.table_regional_by_ │ │ DescriptorID: 108 │ │ User: admin │ │ -│ └── • RemoveUserPrivileges -│ DescriptorID: 108 -│ User: root +│ ├── • RemoveUserPrivileges +│ │ DescriptorID: 108 +│ │ User: root +│ │ +│ └── • AssertColumnFamilyIsRemoved +│ TableID: 108 │ ├── • PreCommitPhase │ │ @@ -349,8 +357,17 @@ EXPLAIN (ddl, verbose) DROP TABLE multi_region_test_db.public.table_regional_by_ │ │ ├── • ColumnFamily:{DescID: 108, Name: primary, ColumnFamilyID: 0} │ │ │ │ PUBLIC → ABSENT │ │ │ │ -│ │ │ └── • Precedence dependency from DROPPED Table:{DescID: 108} -│ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ ├── • Precedence dependency from DROPPED Table:{DescID: 108} +│ │ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 1} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967295} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ └── • Precedence dependency from ABSENT ColumnType:{DescID: 108, ColumnFamilyID: 0, ColumnID: 4294967294} +│ │ │ rule: "column type removed before column family" │ │ │ │ │ ├── • Column:{DescID: 108, ColumnID: 1} │ │ │ │ PUBLIC → ABSENT @@ -507,10 +524,6 @@ EXPLAIN (ddl, verbose) DROP TABLE multi_region_test_db.public.table_regional_by_ │ │ TypeIDs: │ │ - 106 │ │ -│ ├── • NotImplementedForPublicObjects -│ │ DescID: 108 -│ │ ElementType: scpb.ColumnFamily -│ │ │ ├── • MakePublicColumnWriteOnly │ │ ColumnID: 1 │ │ TableID: 108 @@ -570,6 +583,9 @@ EXPLAIN (ddl, verbose) DROP TABLE multi_region_test_db.public.table_regional_by_ │ │ DescriptorID: 108 │ │ User: root │ │ +│ ├── • AssertColumnFamilyIsRemoved +│ │ TableID: 108 +│ │ │ ├── • RemoveColumnNotNull │ │ ColumnID: 1 │ │ TableID: 108 diff --git a/pkg/cli/testdata/declarative-rules/deprules b/pkg/cli/testdata/declarative-rules/deprules index 08f0d741899a..ad1e793c0bdb 100644 --- a/pkg/cli/testdata/declarative-rules/deprules +++ b/pkg/cli/testdata/declarative-rules/deprules @@ -1747,6 +1747,19 @@ deprules - $column-type-Node[CurrentStatus] = ABSENT - joinTargetNode($dependent, $dependent-Target, $dependent-Node) - joinTargetNode($column-type, $column-type-Target, $column-type-Node) +- name: column type removed before column family + from: column-type-Node + kind: Precedence + to: column-family-Node + query: + - $column-type[Type] = '*scpb.ColumnType' + - $column-family[Type] = '*scpb.ColumnFamily' + - joinOnColumnFamilyID($column-type, $column-family, $table-id, $family-id) + - toAbsent($column-type-Target, $column-family-Target) + - $column-type-Node[CurrentStatus] = ABSENT + - $column-family-Node[CurrentStatus] = ABSENT + - joinTargetNode($column-type, $column-type-Target, $column-type-Node) + - joinTargetNode($column-family, $column-family-Target, $column-family-Node) - name: column type removed right before column when not dropping relation from: column-type-Node kind: SameStagePrecedence diff --git a/pkg/sql/schemachanger/scexec/scmutationexec/column.go b/pkg/sql/schemachanger/scexec/scmutationexec/column.go index d38d7b27a35c..035ea6f3ff3c 100644 --- a/pkg/sql/schemachanger/scexec/scmutationexec/column.go +++ b/pkg/sql/schemachanger/scexec/scmutationexec/column.go @@ -235,6 +235,22 @@ func (i *immediateVisitor) AddColumnFamily(ctx context.Context, op scop.AddColum return nil } +func (i *immediateVisitor) AssertColumnFamilyIsRemoved( + ctx context.Context, op scop.AssertColumnFamilyIsRemoved, +) error { + tbl, err := i.checkOutTable(ctx, op.TableID) + if err != nil || tbl.Dropped() { + return err + } + for idx := range tbl.Families { + if tbl.Families[idx].ID == op.FamilyID { + return errors.AssertionFailedf("column family was leaked during schema change %v", + tbl.Families[idx]) + } + } + return nil +} + func (i *immediateVisitor) SetColumnName(ctx context.Context, op scop.SetColumnName) error { tbl, err := i.checkOutTable(ctx, op.TableID) if err != nil || tbl.Dropped() { diff --git a/pkg/sql/schemachanger/scexec/scmutationexec/scmutationexec.go b/pkg/sql/schemachanger/scexec/scmutationexec/scmutationexec.go index 72a54b5ffcd6..b0ce655a2b55 100644 --- a/pkg/sql/schemachanger/scexec/scmutationexec/scmutationexec.go +++ b/pkg/sql/schemachanger/scexec/scmutationexec/scmutationexec.go @@ -57,9 +57,9 @@ func (i *immediateVisitor) NotImplementedForPublicObjects( ctx context.Context, op scop.NotImplementedForPublicObjects, ) error { desc := i.MaybeGetCheckedOutDescriptor(op.DescID) - if desc.Dropped() { + if desc == nil || desc.Dropped() { return nil } - return errors.AssertionFailedf("not implemented operation was hit " + - "unexpectedly, no dropped descriptor was found.") + return errors.AssertionFailedf("not implemented operation was hit "+ + "unexpectedly, no dropped descriptor was found. %v", op.ElementType) } diff --git a/pkg/sql/schemachanger/scop/immediate_mutation.go b/pkg/sql/schemachanger/scop/immediate_mutation.go index d3f6e2a73673..9f080a255f04 100644 --- a/pkg/sql/schemachanger/scop/immediate_mutation.go +++ b/pkg/sql/schemachanger/scop/immediate_mutation.go @@ -429,6 +429,16 @@ type AddColumnFamily struct { Name string } +// AssertColumnFamilyIsRemoved asserts that a column family is removed, which +// is used as a validation to make sure that the family the element reaches +// absent. The column family cleaned up with the last ColumnType element +// referencing it. +type AssertColumnFamilyIsRemoved struct { + immediateMutationOp + TableID descpb.ID + FamilyID descpb.FamilyID +} + // AddColumnDefaultExpression adds a DEFAULT expression to a column. type AddColumnDefaultExpression struct { immediateMutationOp diff --git a/pkg/sql/schemachanger/scplan/internal/opgen/opgen_column_family.go b/pkg/sql/schemachanger/scplan/internal/opgen/opgen_column_family.go index 389a0ffe28ec..08024eddfd93 100644 --- a/pkg/sql/schemachanger/scplan/internal/opgen/opgen_column_family.go +++ b/pkg/sql/schemachanger/scplan/internal/opgen/opgen_column_family.go @@ -11,6 +11,7 @@ package opgen import ( + "github.com/cockroachdb/cockroach/pkg/clusterversion" "github.com/cockroachdb/cockroach/pkg/sql/schemachanger/scop" "github.com/cockroachdb/cockroach/pkg/sql/schemachanger/scpb" ) @@ -34,8 +35,22 @@ func init() { scpb.Status_PUBLIC, to(scpb.Status_ABSENT, revertible(false), - emit(func(this *scpb.ColumnFamily) *scop.NotImplementedForPublicObjects { - return notImplementedForPublicObjects(this) + emit(func(this *scpb.ColumnFamily, md *opGenContext) *scop.AssertColumnFamilyIsRemoved { + // Use stricter criteria on 23.1, which will guarantee that the + // column family is cleaned up first using the column type element. + // The only purpose this operation serves is to make sure that this + // when the element reaches absent the column family has actually + // been removed. This would have been done via the last column + // type element referencing it. + if md.ActiveVersion.IsActive(clusterversion.V23_1) { + return &scop.AssertColumnFamilyIsRemoved{ + TableID: this.TableID, + FamilyID: this.FamilyID, + } + } + // We would have used NotImplemented before, but that will be an + // assertion now, so just return no-ops. + return nil }), ), ), diff --git a/pkg/sql/schemachanger/scplan/internal/rules/current/dep_drop_column.go b/pkg/sql/schemachanger/scplan/internal/rules/current/dep_drop_column.go index 8bf945c81425..2dee6e7c55fd 100644 --- a/pkg/sql/schemachanger/scplan/internal/rules/current/dep_drop_column.go +++ b/pkg/sql/schemachanger/scplan/internal/rules/current/dep_drop_column.go @@ -48,6 +48,20 @@ func init() { } }, ) + + registerDepRule( + "column type removed before column family", + scgraph.Precedence, + "column-type", "column-family", + func(from, to NodeVars) rel.Clauses { + return rel.Clauses{ + from.Type((*scpb.ColumnType)(nil)), + to.Type((*scpb.ColumnFamily)(nil)), + JoinOnColumnFamilyID(from, to, "table-id", "family-id"), + StatusesToAbsent(from, scpb.Status_ABSENT, to, scpb.Status_ABSENT), + } + }, + ) } // Special cases of the above. diff --git a/pkg/sql/schemachanger/scplan/internal/rules/current/testdata/deprules b/pkg/sql/schemachanger/scplan/internal/rules/current/testdata/deprules index 4c23e43216aa..1e4de40aafa4 100644 --- a/pkg/sql/schemachanger/scplan/internal/rules/current/testdata/deprules +++ b/pkg/sql/schemachanger/scplan/internal/rules/current/testdata/deprules @@ -1744,6 +1744,19 @@ deprules - $column-type-Node[CurrentStatus] = ABSENT - joinTargetNode($dependent, $dependent-Target, $dependent-Node) - joinTargetNode($column-type, $column-type-Target, $column-type-Node) +- name: column type removed before column family + from: column-type-Node + kind: Precedence + to: column-family-Node + query: + - $column-type[Type] = '*scpb.ColumnType' + - $column-family[Type] = '*scpb.ColumnFamily' + - joinOnColumnFamilyID($column-type, $column-family, $table-id, $family-id) + - toAbsent($column-type-Target, $column-family-Target) + - $column-type-Node[CurrentStatus] = ABSENT + - $column-family-Node[CurrentStatus] = ABSENT + - joinTargetNode($column-type, $column-type-Target, $column-type-Node) + - joinTargetNode($column-family, $column-family-Target, $column-family-Node) - name: column type removed right before column when not dropping relation from: column-type-Node kind: SameStagePrecedence @@ -5092,6 +5105,19 @@ deprules - $column-type-Node[CurrentStatus] = ABSENT - joinTargetNode($dependent, $dependent-Target, $dependent-Node) - joinTargetNode($column-type, $column-type-Target, $column-type-Node) +- name: column type removed before column family + from: column-type-Node + kind: Precedence + to: column-family-Node + query: + - $column-type[Type] = '*scpb.ColumnType' + - $column-family[Type] = '*scpb.ColumnFamily' + - joinOnColumnFamilyID($column-type, $column-family, $table-id, $family-id) + - toAbsent($column-type-Target, $column-family-Target) + - $column-type-Node[CurrentStatus] = ABSENT + - $column-family-Node[CurrentStatus] = ABSENT + - joinTargetNode($column-type, $column-type-Target, $column-type-Node) + - joinTargetNode($column-family, $column-family-Target, $column-family-Node) - name: column type removed right before column when not dropping relation from: column-type-Node kind: SameStagePrecedence diff --git a/pkg/sql/schemachanger/scplan/internal/rules/current/testdata/oprules b/pkg/sql/schemachanger/scplan/internal/rules/current/testdata/oprules index 7d714a421ac0..23c3d5227f23 100644 --- a/pkg/sql/schemachanger/scplan/internal/rules/current/testdata/oprules +++ b/pkg/sql/schemachanger/scplan/internal/rules/current/testdata/oprules @@ -18,6 +18,10 @@ descriptorIsNotBeingDropped-23.1($element): - joinTarget($descriptor, $descriptor-Target) - joinOnDescID($descriptor, $element, $id) - $descriptor-Target[TargetStatus] = ABSENT +joinOnColumnFamilyID($a, $b, $desc-id, $family-id): + - joinOnDescID($a, $b, $desc-id) + - $a[ColumnFamilyID] = $family-id + - $b[ColumnFamilyID] = $family-id joinOnColumnID($a, $b, $desc-id, $col-id): - joinOnDescID($a, $b, $desc-id) - $a[ColumnID] = $col-id diff --git a/pkg/sql/schemachanger/scplan/internal/rules/helpers.go b/pkg/sql/schemachanger/scplan/internal/rules/helpers.go index ef2a9591f259..65959d84dc66 100644 --- a/pkg/sql/schemachanger/scplan/internal/rules/helpers.go +++ b/pkg/sql/schemachanger/scplan/internal/rules/helpers.go @@ -111,6 +111,11 @@ func JoinOnColumnID(a, b NodeVars, relationIDVar, columnIDVar rel.Var) rel.Claus return joinOnColumnIDUntyped(a.El, b.El, relationIDVar, columnIDVar) } +// JoinOnColumnFamilyID joins elements on column ID. +func JoinOnColumnFamilyID(a, b NodeVars, relationIDVar, columnFamilyIDVar rel.Var) rel.Clause { + return joinOnColumnFamilyIDUntyped(a.El, b.El, relationIDVar, columnFamilyIDVar) +} + // JoinOnIndexID joins elements on index ID. func JoinOnIndexID(a, b NodeVars, relationIDVar, indexIDVar rel.Var) rel.Clause { return joinOnIndexIDUntyped(a.El, b.El, relationIDVar, indexIDVar) @@ -206,6 +211,16 @@ var ( } }, ) + joinOnColumnFamilyIDUntyped = screl.Schema.Def4( + "joinOnColumnFamilyID", "a", "b", "desc-id", "family-id", func( + a, b, descID, familyID rel.Var, + ) rel.Clauses { + return rel.Clauses{ + JoinOnDescIDUntyped(a, b, descID), + familyID.Entities(screl.ColumnFamilyID, a, b), + } + }, + ) joinOnConstraintIDUntyped = screl.Schema.Def4( "joinOnConstraintID", "a", "b", "desc-id", "constraint-id", func( a, b, descID, constraintID rel.Var, diff --git a/pkg/sql/schemachanger/scplan/internal/rules/release_22_2/testdata/deprules b/pkg/sql/schemachanger/scplan/internal/rules/release_22_2/testdata/deprules index a1cbe0142b2e..0692d61fdb5e 100644 --- a/pkg/sql/schemachanger/scplan/internal/rules/release_22_2/testdata/deprules +++ b/pkg/sql/schemachanger/scplan/internal/rules/release_22_2/testdata/deprules @@ -25,6 +25,10 @@ fromHasPublicStatusIfFromIsTableAndToIsRowLevelTTL($fromTarget, $fromEl, $toEl): - $n[Type] = '*screl.Node' - $n[Target] = $fromTarget - nodeHasNoPublicStatus($n) +joinOnColumnFamilyID($a, $b, $desc-id, $family-id): + - joinOnDescID($a, $b, $desc-id) + - $a[ColumnFamilyID] = $family-id + - $b[ColumnFamilyID] = $family-id joinOnColumnID($a, $b, $desc-id, $col-id): - joinOnDescID($a, $b, $desc-id) - $a[ColumnID] = $col-id diff --git a/pkg/sql/schemachanger/scplan/internal/rules/release_22_2/testdata/oprules b/pkg/sql/schemachanger/scplan/internal/rules/release_22_2/testdata/oprules index 9a2331cd6e52..b07d54c683f5 100644 --- a/pkg/sql/schemachanger/scplan/internal/rules/release_22_2/testdata/oprules +++ b/pkg/sql/schemachanger/scplan/internal/rules/release_22_2/testdata/oprules @@ -25,6 +25,10 @@ fromHasPublicStatusIfFromIsTableAndToIsRowLevelTTL($fromTarget, $fromEl, $toEl): - $n[Type] = '*screl.Node' - $n[Target] = $fromTarget - nodeHasNoPublicStatus($n) +joinOnColumnFamilyID($a, $b, $desc-id, $family-id): + - joinOnDescID($a, $b, $desc-id) + - $a[ColumnFamilyID] = $family-id + - $b[ColumnFamilyID] = $family-id joinOnColumnID($a, $b, $desc-id, $col-id): - joinOnDescID($a, $b, $desc-id) - $a[ColumnID] = $col-id diff --git a/pkg/sql/schemachanger/scplan/testdata/drop_database b/pkg/sql/schemachanger/scplan/testdata/drop_database index f996f84899a8..431e8e464f49 100644 --- a/pkg/sql/schemachanger/scplan/testdata/drop_database +++ b/pkg/sql/schemachanger/scplan/testdata/drop_database @@ -224,9 +224,6 @@ StatementPhase stage 1 of 1 with 169 MutationType ops *scop.RemoveObjectParent ObjectID: 110 ParentSchemaID: 105 - *scop.NotImplementedForPublicObjects - DescID: 110 - ElementType: scpb.ColumnFamily *scop.MakePublicColumnWriteOnly ColumnID: 1 TableID: 110 @@ -292,9 +289,6 @@ StatementPhase stage 1 of 1 with 169 MutationType ops ParentSchemaID: 106 *scop.RemoveTableComment TableID: 109 - *scop.NotImplementedForPublicObjects - DescID: 109 - ElementType: scpb.ColumnFamily *scop.MakePublicColumnWriteOnly ColumnID: 1 TableID: 109 @@ -718,6 +712,8 @@ StatementPhase stage 1 of 1 with 169 MutationType ops DescriptorID: 110 Name: t1 SchemaID: 105 + *scop.AssertColumnFamilyIsRemoved + TableID: 110 *scop.DrainDescriptorName Namespace: DatabaseID: 104 @@ -730,6 +726,8 @@ StatementPhase stage 1 of 1 with 169 MutationType ops DescriptorID: 109 Name: t1 SchemaID: 106 + *scop.AssertColumnFamilyIsRemoved + TableID: 109 *scop.DrainDescriptorName Namespace: DatabaseID: 104 @@ -1196,9 +1194,6 @@ PreCommitPhase stage 2 of 2 with 257 MutationType ops *scop.RemoveObjectParent ObjectID: 110 ParentSchemaID: 105 - *scop.NotImplementedForPublicObjects - DescID: 110 - ElementType: scpb.ColumnFamily *scop.MakePublicColumnWriteOnly ColumnID: 1 TableID: 110 @@ -1264,9 +1259,6 @@ PreCommitPhase stage 2 of 2 with 257 MutationType ops ParentSchemaID: 106 *scop.RemoveTableComment TableID: 109 - *scop.NotImplementedForPublicObjects - DescID: 109 - ElementType: scpb.ColumnFamily *scop.MakePublicColumnWriteOnly ColumnID: 1 TableID: 109 @@ -1782,6 +1774,8 @@ PreCommitPhase stage 2 of 2 with 257 MutationType ops DescriptorID: 110 Name: t1 SchemaID: 105 + *scop.AssertColumnFamilyIsRemoved + TableID: 110 *scop.MakeWriteOnlyColumnDeleteOnly ColumnID: 1 TableID: 110 @@ -1806,6 +1800,8 @@ PreCommitPhase stage 2 of 2 with 257 MutationType ops DescriptorID: 109 Name: t1 SchemaID: 106 + *scop.AssertColumnFamilyIsRemoved + TableID: 109 *scop.MakeWriteOnlyColumnDeleteOnly ColumnID: 1 TableID: 109 @@ -2928,6 +2924,10 @@ DROP DATABASE db1 CASCADE to: [Column:{DescID: 109, ColumnID: 1}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 1}, ABSENT] + to: [ColumnFamily:{DescID: 109, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 1}, ABSENT] to: [Table:{DescID: 109}, ABSENT] kind: Precedence @@ -2936,6 +2936,10 @@ DROP DATABASE db1 CASCADE to: [Column:{DescID: 109, ColumnID: 2}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 2}, ABSENT] + to: [ColumnFamily:{DescID: 109, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 2}, ABSENT] to: [Table:{DescID: 109}, ABSENT] kind: Precedence @@ -2944,6 +2948,10 @@ DROP DATABASE db1 CASCADE to: [Column:{DescID: 109, ColumnID: 3}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 3}, ABSENT] + to: [ColumnFamily:{DescID: 109, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 3}, ABSENT] to: [Table:{DescID: 109}, ABSENT] kind: Precedence @@ -2952,6 +2960,10 @@ DROP DATABASE db1 CASCADE to: [Column:{DescID: 109, ColumnID: 4294967294}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 4294967294}, ABSENT] + to: [ColumnFamily:{DescID: 109, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 4294967294}, ABSENT] to: [Table:{DescID: 109}, ABSENT] kind: Precedence @@ -2960,6 +2972,10 @@ DROP DATABASE db1 CASCADE to: [Column:{DescID: 109, ColumnID: 4294967295}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 4294967295}, ABSENT] + to: [ColumnFamily:{DescID: 109, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 4294967295}, ABSENT] to: [Table:{DescID: 109}, ABSENT] kind: Precedence @@ -2968,6 +2984,10 @@ DROP DATABASE db1 CASCADE to: [Column:{DescID: 110, ColumnID: 1}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 110, ColumnFamilyID: 0, ColumnID: 1}, ABSENT] + to: [ColumnFamily:{DescID: 110, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 110, ColumnFamilyID: 0, ColumnID: 1}, ABSENT] to: [Table:{DescID: 110}, ABSENT] kind: Precedence @@ -2976,6 +2996,10 @@ DROP DATABASE db1 CASCADE to: [Column:{DescID: 110, ColumnID: 2}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 110, ColumnFamilyID: 0, ColumnID: 2}, ABSENT] + to: [ColumnFamily:{DescID: 110, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 110, ColumnFamilyID: 0, ColumnID: 2}, ABSENT] to: [Table:{DescID: 110}, ABSENT] kind: Precedence @@ -2984,6 +3008,10 @@ DROP DATABASE db1 CASCADE to: [Column:{DescID: 110, ColumnID: 3}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 110, ColumnFamilyID: 0, ColumnID: 3}, ABSENT] + to: [ColumnFamily:{DescID: 110, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 110, ColumnFamilyID: 0, ColumnID: 3}, ABSENT] to: [Table:{DescID: 110}, ABSENT] kind: Precedence @@ -2992,6 +3020,10 @@ DROP DATABASE db1 CASCADE to: [Column:{DescID: 110, ColumnID: 4294967294}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 110, ColumnFamilyID: 0, ColumnID: 4294967294}, ABSENT] + to: [ColumnFamily:{DescID: 110, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 110, ColumnFamilyID: 0, ColumnID: 4294967294}, ABSENT] to: [Table:{DescID: 110}, ABSENT] kind: Precedence @@ -3000,6 +3032,10 @@ DROP DATABASE db1 CASCADE to: [Column:{DescID: 110, ColumnID: 4294967295}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 110, ColumnFamilyID: 0, ColumnID: 4294967295}, ABSENT] + to: [ColumnFamily:{DescID: 110, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 110, ColumnFamilyID: 0, ColumnID: 4294967295}, ABSENT] to: [Table:{DescID: 110}, ABSENT] kind: Precedence diff --git a/pkg/sql/schemachanger/scplan/testdata/drop_index b/pkg/sql/schemachanger/scplan/testdata/drop_index index cfb29f080268..4e3cbc3c2003 100644 --- a/pkg/sql/schemachanger/scplan/testdata/drop_index +++ b/pkg/sql/schemachanger/scplan/testdata/drop_index @@ -1172,9 +1172,6 @@ StatementPhase stage 1 of 1 with 21 MutationType ops *scop.RemoveObjectParent ObjectID: 107 ParentSchemaID: 101 - *scop.NotImplementedForPublicObjects - DescID: 107 - ElementType: scpb.ColumnFamily *scop.MakePublicColumnWriteOnly ColumnID: 1 TableID: 107 @@ -1234,6 +1231,8 @@ StatementPhase stage 1 of 1 with 21 MutationType ops *scop.RemoveUserPrivileges DescriptorID: 107 User: root + *scop.AssertColumnFamilyIsRemoved + TableID: 107 PreCommitPhase stage 1 of 2 with 1 MutationType op transitions: [[SecondaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 0}, ABSENT], VALIDATED] -> PUBLIC @@ -1301,9 +1300,6 @@ PreCommitPhase stage 2 of 2 with 37 MutationType ops *scop.RemoveObjectParent ObjectID: 107 ParentSchemaID: 101 - *scop.NotImplementedForPublicObjects - DescID: 107 - ElementType: scpb.ColumnFamily *scop.MakePublicColumnWriteOnly ColumnID: 1 TableID: 107 @@ -1375,6 +1371,8 @@ PreCommitPhase stage 2 of 2 with 37 MutationType ops *scop.MakeWriteOnlyColumnDeleteOnly ColumnID: 4294967294 TableID: 107 + *scop.AssertColumnFamilyIsRemoved + TableID: 107 *scop.MakeWriteOnlyColumnDeleteOnly ColumnID: 2 TableID: 107 diff --git a/pkg/sql/schemachanger/scplan/testdata/drop_owned_by b/pkg/sql/schemachanger/scplan/testdata/drop_owned_by index 710344d683ba..8e387dc60574 100644 --- a/pkg/sql/schemachanger/scplan/testdata/drop_owned_by +++ b/pkg/sql/schemachanger/scplan/testdata/drop_owned_by @@ -156,9 +156,6 @@ StatementPhase stage 1 of 1 with 108 MutationType ops *scop.RemoveObjectParent ObjectID: 109 ParentSchemaID: 101 - *scop.NotImplementedForPublicObjects - DescID: 109 - ElementType: scpb.ColumnFamily *scop.MakePublicColumnWriteOnly ColumnID: 1 TableID: 109 @@ -222,9 +219,6 @@ StatementPhase stage 1 of 1 with 108 MutationType ops *scop.RemoveObjectParent ObjectID: 108 ParentSchemaID: 105 - *scop.NotImplementedForPublicObjects - DescID: 108 - ElementType: scpb.ColumnFamily *scop.MakePublicColumnWriteOnly ColumnID: 1 TableID: 108 @@ -509,6 +503,10 @@ StatementPhase stage 1 of 1 with 108 MutationType ops *scop.RemoveUserPrivileges DescriptorID: 105 User: root + *scop.AssertColumnFamilyIsRemoved + TableID: 109 + *scop.AssertColumnFamilyIsRemoved + TableID: 108 PreCommitPhase stage 1 of 2 with 1 MutationType op transitions: [[UserPrivileges:{DescID: 100, Name: r}, ABSENT], ABSENT] -> PUBLIC @@ -779,9 +777,6 @@ PreCommitPhase stage 2 of 2 with 166 MutationType ops *scop.RemoveObjectParent ObjectID: 109 ParentSchemaID: 101 - *scop.NotImplementedForPublicObjects - DescID: 109 - ElementType: scpb.ColumnFamily *scop.MakePublicColumnWriteOnly ColumnID: 1 TableID: 109 @@ -845,9 +840,6 @@ PreCommitPhase stage 2 of 2 with 166 MutationType ops *scop.RemoveObjectParent ObjectID: 108 ParentSchemaID: 105 - *scop.NotImplementedForPublicObjects - DescID: 108 - ElementType: scpb.ColumnFamily *scop.MakePublicColumnWriteOnly ColumnID: 1 TableID: 108 @@ -1183,6 +1175,8 @@ PreCommitPhase stage 2 of 2 with 166 MutationType ops *scop.RemoveUserPrivileges DescriptorID: 105 User: root + *scop.AssertColumnFamilyIsRemoved + TableID: 109 *scop.MakeWriteOnlyColumnDeleteOnly ColumnID: 1 TableID: 109 @@ -1195,6 +1189,8 @@ PreCommitPhase stage 2 of 2 with 166 MutationType ops *scop.MakeWriteOnlyIndexDeleteOnly IndexID: 1 TableID: 109 + *scop.AssertColumnFamilyIsRemoved + TableID: 108 *scop.MakeWriteOnlyColumnDeleteOnly ColumnID: 1 TableID: 108 diff --git a/pkg/sql/schemachanger/scplan/testdata/drop_schema b/pkg/sql/schemachanger/scplan/testdata/drop_schema index 0a252a26c1f7..6df235e179fb 100644 --- a/pkg/sql/schemachanger/scplan/testdata/drop_schema +++ b/pkg/sql/schemachanger/scplan/testdata/drop_schema @@ -595,6 +595,10 @@ DROP SCHEMA defaultdb.SC1 CASCADE to: [Column:{DescID: 106, ColumnID: 1}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 1}, ABSENT] + to: [ColumnFamily:{DescID: 106, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 1}, ABSENT] to: [Table:{DescID: 106}, ABSENT] kind: Precedence @@ -603,6 +607,10 @@ DROP SCHEMA defaultdb.SC1 CASCADE to: [Column:{DescID: 106, ColumnID: 2}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 2}, ABSENT] + to: [ColumnFamily:{DescID: 106, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 2}, ABSENT] to: [Table:{DescID: 106}, ABSENT] kind: Precedence @@ -611,6 +619,10 @@ DROP SCHEMA defaultdb.SC1 CASCADE to: [Column:{DescID: 106, ColumnID: 3}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3}, ABSENT] + to: [ColumnFamily:{DescID: 106, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3}, ABSENT] to: [Table:{DescID: 106}, ABSENT] kind: Precedence @@ -619,6 +631,10 @@ DROP SCHEMA defaultdb.SC1 CASCADE to: [Column:{DescID: 106, ColumnID: 4294967294}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 4294967294}, ABSENT] + to: [ColumnFamily:{DescID: 106, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 4294967294}, ABSENT] to: [Table:{DescID: 106}, ABSENT] kind: Precedence @@ -627,6 +643,10 @@ DROP SCHEMA defaultdb.SC1 CASCADE to: [Column:{DescID: 106, ColumnID: 4294967295}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 4294967295}, ABSENT] + to: [ColumnFamily:{DescID: 106, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 4294967295}, ABSENT] to: [Table:{DescID: 106}, ABSENT] kind: Precedence @@ -1859,9 +1879,6 @@ StatementPhase stage 1 of 1 with 127 MutationType ops ParentSchemaID: 104 *scop.RemoveTableComment TableID: 106 - *scop.NotImplementedForPublicObjects - DescID: 106 - ElementType: scpb.ColumnFamily *scop.MakePublicColumnWriteOnly ColumnID: 1 TableID: 106 @@ -2282,6 +2299,8 @@ StatementPhase stage 1 of 1 with 127 MutationType ops *scop.RemoveUserPrivileges DescriptorID: 104 User: root + *scop.AssertColumnFamilyIsRemoved + TableID: 106 PreCommitPhase stage 1 of 2 with 1 MutationType op transitions: [[Namespace:{DescID: 104, Name: sc1, ReferencedDescID: 100}, ABSENT], ABSENT] -> PUBLIC @@ -2595,9 +2614,6 @@ PreCommitPhase stage 2 of 2 with 195 MutationType ops ParentSchemaID: 104 *scop.RemoveTableComment TableID: 106 - *scop.NotImplementedForPublicObjects - DescID: 106 - ElementType: scpb.ColumnFamily *scop.MakePublicColumnWriteOnly ColumnID: 1 TableID: 106 @@ -3093,6 +3109,8 @@ PreCommitPhase stage 2 of 2 with 195 MutationType ops *scop.RemoveUserPrivileges DescriptorID: 104 User: root + *scop.AssertColumnFamilyIsRemoved + TableID: 106 *scop.MakeWriteOnlyColumnDeleteOnly ColumnID: 1 TableID: 106 diff --git a/pkg/sql/schemachanger/scplan/testdata/drop_table b/pkg/sql/schemachanger/scplan/testdata/drop_table index f5fa677d89b5..4997384a4447 100644 --- a/pkg/sql/schemachanger/scplan/testdata/drop_table +++ b/pkg/sql/schemachanger/scplan/testdata/drop_table @@ -397,9 +397,6 @@ PreCommitPhase stage 2 of 2 with 127 MutationType ops ParentSchemaID: 101 *scop.RemoveTableComment TableID: 109 - *scop.NotImplementedForPublicObjects - DescID: 109 - ElementType: scpb.ColumnFamily *scop.MakePublicColumnWriteOnly ColumnID: 1 TableID: 109 @@ -567,6 +564,8 @@ PreCommitPhase stage 2 of 2 with 127 MutationType ops *scop.MakeWriteOnlyColumnDeleteOnly ColumnID: 4294967294 TableID: 109 + *scop.AssertColumnFamilyIsRemoved + TableID: 109 *scop.MakeWriteOnlyColumnDeleteOnly ColumnID: 1 TableID: 109 @@ -1156,6 +1155,10 @@ DROP TABLE defaultdb.shipments CASCADE; to: [Column:{DescID: 109, ColumnID: 1}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 1}, ABSENT] + to: [ColumnFamily:{DescID: 109, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 1}, ABSENT] to: [Table:{DescID: 109}, ABSENT] kind: Precedence @@ -1164,6 +1167,10 @@ DROP TABLE defaultdb.shipments CASCADE; to: [Column:{DescID: 109, ColumnID: 2}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 2}, ABSENT] + to: [ColumnFamily:{DescID: 109, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 2}, ABSENT] to: [Table:{DescID: 109}, ABSENT] kind: Precedence @@ -1172,6 +1179,10 @@ DROP TABLE defaultdb.shipments CASCADE; to: [Column:{DescID: 109, ColumnID: 4294967294}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 4294967294}, ABSENT] + to: [ColumnFamily:{DescID: 109, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 4294967294}, ABSENT] to: [Table:{DescID: 109}, ABSENT] kind: Precedence @@ -1180,6 +1191,10 @@ DROP TABLE defaultdb.shipments CASCADE; to: [Column:{DescID: 109, ColumnID: 4294967295}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 4294967295}, ABSENT] + to: [ColumnFamily:{DescID: 109, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 4294967295}, ABSENT] to: [Table:{DescID: 109}, ABSENT] kind: Precedence @@ -1188,6 +1203,10 @@ DROP TABLE defaultdb.shipments CASCADE; to: [Column:{DescID: 109, ColumnID: 4}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 4}, ABSENT] + to: [ColumnFamily:{DescID: 109, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 4}, ABSENT] to: [Table:{DescID: 109}, ABSENT] kind: Precedence @@ -1196,6 +1215,10 @@ DROP TABLE defaultdb.shipments CASCADE; to: [Column:{DescID: 109, ColumnID: 5}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 5}, ABSENT] + to: [ColumnFamily:{DescID: 109, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 5}, ABSENT] to: [Table:{DescID: 109}, ABSENT] kind: Precedence @@ -1204,6 +1227,10 @@ DROP TABLE defaultdb.shipments CASCADE; to: [Column:{DescID: 109, ColumnID: 6}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 6}, ABSENT] + to: [ColumnFamily:{DescID: 109, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 109, ColumnFamilyID: 0, ColumnID: 6}, ABSENT] to: [Table:{DescID: 109}, ABSENT] kind: Precedence @@ -1212,6 +1239,10 @@ DROP TABLE defaultdb.shipments CASCADE; to: [Column:{DescID: 109, ColumnID: 3}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 109, ReferencedTypeIDs: [107 108], ColumnFamilyID: 0, ColumnID: 3}, ABSENT] + to: [ColumnFamily:{DescID: 109, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 109, ReferencedTypeIDs: [107 108], ColumnFamilyID: 0, ColumnID: 3}, ABSENT] to: [Table:{DescID: 109}, ABSENT] kind: Precedence @@ -2062,9 +2093,6 @@ PostCommitNonRevertiblePhase stage 1 of 2 with 47 MutationType ops *scop.RemoveObjectParent ObjectID: 104 ParentSchemaID: 101 - *scop.NotImplementedForPublicObjects - DescID: 104 - ElementType: scpb.ColumnFamily *scop.MakePublicColumnWriteOnly ColumnID: 1 TableID: 104 @@ -2121,6 +2149,8 @@ PostCommitNonRevertiblePhase stage 1 of 2 with 47 MutationType ops *scop.RemoveUserPrivileges DescriptorID: 104 User: root + *scop.AssertColumnFamilyIsRemoved + TableID: 104 *scop.RemoveColumnNotNull ColumnID: 1 TableID: 104 @@ -2353,6 +2383,10 @@ DROP TABLE defaultdb.customers CASCADE; to: [Column:{DescID: 104, ColumnID: 1}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 104, ColumnFamilyID: 0, ColumnID: 1}, ABSENT] + to: [ColumnFamily:{DescID: 104, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 104, ColumnFamilyID: 0, ColumnID: 1}, ABSENT] to: [Table:{DescID: 104}, ABSENT] kind: Precedence @@ -2361,6 +2395,10 @@ DROP TABLE defaultdb.customers CASCADE; to: [Column:{DescID: 104, ColumnID: 2}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 104, ColumnFamilyID: 0, ColumnID: 2}, ABSENT] + to: [ColumnFamily:{DescID: 104, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 104, ColumnFamilyID: 0, ColumnID: 2}, ABSENT] to: [Table:{DescID: 104}, ABSENT] kind: Precedence @@ -2369,6 +2407,10 @@ DROP TABLE defaultdb.customers CASCADE; to: [Column:{DescID: 104, ColumnID: 4294967294}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 104, ColumnFamilyID: 0, ColumnID: 4294967294}, ABSENT] + to: [ColumnFamily:{DescID: 104, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 104, ColumnFamilyID: 0, ColumnID: 4294967294}, ABSENT] to: [Table:{DescID: 104}, ABSENT] kind: Precedence @@ -2377,6 +2419,10 @@ DROP TABLE defaultdb.customers CASCADE; to: [Column:{DescID: 104, ColumnID: 4294967295}, ABSENT] kind: Precedence rule: dependents removed before column +- from: [ColumnType:{DescID: 104, ColumnFamilyID: 0, ColumnID: 4294967295}, ABSENT] + to: [ColumnFamily:{DescID: 104, Name: primary, ColumnFamilyID: 0}, ABSENT] + kind: Precedence + rule: column type removed before column family - from: [ColumnType:{DescID: 104, ColumnFamilyID: 0, ColumnID: 4294967295}, ABSENT] to: [Table:{DescID: 104}, ABSENT] kind: Precedence @@ -2766,9 +2812,6 @@ PreCommitPhase stage 2 of 2 with 59 MutationType ops *scop.RemoveObjectParent ObjectID: 115 ParentSchemaID: 101 - *scop.NotImplementedForPublicObjects - DescID: 115 - ElementType: scpb.ColumnFamily *scop.MakePublicColumnWriteOnly ColumnID: 1 TableID: 115 @@ -2869,6 +2912,8 @@ PreCommitPhase stage 2 of 2 with 59 MutationType ops *scop.MakeWriteOnlyColumnDeleteOnly ColumnID: 4294967294 TableID: 115 + *scop.AssertColumnFamilyIsRemoved + TableID: 115 *scop.MakeWriteOnlyColumnDeleteOnly ColumnID: 2 TableID: 115 diff --git a/pkg/sql/schemachanger/testdata/explain/drop_index_with_materialized_view_dep b/pkg/sql/schemachanger/testdata/explain/drop_index_with_materialized_view_dep index 6bdc68c2839d..c08ddba3ba41 100644 --- a/pkg/sql/schemachanger/testdata/explain/drop_index_with_materialized_view_dep +++ b/pkg/sql/schemachanger/testdata/explain/drop_index_with_materialized_view_dep @@ -39,7 +39,6 @@ Schema change plan for DROP INDEX ‹defaultdb›.‹public›.‹v2›@‹idx │ ├── MarkDescriptorAsDropped {"DescriptorID":106} │ ├── RemoveBackReferencesInRelations {"BackReferencedID":106} │ ├── RemoveObjectParent {"ObjectID":106,"ParentSchemaID":101} - │ ├── NotImplementedForPublicObjects {"DescID":106,"ElementType":"scpb.ColumnFamil..."} │ ├── MakePublicColumnWriteOnly {"ColumnID":1,"TableID":106} │ ├── SetColumnName {"ColumnID":1,"Name":"crdb_internal_co...","TableID":106} │ ├── MakePublicColumnWriteOnly {"ColumnID":2,"TableID":106} @@ -56,7 +55,8 @@ Schema change plan for DROP INDEX ‹defaultdb›.‹public›.‹v2›@‹idx │ ├── DrainDescriptorName {"Namespace":{"DatabaseID":100,"DescriptorID":106,"Name":"v3","SchemaID":101}} │ ├── NotImplementedForPublicObjects {"DescID":106,"ElementType":"scpb.Owner"} │ ├── RemoveUserPrivileges {"DescriptorID":106,"User":"admin"} - │ └── RemoveUserPrivileges {"DescriptorID":106,"User":"root"} + │ ├── RemoveUserPrivileges {"DescriptorID":106,"User":"root"} + │ └── AssertColumnFamilyIsRemoved {"TableID":106} ├── PreCommitPhase │ ├── Stage 1 of 2 in PreCommitPhase │ │ ├── 24 elements transitioning toward ABSENT @@ -118,7 +118,6 @@ Schema change plan for DROP INDEX ‹defaultdb›.‹public›.‹v2›@‹idx │ ├── MarkDescriptorAsDropped {"DescriptorID":106} │ ├── RemoveBackReferencesInRelations {"BackReferencedID":106} │ ├── RemoveObjectParent {"ObjectID":106,"ParentSchemaID":101} - │ ├── NotImplementedForPublicObjects {"DescID":106,"ElementType":"scpb.ColumnFamil..."} │ ├── MakePublicColumnWriteOnly {"ColumnID":1,"TableID":106} │ ├── SetColumnName {"ColumnID":1,"Name":"crdb_internal_co...","TableID":106} │ ├── MakePublicColumnWriteOnly {"ColumnID":2,"TableID":106} @@ -140,6 +139,7 @@ Schema change plan for DROP INDEX ‹defaultdb›.‹public›.‹v2›@‹idx │ ├── RemoveColumnNotNull {"ColumnID":2,"TableID":106} │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":4294967295,"TableID":106} │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":4294967294,"TableID":106} + │ ├── AssertColumnFamilyIsRemoved {"TableID":106} │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":2,"TableID":106} │ ├── MakeDeleteOnlyColumnAbsent {"ColumnID":4294967295,"TableID":106} │ ├── MakeDeleteOnlyColumnAbsent {"ColumnID":4294967294,"TableID":106} diff --git a/pkg/sql/schemachanger/testdata/explain/drop_table b/pkg/sql/schemachanger/testdata/explain/drop_table index 719e93d9a2d4..bfdaa0586009 100644 --- a/pkg/sql/schemachanger/testdata/explain/drop_table +++ b/pkg/sql/schemachanger/testdata/explain/drop_table @@ -43,7 +43,6 @@ Schema change plan for DROP TABLE ‹db›.‹sc›.‹t›; │ ├── MarkDescriptorAsDropped {"DescriptorID":107} │ ├── RemoveObjectParent {"ObjectID":107,"ParentSchemaID":106} │ ├── RemoveTableComment {"TableID":107} - │ ├── NotImplementedForPublicObjects {"DescID":107,"ElementType":"scpb.ColumnFamil..."} │ ├── MakePublicColumnWriteOnly {"ColumnID":1,"TableID":107} │ ├── SetColumnName {"ColumnID":1,"Name":"crdb_internal_co...","TableID":107} │ ├── MakePublicColumnWriteOnly {"ColumnID":2,"TableID":107} @@ -61,7 +60,8 @@ Schema change plan for DROP TABLE ‹db›.‹sc›.‹t›; │ ├── DrainDescriptorName {"Namespace":{"DatabaseID":104,"DescriptorID":107,"Name":"t","SchemaID":106}} │ ├── NotImplementedForPublicObjects {"DescID":107,"ElementType":"scpb.Owner"} │ ├── RemoveUserPrivileges {"DescriptorID":107,"User":"admin"} - │ └── RemoveUserPrivileges {"DescriptorID":107,"User":"root"} + │ ├── RemoveUserPrivileges {"DescriptorID":107,"User":"root"} + │ └── AssertColumnFamilyIsRemoved {"TableID":107} ├── PreCommitPhase │ ├── Stage 1 of 2 in PreCommitPhase │ │ ├── 27 elements transitioning toward ABSENT @@ -130,7 +130,6 @@ Schema change plan for DROP TABLE ‹db›.‹sc›.‹t›; │ ├── MarkDescriptorAsDropped {"DescriptorID":107} │ ├── RemoveObjectParent {"ObjectID":107,"ParentSchemaID":106} │ ├── RemoveTableComment {"TableID":107} - │ ├── NotImplementedForPublicObjects {"DescID":107,"ElementType":"scpb.ColumnFamil..."} │ ├── MakePublicColumnWriteOnly {"ColumnID":1,"TableID":107} │ ├── SetColumnName {"ColumnID":1,"Name":"crdb_internal_co...","TableID":107} │ ├── MakePublicColumnWriteOnly {"ColumnID":2,"TableID":107} @@ -154,6 +153,7 @@ Schema change plan for DROP TABLE ‹db›.‹sc›.‹t›; │ ├── RemoveColumnNotNull {"ColumnID":3,"TableID":107} │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":4294967295,"TableID":107} │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":4294967294,"TableID":107} + │ ├── AssertColumnFamilyIsRemoved {"TableID":107} │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":3,"TableID":107} │ ├── MakeDeleteOnlyColumnAbsent {"ColumnID":4294967295,"TableID":107} │ ├── MakeDeleteOnlyColumnAbsent {"ColumnID":4294967294,"TableID":107} diff --git a/pkg/sql/schemachanger/testdata/explain/drop_table_udf_default b/pkg/sql/schemachanger/testdata/explain/drop_table_udf_default index 1e4f7ec849b3..0b93e4b9d214 100644 --- a/pkg/sql/schemachanger/testdata/explain/drop_table_udf_default +++ b/pkg/sql/schemachanger/testdata/explain/drop_table_udf_default @@ -35,7 +35,6 @@ Schema change plan for DROP TABLE ‹defaultdb›.‹public›.‹t›; │ └── 20 Mutation operations │ ├── MarkDescriptorAsDropped {"DescriptorID":105} │ ├── RemoveObjectParent {"ObjectID":105,"ParentSchemaID":101} - │ ├── NotImplementedForPublicObjects {"DescID":105,"ElementType":"scpb.ColumnFamil..."} │ ├── MakePublicColumnWriteOnly {"ColumnID":1,"TableID":105} │ ├── SetColumnName {"ColumnID":1,"Name":"crdb_internal_co...","TableID":105} │ ├── MakePublicColumnNotNullValidated {"ColumnID":1,"TableID":105} @@ -52,7 +51,8 @@ Schema change plan for DROP TABLE ‹defaultdb›.‹public›.‹t›; │ ├── DrainDescriptorName {"Namespace":{"DatabaseID":100,"DescriptorID":105,"Name":"t","SchemaID":101}} │ ├── NotImplementedForPublicObjects {"DescID":105,"ElementType":"scpb.Owner"} │ ├── RemoveUserPrivileges {"DescriptorID":105,"User":"admin"} - │ └── RemoveUserPrivileges {"DescriptorID":105,"User":"root"} + │ ├── RemoveUserPrivileges {"DescriptorID":105,"User":"root"} + │ └── AssertColumnFamilyIsRemoved {"TableID":105} ├── PreCommitPhase │ ├── Stage 1 of 2 in PreCommitPhase │ │ ├── 23 elements transitioning toward ABSENT @@ -111,7 +111,6 @@ Schema change plan for DROP TABLE ‹defaultdb›.‹public›.‹t›; │ └── 36 Mutation operations │ ├── MarkDescriptorAsDropped {"DescriptorID":105} │ ├── RemoveObjectParent {"ObjectID":105,"ParentSchemaID":101} - │ ├── NotImplementedForPublicObjects {"DescID":105,"ElementType":"scpb.ColumnFamil..."} │ ├── MakePublicColumnWriteOnly {"ColumnID":1,"TableID":105} │ ├── SetColumnName {"ColumnID":1,"Name":"crdb_internal_co...","TableID":105} │ ├── MakePublicColumnNotNullValidated {"ColumnID":1,"TableID":105} @@ -133,6 +132,7 @@ Schema change plan for DROP TABLE ‹defaultdb›.‹public›.‹t›; │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":2,"TableID":105} │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":4294967295,"TableID":105} │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":4294967294,"TableID":105} + │ ├── AssertColumnFamilyIsRemoved {"TableID":105} │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":1,"TableID":105} │ ├── MakeDeleteOnlyColumnAbsent {"ColumnID":4294967295,"TableID":105} │ ├── MakeDeleteOnlyColumnAbsent {"ColumnID":4294967294,"TableID":105} diff --git a/pkg/sql/schemachanger/testdata/explain_verbose/drop_index_with_materialized_view_dep b/pkg/sql/schemachanger/testdata/explain_verbose/drop_index_with_materialized_view_dep index cba348e7102d..39147d2f38cd 100644 --- a/pkg/sql/schemachanger/testdata/explain_verbose/drop_index_with_materialized_view_dep +++ b/pkg/sql/schemachanger/testdata/explain_verbose/drop_index_with_materialized_view_dep @@ -61,8 +61,20 @@ EXPLAIN (ddl, verbose) DROP INDEX idx CASCADE; │ │ ├── • ColumnFamily:{DescID: 106, Name: primary, ColumnFamilyID: 0} │ │ │ │ PUBLIC → ABSENT │ │ │ │ -│ │ │ └── • Precedence dependency from DROPPED View:{DescID: 106} -│ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ ├── • Precedence dependency from DROPPED View:{DescID: 106} +│ │ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 1} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 2} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 4294967295} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ └── • Precedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 4294967294} +│ │ │ rule: "column type removed before column family" │ │ │ │ │ ├── • Column:{DescID: 106, ColumnID: 1} │ │ │ │ PUBLIC → WRITE_ONLY @@ -204,10 +216,6 @@ EXPLAIN (ddl, verbose) DROP INDEX idx CASCADE; │ │ ObjectID: 106 │ │ ParentSchemaID: 101 │ │ -│ ├── • NotImplementedForPublicObjects -│ │ DescID: 106 -│ │ ElementType: scpb.ColumnFamily -│ │ │ ├── • MakePublicColumnWriteOnly │ │ ColumnID: 1 │ │ TableID: 106 @@ -280,9 +288,12 @@ EXPLAIN (ddl, verbose) DROP INDEX idx CASCADE; │ │ DescriptorID: 106 │ │ User: admin │ │ -│ └── • RemoveUserPrivileges -│ DescriptorID: 106 -│ User: root +│ ├── • RemoveUserPrivileges +│ │ DescriptorID: 106 +│ │ User: root +│ │ +│ └── • AssertColumnFamilyIsRemoved +│ TableID: 106 │ ├── • PreCommitPhase │ │ @@ -417,8 +428,20 @@ EXPLAIN (ddl, verbose) DROP INDEX idx CASCADE; │ │ ├── • ColumnFamily:{DescID: 106, Name: primary, ColumnFamilyID: 0} │ │ │ │ PUBLIC → ABSENT │ │ │ │ -│ │ │ └── • Precedence dependency from DROPPED View:{DescID: 106} -│ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ ├── • Precedence dependency from DROPPED View:{DescID: 106} +│ │ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 1} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 2} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 4294967295} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ └── • Precedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 4294967294} +│ │ │ rule: "column type removed before column family" │ │ │ │ │ ├── • Column:{DescID: 106, ColumnID: 1} │ │ │ │ PUBLIC → ABSENT @@ -635,10 +658,6 @@ EXPLAIN (ddl, verbose) DROP INDEX idx CASCADE; │ │ ObjectID: 106 │ │ ParentSchemaID: 101 │ │ -│ ├── • NotImplementedForPublicObjects -│ │ DescID: 106 -│ │ ElementType: scpb.ColumnFamily -│ │ │ ├── • MakePublicColumnWriteOnly │ │ ColumnID: 1 │ │ TableID: 106 @@ -731,6 +750,9 @@ EXPLAIN (ddl, verbose) DROP INDEX idx CASCADE; │ │ ColumnID: 4294967294 │ │ TableID: 106 │ │ +│ ├── • AssertColumnFamilyIsRemoved +│ │ TableID: 106 +│ │ │ ├── • MakeWriteOnlyColumnDeleteOnly │ │ ColumnID: 2 │ │ TableID: 106 diff --git a/pkg/sql/schemachanger/testdata/explain_verbose/drop_table b/pkg/sql/schemachanger/testdata/explain_verbose/drop_table index 041573ed0e5b..698f94693f64 100644 --- a/pkg/sql/schemachanger/testdata/explain_verbose/drop_table +++ b/pkg/sql/schemachanger/testdata/explain_verbose/drop_table @@ -59,8 +59,23 @@ EXPLAIN (ddl, verbose) DROP TABLE db.sc.t; │ │ ├── • ColumnFamily:{DescID: 107, Name: primary, ColumnFamilyID: 0} │ │ │ │ PUBLIC → ABSENT │ │ │ │ -│ │ │ └── • Precedence dependency from DROPPED Table:{DescID: 107} -│ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ ├── • Precedence dependency from DROPPED Table:{DescID: 107} +│ │ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 107, ColumnFamilyID: 0, ColumnID: 1} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 107, ColumnFamilyID: 0, ColumnID: 2} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 107, ColumnFamilyID: 0, ColumnID: 3} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 107, ColumnFamilyID: 0, ColumnID: 4294967295} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ └── • Precedence dependency from ABSENT ColumnType:{DescID: 107, ColumnFamilyID: 0, ColumnID: 4294967294} +│ │ │ rule: "column type removed before column family" │ │ │ │ │ ├── • Column:{DescID: 107, ColumnID: 1} │ │ │ │ PUBLIC → WRITE_ONLY @@ -227,10 +242,6 @@ EXPLAIN (ddl, verbose) DROP TABLE db.sc.t; │ ├── • RemoveTableComment │ │ TableID: 107 │ │ -│ ├── • NotImplementedForPublicObjects -│ │ DescID: 107 -│ │ ElementType: scpb.ColumnFamily -│ │ │ ├── • MakePublicColumnWriteOnly │ │ ColumnID: 1 │ │ TableID: 107 @@ -308,9 +319,12 @@ EXPLAIN (ddl, verbose) DROP TABLE db.sc.t; │ │ DescriptorID: 107 │ │ User: admin │ │ -│ └── • RemoveUserPrivileges -│ DescriptorID: 107 -│ User: root +│ ├── • RemoveUserPrivileges +│ │ DescriptorID: 107 +│ │ User: root +│ │ +│ └── • AssertColumnFamilyIsRemoved +│ TableID: 107 │ ├── • PreCommitPhase │ │ @@ -451,8 +465,23 @@ EXPLAIN (ddl, verbose) DROP TABLE db.sc.t; │ │ ├── • ColumnFamily:{DescID: 107, Name: primary, ColumnFamilyID: 0} │ │ │ │ PUBLIC → ABSENT │ │ │ │ -│ │ │ └── • Precedence dependency from DROPPED Table:{DescID: 107} -│ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ ├── • Precedence dependency from DROPPED Table:{DescID: 107} +│ │ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 107, ColumnFamilyID: 0, ColumnID: 1} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 107, ColumnFamilyID: 0, ColumnID: 2} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 107, ColumnFamilyID: 0, ColumnID: 3} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 107, ColumnFamilyID: 0, ColumnID: 4294967295} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ └── • Precedence dependency from ABSENT ColumnType:{DescID: 107, ColumnFamilyID: 0, ColumnID: 4294967294} +│ │ │ rule: "column type removed before column family" │ │ │ │ │ ├── • Column:{DescID: 107, ColumnID: 1} │ │ │ │ PUBLIC → ABSENT @@ -718,10 +747,6 @@ EXPLAIN (ddl, verbose) DROP TABLE db.sc.t; │ ├── • RemoveTableComment │ │ TableID: 107 │ │ -│ ├── • NotImplementedForPublicObjects -│ │ DescID: 107 -│ │ ElementType: scpb.ColumnFamily -│ │ │ ├── • MakePublicColumnWriteOnly │ │ ColumnID: 1 │ │ TableID: 107 @@ -823,6 +848,9 @@ EXPLAIN (ddl, verbose) DROP TABLE db.sc.t; │ │ ColumnID: 4294967294 │ │ TableID: 107 │ │ +│ ├── • AssertColumnFamilyIsRemoved +│ │ TableID: 107 +│ │ │ ├── • MakeWriteOnlyColumnDeleteOnly │ │ ColumnID: 3 │ │ TableID: 107 diff --git a/pkg/sql/schemachanger/testdata/explain_verbose/drop_table_udf_default b/pkg/sql/schemachanger/testdata/explain_verbose/drop_table_udf_default index e6393e7d020a..6ceabc30efca 100644 --- a/pkg/sql/schemachanger/testdata/explain_verbose/drop_table_udf_default +++ b/pkg/sql/schemachanger/testdata/explain_verbose/drop_table_udf_default @@ -50,8 +50,20 @@ EXPLAIN (ddl, verbose) DROP TABLE t; │ │ ├── • ColumnFamily:{DescID: 105, Name: primary, ColumnFamilyID: 0} │ │ │ │ PUBLIC → ABSENT │ │ │ │ -│ │ │ └── • Precedence dependency from DROPPED Table:{DescID: 105} -│ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ ├── • Precedence dependency from DROPPED Table:{DescID: 105} +│ │ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 105, ColumnFamilyID: 0, ColumnID: 1} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 105, ColumnFamilyID: 0, ColumnID: 2} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 105, ColumnFamilyID: 0, ColumnID: 4294967295} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ └── • Precedence dependency from ABSENT ColumnType:{DescID: 105, ColumnFamilyID: 0, ColumnID: 4294967294} +│ │ │ rule: "column type removed before column family" │ │ │ │ │ ├── • Column:{DescID: 105, ColumnID: 1} │ │ │ │ PUBLIC → WRITE_ONLY @@ -191,10 +203,6 @@ EXPLAIN (ddl, verbose) DROP TABLE t; │ │ ObjectID: 105 │ │ ParentSchemaID: 101 │ │ -│ ├── • NotImplementedForPublicObjects -│ │ DescID: 105 -│ │ ElementType: scpb.ColumnFamily -│ │ │ ├── • MakePublicColumnWriteOnly │ │ ColumnID: 1 │ │ TableID: 105 @@ -269,9 +277,12 @@ EXPLAIN (ddl, verbose) DROP TABLE t; │ │ DescriptorID: 105 │ │ User: admin │ │ -│ └── • RemoveUserPrivileges -│ DescriptorID: 105 -│ User: root +│ ├── • RemoveUserPrivileges +│ │ DescriptorID: 105 +│ │ User: root +│ │ +│ └── • AssertColumnFamilyIsRemoved +│ TableID: 105 │ ├── • PreCommitPhase │ │ @@ -394,8 +405,20 @@ EXPLAIN (ddl, verbose) DROP TABLE t; │ │ ├── • ColumnFamily:{DescID: 105, Name: primary, ColumnFamilyID: 0} │ │ │ │ PUBLIC → ABSENT │ │ │ │ -│ │ │ └── • Precedence dependency from DROPPED Table:{DescID: 105} -│ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ ├── • Precedence dependency from DROPPED Table:{DescID: 105} +│ │ │ │ rule: "descriptor dropped before dependent element removal" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 105, ColumnFamilyID: 0, ColumnID: 1} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 105, ColumnFamilyID: 0, ColumnID: 2} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ ├── • Precedence dependency from ABSENT ColumnType:{DescID: 105, ColumnFamilyID: 0, ColumnID: 4294967295} +│ │ │ │ rule: "column type removed before column family" +│ │ │ │ +│ │ │ └── • Precedence dependency from ABSENT ColumnType:{DescID: 105, ColumnFamilyID: 0, ColumnID: 4294967294} +│ │ │ rule: "column type removed before column family" │ │ │ │ │ ├── • Column:{DescID: 105, ColumnID: 1} │ │ │ │ PUBLIC → ABSENT @@ -610,10 +633,6 @@ EXPLAIN (ddl, verbose) DROP TABLE t; │ │ ObjectID: 105 │ │ ParentSchemaID: 101 │ │ -│ ├── • NotImplementedForPublicObjects -│ │ DescID: 105 -│ │ ElementType: scpb.ColumnFamily -│ │ │ ├── • MakePublicColumnWriteOnly │ │ ColumnID: 1 │ │ TableID: 105 @@ -708,6 +727,9 @@ EXPLAIN (ddl, verbose) DROP TABLE t; │ │ ColumnID: 4294967294 │ │ TableID: 105 │ │ +│ ├── • AssertColumnFamilyIsRemoved +│ │ TableID: 105 +│ │ │ ├── • MakeWriteOnlyColumnDeleteOnly │ │ ColumnID: 1 │ │ TableID: 105 From b3f517787c45ec15fe08714e0ec2441b261d1239 Mon Sep 17 00:00:00 2001 From: Faizan Qazi Date: Tue, 28 Mar 2023 14:35:35 -0400 Subject: [PATCH 8/9] sql: avoid writing to column families that do not exist in the primary index Previously, if a new column family was added during an add column and an update/insert occurred concurrently, we could end up writing to this new column family in any primary index. This was inadequate because if the primary index did not store the column, then runtime will have trouble reading data from this table, since after a rollback the added column / column family will get cleaned up from the table descriptor. To address this, this patch avoids writing any columns not stored within an index descriptor. Fixes: #99950 Release note (bug fix): Concurrent DML while adding a new column with a new column family can lead to corruption in the existing primary index. If a rollback occurs the table may no longer be accessible. --- pkg/sql/colenc/encode.go | 3 +++ pkg/sql/row/writer.go | 6 +++++- pkg/sql/rowenc/index_encoding.go | 8 ++++++++ pkg/sql/schema_changer_test.go | 6 ------ 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/pkg/sql/colenc/encode.go b/pkg/sql/colenc/encode.go index b00c5e3bdb26..b1a35cb5c4b4 100644 --- a/pkg/sql/colenc/encode.go +++ b/pkg/sql/colenc/encode.go @@ -307,6 +307,9 @@ func (b *BatchEncoder) encodePK(ctx context.Context, ind catalog.Index) error { if kys[row] == nil { continue } + if skip := b.skipColumnNotInPrimaryIndexValue(family.DefaultColumnID, vec, row); skip { + continue + } marshaled, err := MarshalLegacy(typ, vec, row+b.start) if err != nil { return err diff --git a/pkg/sql/row/writer.go b/pkg/sql/row/writer.go index e890cb30f341..32400396915b 100644 --- a/pkg/sql/row/writer.go +++ b/pkg/sql/row/writer.go @@ -139,7 +139,11 @@ func prepareInsertOrUpdateBatch( if !ok { continue } - + // Skip any values with a default ID not stored in the primary index, + // which can happen if we are adding new columns. + if skip := helper.SkipColumnNotInPrimaryIndexValue(family.DefaultColumnID, values[idx]); skip { + continue + } typ := fetchedCols[idx].GetType() marshaled, err := valueside.MarshalLegacy(typ, values[idx]) if err != nil { diff --git a/pkg/sql/rowenc/index_encoding.go b/pkg/sql/rowenc/index_encoding.go index 222fb1e4aacd..033ba11c6cfe 100644 --- a/pkg/sql/rowenc/index_encoding.go +++ b/pkg/sql/rowenc/index_encoding.go @@ -1079,6 +1079,14 @@ func EncodePrimaryIndex( // The decoders expect that column family 0 is encoded with a TUPLE value tag, so we // don't want to use the untagged value encoding. if len(family.ColumnIDs) == 1 && family.ColumnIDs[0] == family.DefaultColumnID && family.ID != 0 { + // Single column value families which are not stored can be skipped, these + // may exist temporarily while adding a column. + if !storedColumns.Contains(family.DefaultColumnID) { + if cdatum, ok := values[colMap.GetDefault(family.DefaultColumnID)].(tree.CompositeDatum); !ok || + !cdatum.IsComposite() { + return nil + } + } datum := findColumnValue(family.DefaultColumnID, colMap, values) // We want to include this column if its value is non-null or // we were requested to include all of the columns. diff --git a/pkg/sql/schema_changer_test.go b/pkg/sql/schema_changer_test.go index 2523353ee625..931a15102528 100644 --- a/pkg/sql/schema_changer_test.go +++ b/pkg/sql/schema_changer_test.go @@ -3113,9 +3113,6 @@ CREATE TABLE t.test ( // backfill. This should have the same number of Puts // as there are CPuts above. fmt.Sprintf("Put /Table/%d/3/2/0 -> /BYTES/0x0a030a1302", tableID), - // TODO (rohany): this k/v is spurious and should be removed - // when #45343 is fixed. - fmt.Sprintf("Put /Table/%d/3/2/1/1 -> /BYTES/0x0a020104", tableID), fmt.Sprintf("Put /Table/%d/3/2/2/1 -> /BYTES/0x0a030a3306", tableID), fmt.Sprintf("Put /Table/%d/3/2/4/1 -> /BYTES/0x0a02010c", tableID), @@ -3154,7 +3151,6 @@ CREATE TABLE t.test ( // The temporary indexes are delete-preserving -- they // should see the delete and issue Puts. fmt.Sprintf("Put (delete) /Table/%d/3/2/0", tableID), - fmt.Sprintf("Put (delete) /Table/%d/3/2/1/1", tableID), fmt.Sprintf("Put (delete) /Table/%d/3/2/2/1", tableID), fmt.Sprintf("Put (delete) /Table/%d/3/2/3/1", tableID), fmt.Sprintf("Put (delete) /Table/%d/3/2/4/1", tableID), @@ -3182,7 +3178,6 @@ CREATE TABLE t.test ( // The temporary index for the newly added index sees // a Put in all families. fmt.Sprintf("Put /Table/%d/3/3/0 -> /BYTES/0x0a030a1302", tableID), - fmt.Sprintf("Put /Table/%d/3/3/1/1 -> /BYTES/0x0a020106", tableID), fmt.Sprintf("Put /Table/%d/3/3/2/1 -> /BYTES/0x0a030a3306", tableID), fmt.Sprintf("Put /Table/%d/3/3/4/1 -> /BYTES/0x0a02010c", tableID), // TODO(ssd): double-check that this trace makes @@ -3212,7 +3207,6 @@ CREATE TABLE t.test ( // The temporary index sees a Put in all families even though // only some are changing. This is expected. fmt.Sprintf("Put /Table/%d/3/3/0 -> /BYTES/0x0a030a1302", tableID), - fmt.Sprintf("Put /Table/%d/3/3/1/1 -> /BYTES/0x0a020106", tableID), fmt.Sprintf("Put /Table/%d/3/3/3/1 -> /BYTES/0x0a02010a", tableID), } require.Equal(t, expected, scanToArray(rows)) From 594ad8742da3436670fecd70c595d34121b778a0 Mon Sep 17 00:00:00 2001 From: Faizan Qazi Date: Tue, 28 Mar 2023 21:50:31 -0400 Subject: [PATCH 9/9] sql/schemachanger: add DML injection tests for rollback scenarios Previously, our DML injection tests only covered happy paths for schema changes. We recently ran into a bug where the old primary index was corrupted after DML and left in a bad state visible only after a rollback. To address this, this patch adds tests for this specific scenario and adds the ability to test rollbacks with DML injection. Epic: none Release note: None --- .../backup_base_generated_test.go | 10 + .../backup_base_mixed_generated_test.go | 10 + .../immediate_mutation_visitor_generated.go | 6 + pkg/sql/schemachanger/sctest/cumulative.go | 85 +- .../schemachanger/sctest_generated_test.go | 50 + .../sctest_mixed_generated_test.go | 10 + .../end_to_end/add_column_with_stored | 716 +++++++++++++ .../end_to_end/add_column_with_stored_family | 721 +++++++++++++ .../testdata/explain/add_column_with_stored | 193 ++++ .../add_column_with_stored.rollback_1_of_7 | 39 + .../add_column_with_stored.rollback_2_of_7 | 52 + .../add_column_with_stored.rollback_3_of_7 | 52 + .../add_column_with_stored.rollback_4_of_7 | 52 + .../add_column_with_stored.rollback_5_of_7 | 54 + .../add_column_with_stored.rollback_6_of_7 | 54 + .../add_column_with_stored.rollback_7_of_7 | 54 + .../explain/add_column_with_stored_family | 198 ++++ ..._column_with_stored_family.rollback_1_of_7 | 41 + ..._column_with_stored_family.rollback_2_of_7 | 54 + ..._column_with_stored_family.rollback_3_of_7 | 54 + ..._column_with_stored_family.rollback_4_of_7 | 54 + ..._column_with_stored_family.rollback_5_of_7 | 56 + ..._column_with_stored_family.rollback_6_of_7 | 56 + ..._column_with_stored_family.rollback_7_of_7 | 56 + .../explain_verbose/add_column_with_stored | 947 +++++++++++++++++ .../add_column_with_stored.rollback_1_of_7 | 195 ++++ .../add_column_with_stored.rollback_2_of_7 | 273 +++++ .../add_column_with_stored.rollback_3_of_7 | 273 +++++ .../add_column_with_stored.rollback_4_of_7 | 273 +++++ .../add_column_with_stored.rollback_5_of_7 | 283 +++++ .../add_column_with_stored.rollback_6_of_7 | 283 +++++ .../add_column_with_stored.rollback_7_of_7 | 283 +++++ .../add_column_with_stored_family | 971 ++++++++++++++++++ ..._column_with_stored_family.rollback_1_of_7 | 206 ++++ ..._column_with_stored_family.rollback_2_of_7 | 285 +++++ ..._column_with_stored_family.rollback_3_of_7 | 285 +++++ ..._column_with_stored_family.rollback_4_of_7 | 285 +++++ ..._column_with_stored_family.rollback_5_of_7 | 295 ++++++ ..._column_with_stored_family.rollback_6_of_7 | 295 ++++++ ..._column_with_stored_family.rollback_7_of_7 | 295 ++++++ 40 files changed, 8434 insertions(+), 20 deletions(-) create mode 100644 pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored create mode 100644 pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored_family create mode 100644 pkg/sql/schemachanger/testdata/explain/add_column_with_stored create mode 100644 pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_1_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_2_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_3_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_4_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_5_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_6_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_7_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family create mode 100644 pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_1_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_2_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_3_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_4_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_5_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_6_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_7_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored create mode 100644 pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_1_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_2_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_3_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_4_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_5_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_6_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_7_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family create mode 100644 pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_1_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_2_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_3_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_4_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_5_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_6_of_7 create mode 100644 pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_7_of_7 diff --git a/pkg/ccl/schemachangerccl/backup_base_generated_test.go b/pkg/ccl/schemachangerccl/backup_base_generated_test.go index 2c9824e46bf3..793b9b594cfc 100644 --- a/pkg/ccl/schemachangerccl/backup_base_generated_test.go +++ b/pkg/ccl/schemachangerccl/backup_base_generated_test.go @@ -38,6 +38,16 @@ func TestBackup_base_add_column_no_default(t *testing.T) { defer log.Scope(t).Close(t) sctest.Backup(t, "pkg/sql/schemachanger/testdata/end_to_end/add_column_no_default", newCluster) } +func TestBackup_base_add_column_with_stored(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + sctest.Backup(t, "pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored", newCluster) +} +func TestBackup_base_add_column_with_stored_family(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + sctest.Backup(t, "pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored_family", newCluster) +} func TestBackup_base_alter_table_add_check_udf(t *testing.T) { defer leaktest.AfterTest(t)() defer log.Scope(t).Close(t) diff --git a/pkg/ccl/schemachangerccl/backup_base_mixed_generated_test.go b/pkg/ccl/schemachangerccl/backup_base_mixed_generated_test.go index 21851a284311..e28424136e88 100644 --- a/pkg/ccl/schemachangerccl/backup_base_mixed_generated_test.go +++ b/pkg/ccl/schemachangerccl/backup_base_mixed_generated_test.go @@ -38,6 +38,16 @@ func TestBackupMixedVersionElements_base_add_column_no_default(t *testing.T) { defer log.Scope(t).Close(t) sctest.BackupMixedVersionElements(t, "pkg/sql/schemachanger/testdata/end_to_end/add_column_no_default", newClusterMixed) } +func TestBackupMixedVersionElements_base_add_column_with_stored(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + sctest.BackupMixedVersionElements(t, "pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored", newClusterMixed) +} +func TestBackupMixedVersionElements_base_add_column_with_stored_family(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + sctest.BackupMixedVersionElements(t, "pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored_family", newClusterMixed) +} func TestBackupMixedVersionElements_base_alter_table_add_check_udf(t *testing.T) { defer leaktest.AfterTest(t)() defer log.Scope(t).Close(t) diff --git a/pkg/sql/schemachanger/scop/immediate_mutation_visitor_generated.go b/pkg/sql/schemachanger/scop/immediate_mutation_visitor_generated.go index a27f9b71e11e..1dcc675da835 100644 --- a/pkg/sql/schemachanger/scop/immediate_mutation_visitor_generated.go +++ b/pkg/sql/schemachanger/scop/immediate_mutation_visitor_generated.go @@ -72,6 +72,7 @@ type ImmediateMutationVisitor interface { RemoveSchemaParent(context.Context, RemoveSchemaParent) error AddIndexPartitionInfo(context.Context, AddIndexPartitionInfo) error AddColumnFamily(context.Context, AddColumnFamily) error + AssertColumnFamilyIsRemoved(context.Context, AssertColumnFamilyIsRemoved) error AddColumnDefaultExpression(context.Context, AddColumnDefaultExpression) error RemoveColumnDefaultExpression(context.Context, RemoveColumnDefaultExpression) error AddColumnOnUpdateExpression(context.Context, AddColumnOnUpdateExpression) error @@ -370,6 +371,11 @@ func (op AddColumnFamily) Visit(ctx context.Context, v ImmediateMutationVisitor) return v.AddColumnFamily(ctx, op) } +// Visit is part of the ImmediateMutationOp interface. +func (op AssertColumnFamilyIsRemoved) Visit(ctx context.Context, v ImmediateMutationVisitor) error { + return v.AssertColumnFamilyIsRemoved(ctx, op) +} + // Visit is part of the ImmediateMutationOp interface. func (op AddColumnDefaultExpression) Visit(ctx context.Context, v ImmediateMutationVisitor) error { return v.AddColumnDefaultExpression(ctx, op) diff --git a/pkg/sql/schemachanger/sctest/cumulative.go b/pkg/sql/schemachanger/sctest/cumulative.go index c7e8645e7a0e..684e04b66620 100644 --- a/pkg/sql/schemachanger/sctest/cumulative.go +++ b/pkg/sql/schemachanger/sctest/cumulative.go @@ -72,6 +72,8 @@ type stageExecStmt struct { expectedOutput string observedOutput string schemaChangeErrorRegex *regexp.Regexp + // schemaChangeErrorRegexRollback will cause a rollback. + schemaChangeErrorRegexRollback *regexp.Regexp } // HasSchemaChangeError indicates if a schema change error will be observed, @@ -80,6 +82,13 @@ func (e *stageExecStmt) HasSchemaChangeError() bool { return e.schemaChangeErrorRegex != nil } +func (e *stageExecStmt) HasAnySchemaChangeError() *regexp.Regexp { + if e.schemaChangeErrorRegex != nil { + return e.schemaChangeErrorRegex + } + return e.schemaChangeErrorRegexRollback +} + // stageKeyOrdinalLatest targets the latest ordinal in a stage. const stageKeyOrdinalLatest = math.MaxUint16 @@ -89,14 +98,16 @@ type stageKey struct { minOrdinal int maxOrdinal int phase scop.Phase + rollback bool } // makeStageKey constructs a stage key targeting a single ordinal. -func makeStageKey(phase scop.Phase, ordinal int) stageKey { +func makeStageKey(phase scop.Phase, ordinal int, rollback bool) stageKey { return stageKey{ phase: phase, minOrdinal: ordinal, maxOrdinal: ordinal, + rollback: rollback, } } @@ -151,6 +162,7 @@ func (m *stageExecStmtMap) getExecStmts(targetKey stageKey) []*stageExecStmt { } for _, key := range m.entries { if key.stageKey.phase == targetKey.phase && + key.stageKey.rollback == targetKey.rollback && targetKey.minOrdinal >= key.stageKey.minOrdinal && targetKey.minOrdinal <= key.stageKey.maxOrdinal { stmts = append(stmts, key.stmt) @@ -162,6 +174,12 @@ func (m *stageExecStmtMap) getExecStmts(targetKey stageKey) []*stageExecStmt { // AssertMapIsUsed asserts that all injected DML statements injected // at various stages. func (m *stageExecStmtMap) AssertMapIsUsed(t *testing.T) { + // If there is any rollback error, then not all stages will be used. + for _, e := range m.entries { + if e.stmt.schemaChangeErrorRegexRollback != nil { + return + } + } if len(m.entries) != len(m.usedMap) { for _, entry := range m.entries { if _, ok := m.usedMap[entry.stmt]; !ok { @@ -213,9 +231,9 @@ func (m *stageExecStmtMap) GetInjectionRanges( panic("unknown phase type for latest") } } - if !key.stmt.HasSchemaChangeError() { + if !key.stmt.HasSchemaChangeError() && !key.rollback { forcedSplitEntries = append(forcedSplitEntries, key) - } else { + } else if !key.rollback { for i := key.minOrdinal; i <= key.maxOrdinal; i++ { forcedSplitEntries = append(forcedSplitEntries, stageKeyEntry{ @@ -223,6 +241,7 @@ func (m *stageExecStmtMap) GetInjectionRanges( minOrdinal: i, maxOrdinal: i, phase: key.phase, + rollback: key.rollback, }, stmt: key.stmt, }, @@ -307,19 +326,25 @@ func (m *stageExecStmtMap) ParseStageExec(t *testing.T, d *datadriven.TestData) // parseStageCommon common fields between stage-exec and stage-query, which // support the following keys: // - phase - The phase in which this statement/query should be injected, of the -// string scop.Phase. +// string scop.Phase. Note: PreCommitPhase with stage 1 can be used to +// inject failures that will only happen for DML injection testing. // - stage / stageStart / stageEnd - The ordinal for the stage where this // statement should be injected. stageEnd accepts the special value // latest which will map to the highest observed stage. +// - schemaChangeExecError a schema change execution error will be encountered +// by injecting at this stage. +// - schemaChangeExecErrorForRollback a schema change execution error that will +// be encountered at a future stage, leading to a rollback. // - statements can refer to builtin variable names with a $ // - $stageKey - A unique identifier for stages and phases // - $successfulStageCount - Number of stages of the that have been successfully -// executed with injections. +// executed with injections func (m *stageExecStmtMap) parseStageCommon( t *testing.T, d *datadriven.TestData, execType stageExecType, ) { var key stageKey var schemaChangeErrorRegex *regexp.Regexp + var schemaChangeErrorRegexRollback *regexp.Regexp stmts := strings.Split(d.Input, ";") require.NotEmpty(t, stmts) // Remove any trailing empty lines. @@ -369,6 +394,14 @@ func (m *stageExecStmtMap) parseStageCommon( } case "schemaChangeExecError": schemaChangeErrorRegex = regexp.MustCompile(strings.Join(cmdArgs.Vals, " ")) + require.Nil(t, schemaChangeErrorRegexRollback, "future and current stage errors cannot be set concurrently") + case "schemaChangeExecErrorForRollback": + schemaChangeErrorRegexRollback = regexp.MustCompile(strings.Join(cmdArgs.Vals, " ")) + require.Nil(t, schemaChangeErrorRegex, "rollback and current stage errors cannot be set concurrently") + case "rollback": + rollback, err := strconv.ParseBool(cmdArgs.Vals[0]) + require.NoError(t, err) + key.rollback = rollback default: require.Failf(t, "unknown key encountered", "key was %s", cmdArgs.Key) } @@ -376,11 +409,12 @@ func (m *stageExecStmtMap) parseStageCommon( entry := stageKeyEntry{ stageKey: key, stmt: &stageExecStmt{ - execType: execType, - stmts: stmts, - observedOutput: "", - expectedOutput: d.Expected, - schemaChangeErrorRegex: schemaChangeErrorRegex, + execType: execType, + stmts: stmts, + observedOutput: "", + expectedOutput: d.Expected, + schemaChangeErrorRegex: schemaChangeErrorRegex, + schemaChangeErrorRegexRollback: schemaChangeErrorRegexRollback, }, } m.entries = append(m.entries, entry) @@ -814,31 +848,36 @@ func ExecuteWithDMLInjection(t *testing.T, relPath string, newCluster NewCluster } testDMLInjectionCase = func(t *testing.T, setup, stmts []parser.Statement, injection stageKey) { var schemaChangeErrorRegex *regexp.Regexp + var lastRollbackStageKey *stageKey usedStages := make(map[int]struct{}) successfulStages := 0 var tdb *sqlutils.SQLRunner _, db, cleanup := newCluster(t, &scexec.TestingKnobs{ BeforeStage: func(p scplan.Plan, stageIdx int) error { - // FIXME: Support rollback detection s := p.Stages[stageIdx] - if !p.CurrentState.InRollback && - !p.InRollback && - injection.phase == p.Stages[stageIdx].Phase && + if (injection.phase == p.Stages[stageIdx].Phase && p.Stages[stageIdx].Ordinal >= injection.minOrdinal && - p.Stages[stageIdx].Ordinal <= injection.maxOrdinal { + p.Stages[stageIdx].Ordinal <= injection.maxOrdinal) || + (p.InRollback || p.CurrentState.InRollback) || /* Rollbacks are always injected */ + (p.Stages[stageIdx].Phase == scop.PreCommitPhase) { jobErrorMutex.Lock() defer jobErrorMutex.Unlock() - key := makeStageKey(s.Phase, s.Ordinal) + key := makeStageKey(s.Phase, s.Ordinal, p.InRollback || p.CurrentState.InRollback) if _, ok := usedStages[key.AsInt()]; !ok { - successfulStages++ + // Rollbacks don't count towards the successful count + if !p.InRollback && !p.CurrentState.InRollback && + p.Stages[stageIdx].Phase != scop.PreCommitPhase { + successfulStages++ + } else { + lastRollbackStageKey = &key + } injectStmts := injectionFunc(key, tdb, successfulStages) regexSetOnce := false - schemaChangeErrorRegex = nil for _, injectStmt := range injectStmts { if injectStmt != nil && - injectStmt.HasSchemaChangeError() { + injectStmt.HasAnySchemaChangeError() != nil { require.Falsef(t, regexSetOnce, "multiple statements are expecting errors in the same phase.") - schemaChangeErrorRegex = injectStmt.schemaChangeErrorRegex + schemaChangeErrorRegex = injectStmt.HasAnySchemaChangeError() regexSetOnce = true t.Logf("Expecting schema change error: %v", schemaChangeErrorRegex) } @@ -867,6 +906,12 @@ func ExecuteWithDMLInjection(t *testing.T, relPath string, newCluster NewCluster require.NoError(t, executeSchemaChangeTxn( context.Background(), t, setup, stmts, db, nil, nil, onError, )) + // Re-inject anything from the rollback once the job transaction + // commits, this enforces any sanity checks one last time in + // the final descriptor state. + if lastRollbackStageKey != nil { + injectionFunc(*lastRollbackStageKey, tdb, successfulStages) + } require.Equal(t, errorDetected, schemaChangeErrorRegex != nil) } cumulativeTest(t, relPath, testFunc) diff --git a/pkg/sql/schemachanger/sctest_generated_test.go b/pkg/sql/schemachanger/sctest_generated_test.go index 77b94d9f7916..4a891cb1c7b4 100644 --- a/pkg/sql/schemachanger/sctest_generated_test.go +++ b/pkg/sql/schemachanger/sctest_generated_test.go @@ -120,6 +120,56 @@ func TestRollback_add_column_no_default(t *testing.T) { defer log.Scope(t).Close(t) sctest.Rollback(t, "pkg/sql/schemachanger/testdata/end_to_end/add_column_no_default", sctest.SingleNodeCluster) } +func TestEndToEndSideEffects_add_column_with_stored(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + sctest.EndToEndSideEffects(t, "pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored", sctest.SingleNodeCluster) +} +func TestExecuteWithDMLInjection_add_column_with_stored(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + sctest.ExecuteWithDMLInjection(t, "pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored", sctest.SingleNodeCluster) +} +func TestGenerateSchemaChangeCorpus_add_column_with_stored(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + sctest.GenerateSchemaChangeCorpus(t, "pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored", sctest.SingleNodeCluster) +} +func TestPause_add_column_with_stored(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + sctest.Pause(t, "pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored", sctest.SingleNodeCluster) +} +func TestRollback_add_column_with_stored(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + sctest.Rollback(t, "pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored", sctest.SingleNodeCluster) +} +func TestEndToEndSideEffects_add_column_with_stored_family(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + sctest.EndToEndSideEffects(t, "pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored_family", sctest.SingleNodeCluster) +} +func TestExecuteWithDMLInjection_add_column_with_stored_family(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + sctest.ExecuteWithDMLInjection(t, "pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored_family", sctest.SingleNodeCluster) +} +func TestGenerateSchemaChangeCorpus_add_column_with_stored_family(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + sctest.GenerateSchemaChangeCorpus(t, "pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored_family", sctest.SingleNodeCluster) +} +func TestPause_add_column_with_stored_family(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + sctest.Pause(t, "pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored_family", sctest.SingleNodeCluster) +} +func TestRollback_add_column_with_stored_family(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + sctest.Rollback(t, "pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored_family", sctest.SingleNodeCluster) +} func TestEndToEndSideEffects_alter_table_add_check_udf(t *testing.T) { defer leaktest.AfterTest(t)() defer log.Scope(t).Close(t) diff --git a/pkg/sql/schemachanger/sctest_mixed_generated_test.go b/pkg/sql/schemachanger/sctest_mixed_generated_test.go index cee2a720f00e..71f48ad54f4a 100644 --- a/pkg/sql/schemachanger/sctest_mixed_generated_test.go +++ b/pkg/sql/schemachanger/sctest_mixed_generated_test.go @@ -40,6 +40,16 @@ func TestValidateMixedVersionElements_add_column_no_default(t *testing.T) { defer log.Scope(t).Close(t) sctest.ValidateMixedVersionElements(t, "pkg/sql/schemachanger/testdata/end_to_end/add_column_no_default", sctest.SingleNodeMixedCluster) } +func TestValidateMixedVersionElements_add_column_with_stored(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + sctest.ValidateMixedVersionElements(t, "pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored", sctest.SingleNodeMixedCluster) +} +func TestValidateMixedVersionElements_add_column_with_stored_family(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + sctest.ValidateMixedVersionElements(t, "pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored_family", sctest.SingleNodeMixedCluster) +} func TestValidateMixedVersionElements_alter_table_add_check_udf(t *testing.T) { defer leaktest.AfterTest(t)() defer log.Scope(t).Close(t) diff --git a/pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored b/pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored new file mode 100644 index 000000000000..a78b3ac066bc --- /dev/null +++ b/pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored @@ -0,0 +1,716 @@ +setup +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; +---- +... ++database {0 0 db} -> 104 ++schema {104 0 public} -> 105 ++object {104 105 tbl} -> 106 ++object {104 105 sq1} -> 107 + +stage-exec phase=PreCommitPhase stage=1 schemaChangeExecErrorForRollback=(.*validation of column "j" NOT NULL failed on row:.*) +INSERT INTO db.public.tbl VALUES (-1, -1),(-2, -2),(-3, -3), (-7, NULL); +---- + +# Each insert will be injected twice per stage, plus 1 extra. +stage-query phase=PostCommitPhase stage=: rollback=true +SELECT count(*)=($successfulStageCount*2)+4 FROM db.public.tbl; +---- +true + +# Each insert will be injected twice per stage, plus 1 extra. +stage-query phase=PostCommitNonRevertiblePhase stage=: rollback=true +SELECT count(*)=($successfulStageCount*2)+4 FROM db.public.tbl; +---- +true + +stage-exec phase=PostCommitPhase stage=: +INSERT INTO db.public.tbl VALUES($stageKey, 1); +INSERT INTO db.public.tbl VALUES($stageKey + 1, 1); +UPDATE db.public.tbl SET k=$stageKey WHERE i <> -7; +UPDATE db.public.tbl SET k=i WHERE i <> -7; +DELETE FROM db.public.tbl WHERE i=-1; +DELETE FROM db.public.tbl WHERE i=$stageKey; +INSERT INTO db.public.tbl VALUES($stageKey, 1); +INSERT INTO db.public.tbl VALUES(-1, -1); +---- + +# Each insert will be injected twice per stage, plus 1 extra. +stage-query phase=PostCommitPhase stage=: +SELECT count(*)=($successfulStageCount*2)+4 FROM db.public.tbl; +---- +true + + +stage-exec phase=PostCommitNonRevertiblePhase stage=: +INSERT INTO db.public.tbl VALUES($stageKey); +INSERT INTO db.public.tbl VALUES($stageKey + 1); +UPDATE db.public.tbl SET k=$stageKey; +UPDATE db.public.tbl SET k=i; +DELETE FROM db.public.tbl WHERE i=-1; +DELETE FROM db.public.tbl WHERE i=$stageKey; +INSERT INTO db.public.tbl VALUES($stageKey); +INSERT INTO db.public.tbl VALUES(-1); +---- + +# Each insert will be injected twice per stage, , plus 1 extra. +stage-query phase=PostCommitNonRevertiblePhase stage=: +SELECT count(*)=($successfulStageCount*2)+1 FROM db.public.tbl; +---- +true + +test +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED +---- +begin transaction #1 +# begin StatementPhase +checking for feature: ALTER TABLE +increment telemetry for sql.schema.alter_table +increment telemetry for sql.schema.alter_table.add_column +increment telemetry for sql.schema.qualifcation.computed +increment telemetry for sql.schema.new_column_type.int8 +write *eventpb.AlterTable to event log: + mutationId: 1 + sql: + descriptorId: 106 + statement: ALTER TABLE ‹db›.‹public›.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) + STORED + tag: ALTER TABLE + user: root + tableName: db.public.tbl +## StatementPhase stage 1 of 1 with 11 MutationType ops +upsert descriptor #106 + ... + - 1 + - 2 + + - 3 + columnNames: + - i + - k + + - j + defaultColumnId: 2 + name: primary + ... + id: 106 + modificationTime: {} + + mutations: + + - column: + + computeExpr: k + + id: 3 + + name: j + + nullable: true + + pgAttributeNum: 3 + + type: + + family: IntFamily + + oid: 20 + + width: 64 + + direction: ADD + + mutationId: 1 + + state: DELETE_ONLY + + - direction: ADD + + index: + + constraintId: 2 + + createdExplicitly: true + + encodingType: 1 + + foreignKey: {} + + geoConfig: {} + + id: 2 + + interleave: {} + + keyColumnDirections: + + - ASC + + keyColumnIds: + + - 1 + + keyColumnNames: + + - i + + name: crdb_internal_index_2_name_placeholder + + partitioning: {} + + sharded: {} + + storeColumnIds: + + - 2 + + - 3 + + storeColumnNames: + + - k + + - j + + unique: true + + version: 4 + + mutationId: 1 + + state: BACKFILLING + + - direction: ADD + + index: + + constraintId: 3 + + createdExplicitly: true + + encodingType: 1 + + foreignKey: {} + + geoConfig: {} + + id: 3 + + interleave: {} + + keyColumnDirections: + + - ASC + + keyColumnIds: + + - 1 + + keyColumnNames: + + - i + + name: crdb_internal_index_3_name_placeholder + + partitioning: {} + + sharded: {} + + storeColumnIds: + + - 2 + + - 3 + + storeColumnNames: + + - k + + - j + + unique: true + + useDeletePreservingEncoding: true + + version: 4 + + mutationId: 1 + + state: DELETE_ONLY + name: tbl + - nextColumnId: 3 + - nextConstraintId: 2 + + nextColumnId: 4 + + nextConstraintId: 4 + nextFamilyId: 1 + - nextIndexId: 2 + + nextIndexId: 4 + nextMutationId: 1 + parentId: 104 + ... + time: {} + unexposedParentSchemaId: 105 + - version: "1" + + version: "2" +# end StatementPhase +# begin PreCommitPhase +## PreCommitPhase stage 1 of 2 with 1 MutationType op +undo all catalog changes within txn #1 +persist all catalog changes to storage +## PreCommitPhase stage 2 of 2 with 15 MutationType ops +upsert descriptor #106 + ... + createAsOfTime: + wallTime: "1640995200000000000" + + declarativeSchemaChangerState: + + authorization: + + userName: root + + currentStatuses: + + jobId: "1" + + relevantStatements: + + - statement: + + redactedStatement: ALTER TABLE ‹db›.‹public›.‹tbl› ADD COLUMN ‹j› INT8 NOT + + NULL AS (‹k›) STORED + + statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED + + statementTag: ALTER TABLE + + revertible: true + + targetRanks: + + targets: + families: + - columnIds: + - 1 + - 2 + + - 3 + columnNames: + - i + - k + + - j + defaultColumnId: 2 + name: primary + ... + id: 106 + modificationTime: {} + + mutations: + + - column: + + computeExpr: k + + id: 3 + + name: j + + nullable: true + + pgAttributeNum: 3 + + type: + + family: IntFamily + + oid: 20 + + width: 64 + + direction: ADD + + mutationId: 1 + + state: DELETE_ONLY + + - direction: ADD + + index: + + constraintId: 2 + + createdExplicitly: true + + encodingType: 1 + + foreignKey: {} + + geoConfig: {} + + id: 2 + + interleave: {} + + keyColumnDirections: + + - ASC + + keyColumnIds: + + - 1 + + keyColumnNames: + + - i + + name: crdb_internal_index_2_name_placeholder + + partitioning: {} + + sharded: {} + + storeColumnIds: + + - 2 + + - 3 + + storeColumnNames: + + - k + + - j + + unique: true + + version: 4 + + mutationId: 1 + + state: BACKFILLING + + - direction: ADD + + index: + + constraintId: 3 + + createdExplicitly: true + + encodingType: 1 + + foreignKey: {} + + geoConfig: {} + + id: 3 + + interleave: {} + + keyColumnDirections: + + - ASC + + keyColumnIds: + + - 1 + + keyColumnNames: + + - i + + name: crdb_internal_index_3_name_placeholder + + partitioning: {} + + sharded: {} + + storeColumnIds: + + - 2 + + - 3 + + storeColumnNames: + + - k + + - j + + unique: true + + useDeletePreservingEncoding: true + + version: 4 + + mutationId: 1 + + state: DELETE_ONLY + name: tbl + - nextColumnId: 3 + - nextConstraintId: 2 + + nextColumnId: 4 + + nextConstraintId: 4 + nextFamilyId: 1 + - nextIndexId: 2 + + nextIndexId: 4 + nextMutationId: 1 + parentId: 104 + ... + time: {} + unexposedParentSchemaId: 105 + - version: "1" + + version: "2" +persist all catalog changes to storage +create job #1 (non-cancelable: false): "ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED" + descriptor IDs: [106] +# end PreCommitPhase +commit transaction #1 +notified job registry to adopt jobs: [1] +# begin PostCommitPhase +begin transaction #2 +commit transaction #2 +begin transaction #3 +## PostCommitPhase stage 1 of 7 with 5 MutationType ops +upsert descriptor #106 + table: + + checks: + + - columnIds: + + - 3 + + expr: j IS NOT NULL + + isNonNullConstraint: true + + name: j_auto_not_null + + validity: Validating + columns: + - id: 1 + ... + direction: ADD + mutationId: 1 + - state: DELETE_ONLY + + state: WRITE_ONLY + - direction: ADD + index: + ... + version: 4 + mutationId: 1 + - state: DELETE_ONLY + + state: WRITE_ONLY + + - constraint: + + check: + + columnIds: + + - 3 + + expr: j IS NOT NULL + + isNonNullConstraint: true + + name: j_auto_not_null + + validity: Validating + + constraintType: NOT_NULL + + foreignKey: {} + + name: j_auto_not_null + + notNullColumn: 3 + + uniqueWithoutIndexConstraint: {} + + direction: ADD + + mutationId: 1 + + state: WRITE_ONLY + name: tbl + nextColumnId: 4 + ... + time: {} + unexposedParentSchemaId: 105 + - version: "2" + + version: "3" +persist all catalog changes to storage +update progress of schema change job #1: "PostCommitPhase stage 2 of 7 with 1 BackfillType op pending" +commit transaction #3 +begin transaction #4 +## PostCommitPhase stage 2 of 7 with 1 BackfillType op +backfill indexes [2] from index #1 in table #106 +commit transaction #4 +begin transaction #5 +## PostCommitPhase stage 3 of 7 with 3 MutationType ops +upsert descriptor #106 + ... + version: 4 + mutationId: 1 + - state: BACKFILLING + + state: DELETE_ONLY + - direction: ADD + index: + ... + time: {} + unexposedParentSchemaId: 105 + - version: "3" + + version: "4" +persist all catalog changes to storage +update progress of schema change job #1: "PostCommitPhase stage 4 of 7 with 1 MutationType op pending" +commit transaction #5 +begin transaction #6 +## PostCommitPhase stage 4 of 7 with 3 MutationType ops +upsert descriptor #106 + ... + version: 4 + mutationId: 1 + - state: DELETE_ONLY + + state: MERGING + - direction: ADD + index: + ... + time: {} + unexposedParentSchemaId: 105 + - version: "4" + + version: "5" +persist all catalog changes to storage +update progress of schema change job #1: "PostCommitPhase stage 5 of 7 with 1 BackfillType op pending" +commit transaction #6 +begin transaction #7 +## PostCommitPhase stage 5 of 7 with 1 BackfillType op +merge temporary indexes [3] into backfilled indexes [2] in table #106 +commit transaction #7 +begin transaction #8 +## PostCommitPhase stage 6 of 7 with 3 MutationType ops +upsert descriptor #106 + ... + version: 4 + mutationId: 1 + - state: MERGING + + state: WRITE_ONLY + - direction: ADD + index: + ... + time: {} + unexposedParentSchemaId: 105 + - version: "5" + + version: "6" +persist all catalog changes to storage +update progress of schema change job #1: "PostCommitPhase stage 7 of 7 with 2 ValidationType ops pending" +commit transaction #8 +begin transaction #9 +## PostCommitPhase stage 7 of 7 with 2 ValidationType ops +validate forward indexes [2] in table #106 +validate CHECK constraint j_auto_not_null in table #106 +commit transaction #9 +begin transaction #10 +## PostCommitNonRevertiblePhase stage 1 of 3 with 13 MutationType ops +upsert descriptor #106 + table: + - checks: + - - columnIds: + - - 3 + - expr: j IS NOT NULL + - isNonNullConstraint: true + - name: j_auto_not_null + - validity: Validating + + checks: [] + columns: + - id: 1 + ... + oid: 20 + width: 64 + + - computeExpr: k + + id: 3 + + name: j + + pgAttributeNum: 3 + + type: + + family: IntFamily + + oid: 20 + + width: 64 + createAsOfTime: + wallTime: "1640995200000000000" + ... + statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED + statementTag: ALTER TABLE + - revertible: true + targetRanks: + targets: + ... + modificationTime: {} + mutations: + - - column: + - computeExpr: k + - id: 3 + - name: j + - nullable: true + - pgAttributeNum: 3 + - type: + - family: IntFamily + - oid: 20 + - width: 64 + - direction: ADD + - mutationId: 1 + - state: WRITE_ONLY + - - direction: ADD + + - direction: DROP + index: + - constraintId: 2 + + constraintId: 3 + createdExplicitly: true + encodingType: 1 + foreignKey: {} + geoConfig: {} + - id: 2 + + id: 3 + interleave: {} + keyColumnDirections: + ... + keyColumnNames: + - i + - name: crdb_internal_index_2_name_placeholder + + name: crdb_internal_index_3_name_placeholder + partitioning: {} + sharded: {} + ... + - j + unique: true + + useDeletePreservingEncoding: true + version: 4 + mutationId: 1 + - state: WRITE_ONLY + - - direction: ADD + + state: DELETE_ONLY + + - direction: DROP + index: + - constraintId: 3 + - createdExplicitly: true + + constraintId: 1 + + createdAtNanos: "1640995200000000000" + encodingType: 1 + foreignKey: {} + geoConfig: {} + - id: 3 + + id: 1 + interleave: {} + keyColumnDirections: + ... + keyColumnNames: + - i + - name: crdb_internal_index_3_name_placeholder + + name: crdb_internal_index_1_name_placeholder + partitioning: {} + sharded: {} + storeColumnIds: + - 2 + - - 3 + storeColumnNames: + - k + - - j + unique: true + - useDeletePreservingEncoding: true + version: 4 + mutationId: 1 + state: WRITE_ONLY + - - constraint: + - check: + - columnIds: + - - 3 + - expr: j IS NOT NULL + - isNonNullConstraint: true + - name: j_auto_not_null + - validity: Validating + - constraintType: NOT_NULL + - foreignKey: {} + - name: j_auto_not_null + - notNullColumn: 3 + - uniqueWithoutIndexConstraint: {} + - direction: ADD + - mutationId: 1 + - state: WRITE_ONLY + name: tbl + nextColumnId: 4 + ... + parentId: 104 + primaryIndex: + - constraintId: 1 + - createdAtNanos: "1640995200000000000" + + constraintId: 2 + + createdExplicitly: true + encodingType: 1 + foreignKey: {} + geoConfig: {} + - id: 1 + + id: 2 + interleave: {} + keyColumnDirections: + ... + storeColumnIds: + - 2 + + - 3 + storeColumnNames: + - k + + - j + unique: true + version: 4 + ... + time: {} + unexposedParentSchemaId: 105 + - version: "6" + + version: "7" +persist all catalog changes to storage +adding table for stats refresh: 106 +update progress of schema change job #1: "PostCommitNonRevertiblePhase stage 2 of 3 with 4 MutationType ops pending" +set schema change job #1 to non-cancellable +commit transaction #10 +begin transaction #11 +## PostCommitNonRevertiblePhase stage 2 of 3 with 6 MutationType ops +upsert descriptor #106 + ... + - direction: DROP + index: + - constraintId: 3 + - createdExplicitly: true + - encodingType: 1 + - foreignKey: {} + - geoConfig: {} + - id: 3 + - interleave: {} + - keyColumnDirections: + - - ASC + - keyColumnIds: + - - 1 + - keyColumnNames: + - - i + - name: crdb_internal_index_3_name_placeholder + - partitioning: {} + - sharded: {} + - storeColumnIds: + - - 2 + - - 3 + - storeColumnNames: + - - k + - - j + - unique: true + - useDeletePreservingEncoding: true + - version: 4 + - mutationId: 1 + - state: DELETE_ONLY + - - direction: DROP + - index: + constraintId: 1 + createdAtNanos: "1640995200000000000" + ... + version: 4 + mutationId: 1 + - state: WRITE_ONLY + + state: DELETE_ONLY + name: tbl + nextColumnId: 4 + ... + time: {} + unexposedParentSchemaId: 105 + - version: "7" + + version: "8" +persist all catalog changes to storage +update progress of schema change job #1: "PostCommitNonRevertiblePhase stage 3 of 3 with 3 MutationType ops pending" +commit transaction #11 +begin transaction #12 +## PostCommitNonRevertiblePhase stage 3 of 3 with 5 MutationType ops +upsert descriptor #106 + ... + createAsOfTime: + wallTime: "1640995200000000000" + - declarativeSchemaChangerState: + - authorization: + - userName: root + - currentStatuses: + - jobId: "1" + - relevantStatements: + - - statement: + - redactedStatement: ALTER TABLE ‹db›.‹public›.‹tbl› ADD COLUMN ‹j› INT8 NOT + - NULL AS (‹k›) STORED + - statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED + - statementTag: ALTER TABLE + - targetRanks: + - targets: + families: + - columnIds: + ... + id: 106 + modificationTime: {} + - mutations: + - - direction: DROP + - index: + - constraintId: 1 + - createdAtNanos: "1640995200000000000" + - encodingType: 1 + - foreignKey: {} + - geoConfig: {} + - id: 1 + - interleave: {} + - keyColumnDirections: + - - ASC + - keyColumnIds: + - - 1 + - keyColumnNames: + - - i + - name: crdb_internal_index_1_name_placeholder + - partitioning: {} + - sharded: {} + - storeColumnIds: + - - 2 + - storeColumnNames: + - - k + - unique: true + - version: 4 + - mutationId: 1 + - state: DELETE_ONLY + + mutations: [] + name: tbl + nextColumnId: 4 + ... + time: {} + unexposedParentSchemaId: 105 + - version: "8" + + version: "9" +persist all catalog changes to storage +create job #2 (non-cancelable: true): "GC for ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED" + descriptor IDs: [106] +update progress of schema change job #1: "all stages completed" +set schema change job #1 to non-cancellable +updated schema change job #1 descriptor IDs to [] +write *eventpb.FinishSchemaChange to event log: + sc: + descriptorId: 106 +commit transaction #12 +notified job registry to adopt jobs: [2] +# end PostCommitPhase diff --git a/pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored_family b/pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored_family new file mode 100644 index 000000000000..a89bbbf7539e --- /dev/null +++ b/pkg/sql/schemachanger/testdata/end_to_end/add_column_with_stored_family @@ -0,0 +1,721 @@ +setup +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; +---- +... ++database {0 0 db} -> 104 ++schema {104 0 public} -> 105 ++object {104 105 tbl} -> 106 ++object {104 105 sq1} -> 107 + +stage-exec phase=PreCommitPhase stage=1 schemaChangeExecErrorForRollback=(.*validation of column "j" NOT NULL failed on row:.*) +INSERT INTO db.public.tbl VALUES (-1, -1),(-2, -2),(-3, -3), (-7, NULL); +---- + +# Each insert will be injected twice per stage, plus 1 extra. +stage-query phase=PostCommitPhase stage=: rollback=true +SELECT count(*)=($successfulStageCount*2)+4 FROM db.public.tbl; +---- +true + +# Each insert will be injected twice per stage, plus 1 extra. +stage-query phase=PostCommitNonRevertiblePhase stage=: rollback=true +SELECT count(*)=($successfulStageCount*2)+4 FROM db.public.tbl; +---- +true + +stage-exec phase=PostCommitPhase stage=: +INSERT INTO db.public.tbl VALUES($stageKey, 1); +INSERT INTO db.public.tbl VALUES($stageKey + 1, 1); +UPDATE db.public.tbl SET k=$stageKey WHERE i <> -7; +UPDATE db.public.tbl SET k=i WHERE i <> -7; +DELETE FROM db.public.tbl WHERE i=-1; +DELETE FROM db.public.tbl WHERE i=$stageKey; +INSERT INTO db.public.tbl VALUES($stageKey, 1); +INSERT INTO db.public.tbl VALUES(-1, -1); +---- + +# Each insert will be injected twice per stage, plus 1 extra. +stage-query phase=PostCommitPhase stage=: +SELECT count(*)=($successfulStageCount*2)+4 FROM db.public.tbl; +---- +true + + +stage-exec phase=PostCommitNonRevertiblePhase stage=: +INSERT INTO db.public.tbl VALUES($stageKey); +INSERT INTO db.public.tbl VALUES($stageKey + 1); +UPDATE db.public.tbl SET k=$stageKey; +UPDATE db.public.tbl SET k=i; +DELETE FROM db.public.tbl WHERE i=-1; +DELETE FROM db.public.tbl WHERE i=$stageKey; +INSERT INTO db.public.tbl VALUES($stageKey); +INSERT INTO db.public.tbl VALUES(-1); +---- + +# Each insert will be injected twice per stage, , plus 1 extra. +stage-query phase=PostCommitNonRevertiblePhase stage=: +SELECT count(*)=($successfulStageCount*2)+1 FROM db.public.tbl; +---- +true + +test +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED CREATE FAMILY bob +---- +begin transaction #1 +# begin StatementPhase +checking for feature: ALTER TABLE +increment telemetry for sql.schema.alter_table +increment telemetry for sql.schema.alter_table.add_column +increment telemetry for sql.schema.qualifcation.computed +increment telemetry for sql.schema.new_column_type.int8 +write *eventpb.AlterTable to event log: + mutationId: 1 + sql: + descriptorId: 106 + statement: ALTER TABLE ‹db›.‹public›.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) + STORED CREATE FAMILY ‹bob› + tag: ALTER TABLE + user: root + tableName: db.public.tbl +## StatementPhase stage 1 of 1 with 12 MutationType ops +upsert descriptor #106 + ... + defaultColumnId: 2 + name: primary + + - columnIds: + + - 3 + + columnNames: + + - j + + defaultColumnId: 3 + + id: 1 + + name: bob + formatVersion: 3 + id: 106 + modificationTime: {} + + mutations: + + - column: + + computeExpr: k + + id: 3 + + name: j + + nullable: true + + pgAttributeNum: 3 + + type: + + family: IntFamily + + oid: 20 + + width: 64 + + direction: ADD + + mutationId: 1 + + state: DELETE_ONLY + + - direction: ADD + + index: + + constraintId: 2 + + createdExplicitly: true + + encodingType: 1 + + foreignKey: {} + + geoConfig: {} + + id: 2 + + interleave: {} + + keyColumnDirections: + + - ASC + + keyColumnIds: + + - 1 + + keyColumnNames: + + - i + + name: crdb_internal_index_2_name_placeholder + + partitioning: {} + + sharded: {} + + storeColumnIds: + + - 2 + + - 3 + + storeColumnNames: + + - k + + - j + + unique: true + + version: 4 + + mutationId: 1 + + state: BACKFILLING + + - direction: ADD + + index: + + constraintId: 3 + + createdExplicitly: true + + encodingType: 1 + + foreignKey: {} + + geoConfig: {} + + id: 3 + + interleave: {} + + keyColumnDirections: + + - ASC + + keyColumnIds: + + - 1 + + keyColumnNames: + + - i + + name: crdb_internal_index_3_name_placeholder + + partitioning: {} + + sharded: {} + + storeColumnIds: + + - 2 + + - 3 + + storeColumnNames: + + - k + + - j + + unique: true + + useDeletePreservingEncoding: true + + version: 4 + + mutationId: 1 + + state: DELETE_ONLY + name: tbl + - nextColumnId: 3 + - nextConstraintId: 2 + - nextFamilyId: 1 + - nextIndexId: 2 + + nextColumnId: 4 + + nextConstraintId: 4 + + nextFamilyId: 2 + + nextIndexId: 4 + nextMutationId: 1 + parentId: 104 + ... + time: {} + unexposedParentSchemaId: 105 + - version: "1" + + version: "2" +# end StatementPhase +# begin PreCommitPhase +## PreCommitPhase stage 1 of 2 with 1 MutationType op +undo all catalog changes within txn #1 +persist all catalog changes to storage +## PreCommitPhase stage 2 of 2 with 16 MutationType ops +upsert descriptor #106 + ... + createAsOfTime: + wallTime: "1640995200000000000" + + declarativeSchemaChangerState: + + authorization: + + userName: root + + currentStatuses: + + jobId: "1" + + relevantStatements: + + - statement: + + redactedStatement: ALTER TABLE ‹db›.‹public›.‹tbl› ADD COLUMN ‹j› INT8 NOT + + NULL AS (‹k›) STORED CREATE FAMILY ‹bob› + + statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED + + CREATE FAMILY bob + + statementTag: ALTER TABLE + + revertible: true + + targetRanks: + + targets: + families: + - columnIds: + ... + defaultColumnId: 2 + name: primary + + - columnIds: + + - 3 + + columnNames: + + - j + + defaultColumnId: 3 + + id: 1 + + name: bob + formatVersion: 3 + id: 106 + modificationTime: {} + + mutations: + + - column: + + computeExpr: k + + id: 3 + + name: j + + nullable: true + + pgAttributeNum: 3 + + type: + + family: IntFamily + + oid: 20 + + width: 64 + + direction: ADD + + mutationId: 1 + + state: DELETE_ONLY + + - direction: ADD + + index: + + constraintId: 2 + + createdExplicitly: true + + encodingType: 1 + + foreignKey: {} + + geoConfig: {} + + id: 2 + + interleave: {} + + keyColumnDirections: + + - ASC + + keyColumnIds: + + - 1 + + keyColumnNames: + + - i + + name: crdb_internal_index_2_name_placeholder + + partitioning: {} + + sharded: {} + + storeColumnIds: + + - 2 + + - 3 + + storeColumnNames: + + - k + + - j + + unique: true + + version: 4 + + mutationId: 1 + + state: BACKFILLING + + - direction: ADD + + index: + + constraintId: 3 + + createdExplicitly: true + + encodingType: 1 + + foreignKey: {} + + geoConfig: {} + + id: 3 + + interleave: {} + + keyColumnDirections: + + - ASC + + keyColumnIds: + + - 1 + + keyColumnNames: + + - i + + name: crdb_internal_index_3_name_placeholder + + partitioning: {} + + sharded: {} + + storeColumnIds: + + - 2 + + - 3 + + storeColumnNames: + + - k + + - j + + unique: true + + useDeletePreservingEncoding: true + + version: 4 + + mutationId: 1 + + state: DELETE_ONLY + name: tbl + - nextColumnId: 3 + - nextConstraintId: 2 + - nextFamilyId: 1 + - nextIndexId: 2 + + nextColumnId: 4 + + nextConstraintId: 4 + + nextFamilyId: 2 + + nextIndexId: 4 + nextMutationId: 1 + parentId: 104 + ... + time: {} + unexposedParentSchemaId: 105 + - version: "1" + + version: "2" +persist all catalog changes to storage +create job #1 (non-cancelable: false): "ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED CREATE FAMILY bob" + descriptor IDs: [106] +# end PreCommitPhase +commit transaction #1 +notified job registry to adopt jobs: [1] +# begin PostCommitPhase +begin transaction #2 +commit transaction #2 +begin transaction #3 +## PostCommitPhase stage 1 of 7 with 5 MutationType ops +upsert descriptor #106 + table: + + checks: + + - columnIds: + + - 3 + + expr: j IS NOT NULL + + isNonNullConstraint: true + + name: j_auto_not_null + + validity: Validating + columns: + - id: 1 + ... + direction: ADD + mutationId: 1 + - state: DELETE_ONLY + + state: WRITE_ONLY + - direction: ADD + index: + ... + version: 4 + mutationId: 1 + - state: DELETE_ONLY + + state: WRITE_ONLY + + - constraint: + + check: + + columnIds: + + - 3 + + expr: j IS NOT NULL + + isNonNullConstraint: true + + name: j_auto_not_null + + validity: Validating + + constraintType: NOT_NULL + + foreignKey: {} + + name: j_auto_not_null + + notNullColumn: 3 + + uniqueWithoutIndexConstraint: {} + + direction: ADD + + mutationId: 1 + + state: WRITE_ONLY + name: tbl + nextColumnId: 4 + ... + time: {} + unexposedParentSchemaId: 105 + - version: "2" + + version: "3" +persist all catalog changes to storage +update progress of schema change job #1: "PostCommitPhase stage 2 of 7 with 1 BackfillType op pending" +commit transaction #3 +begin transaction #4 +## PostCommitPhase stage 2 of 7 with 1 BackfillType op +backfill indexes [2] from index #1 in table #106 +commit transaction #4 +begin transaction #5 +## PostCommitPhase stage 3 of 7 with 3 MutationType ops +upsert descriptor #106 + ... + version: 4 + mutationId: 1 + - state: BACKFILLING + + state: DELETE_ONLY + - direction: ADD + index: + ... + time: {} + unexposedParentSchemaId: 105 + - version: "3" + + version: "4" +persist all catalog changes to storage +update progress of schema change job #1: "PostCommitPhase stage 4 of 7 with 1 MutationType op pending" +commit transaction #5 +begin transaction #6 +## PostCommitPhase stage 4 of 7 with 3 MutationType ops +upsert descriptor #106 + ... + version: 4 + mutationId: 1 + - state: DELETE_ONLY + + state: MERGING + - direction: ADD + index: + ... + time: {} + unexposedParentSchemaId: 105 + - version: "4" + + version: "5" +persist all catalog changes to storage +update progress of schema change job #1: "PostCommitPhase stage 5 of 7 with 1 BackfillType op pending" +commit transaction #6 +begin transaction #7 +## PostCommitPhase stage 5 of 7 with 1 BackfillType op +merge temporary indexes [3] into backfilled indexes [2] in table #106 +commit transaction #7 +begin transaction #8 +## PostCommitPhase stage 6 of 7 with 3 MutationType ops +upsert descriptor #106 + ... + version: 4 + mutationId: 1 + - state: MERGING + + state: WRITE_ONLY + - direction: ADD + index: + ... + time: {} + unexposedParentSchemaId: 105 + - version: "5" + + version: "6" +persist all catalog changes to storage +update progress of schema change job #1: "PostCommitPhase stage 7 of 7 with 2 ValidationType ops pending" +commit transaction #8 +begin transaction #9 +## PostCommitPhase stage 7 of 7 with 2 ValidationType ops +validate forward indexes [2] in table #106 +validate CHECK constraint j_auto_not_null in table #106 +commit transaction #9 +begin transaction #10 +## PostCommitNonRevertiblePhase stage 1 of 3 with 13 MutationType ops +upsert descriptor #106 + table: + - checks: + - - columnIds: + - - 3 + - expr: j IS NOT NULL + - isNonNullConstraint: true + - name: j_auto_not_null + - validity: Validating + + checks: [] + columns: + - id: 1 + ... + oid: 20 + width: 64 + + - computeExpr: k + + id: 3 + + name: j + + pgAttributeNum: 3 + + type: + + family: IntFamily + + oid: 20 + + width: 64 + createAsOfTime: + wallTime: "1640995200000000000" + ... + CREATE FAMILY bob + statementTag: ALTER TABLE + - revertible: true + targetRanks: + targets: + ... + modificationTime: {} + mutations: + - - column: + - computeExpr: k + - id: 3 + - name: j + - nullable: true + - pgAttributeNum: 3 + - type: + - family: IntFamily + - oid: 20 + - width: 64 + - direction: ADD + - mutationId: 1 + - state: WRITE_ONLY + - - direction: ADD + + - direction: DROP + index: + - constraintId: 2 + + constraintId: 3 + createdExplicitly: true + encodingType: 1 + foreignKey: {} + geoConfig: {} + - id: 2 + + id: 3 + interleave: {} + keyColumnDirections: + ... + keyColumnNames: + - i + - name: crdb_internal_index_2_name_placeholder + + name: crdb_internal_index_3_name_placeholder + partitioning: {} + sharded: {} + ... + - j + unique: true + + useDeletePreservingEncoding: true + version: 4 + mutationId: 1 + - state: WRITE_ONLY + - - direction: ADD + + state: DELETE_ONLY + + - direction: DROP + index: + - constraintId: 3 + - createdExplicitly: true + + constraintId: 1 + + createdAtNanos: "1640995200000000000" + encodingType: 1 + foreignKey: {} + geoConfig: {} + - id: 3 + + id: 1 + interleave: {} + keyColumnDirections: + ... + keyColumnNames: + - i + - name: crdb_internal_index_3_name_placeholder + + name: crdb_internal_index_1_name_placeholder + partitioning: {} + sharded: {} + storeColumnIds: + - 2 + - - 3 + storeColumnNames: + - k + - - j + unique: true + - useDeletePreservingEncoding: true + version: 4 + mutationId: 1 + state: WRITE_ONLY + - - constraint: + - check: + - columnIds: + - - 3 + - expr: j IS NOT NULL + - isNonNullConstraint: true + - name: j_auto_not_null + - validity: Validating + - constraintType: NOT_NULL + - foreignKey: {} + - name: j_auto_not_null + - notNullColumn: 3 + - uniqueWithoutIndexConstraint: {} + - direction: ADD + - mutationId: 1 + - state: WRITE_ONLY + name: tbl + nextColumnId: 4 + ... + parentId: 104 + primaryIndex: + - constraintId: 1 + - createdAtNanos: "1640995200000000000" + + constraintId: 2 + + createdExplicitly: true + encodingType: 1 + foreignKey: {} + geoConfig: {} + - id: 1 + + id: 2 + interleave: {} + keyColumnDirections: + ... + storeColumnIds: + - 2 + + - 3 + storeColumnNames: + - k + + - j + unique: true + version: 4 + ... + time: {} + unexposedParentSchemaId: 105 + - version: "6" + + version: "7" +persist all catalog changes to storage +adding table for stats refresh: 106 +update progress of schema change job #1: "PostCommitNonRevertiblePhase stage 2 of 3 with 4 MutationType ops pending" +set schema change job #1 to non-cancellable +commit transaction #10 +begin transaction #11 +## PostCommitNonRevertiblePhase stage 2 of 3 with 6 MutationType ops +upsert descriptor #106 + ... + - direction: DROP + index: + - constraintId: 3 + - createdExplicitly: true + - encodingType: 1 + - foreignKey: {} + - geoConfig: {} + - id: 3 + - interleave: {} + - keyColumnDirections: + - - ASC + - keyColumnIds: + - - 1 + - keyColumnNames: + - - i + - name: crdb_internal_index_3_name_placeholder + - partitioning: {} + - sharded: {} + - storeColumnIds: + - - 2 + - - 3 + - storeColumnNames: + - - k + - - j + - unique: true + - useDeletePreservingEncoding: true + - version: 4 + - mutationId: 1 + - state: DELETE_ONLY + - - direction: DROP + - index: + constraintId: 1 + createdAtNanos: "1640995200000000000" + ... + version: 4 + mutationId: 1 + - state: WRITE_ONLY + + state: DELETE_ONLY + name: tbl + nextColumnId: 4 + ... + time: {} + unexposedParentSchemaId: 105 + - version: "7" + + version: "8" +persist all catalog changes to storage +update progress of schema change job #1: "PostCommitNonRevertiblePhase stage 3 of 3 with 3 MutationType ops pending" +commit transaction #11 +begin transaction #12 +## PostCommitNonRevertiblePhase stage 3 of 3 with 5 MutationType ops +upsert descriptor #106 + ... + createAsOfTime: + wallTime: "1640995200000000000" + - declarativeSchemaChangerState: + - authorization: + - userName: root + - currentStatuses: + - jobId: "1" + - relevantStatements: + - - statement: + - redactedStatement: ALTER TABLE ‹db›.‹public›.‹tbl› ADD COLUMN ‹j› INT8 NOT + - NULL AS (‹k›) STORED CREATE FAMILY ‹bob› + - statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED + - CREATE FAMILY bob + - statementTag: ALTER TABLE + - targetRanks: + - targets: + families: + - columnIds: + ... + id: 106 + modificationTime: {} + - mutations: + - - direction: DROP + - index: + - constraintId: 1 + - createdAtNanos: "1640995200000000000" + - encodingType: 1 + - foreignKey: {} + - geoConfig: {} + - id: 1 + - interleave: {} + - keyColumnDirections: + - - ASC + - keyColumnIds: + - - 1 + - keyColumnNames: + - - i + - name: crdb_internal_index_1_name_placeholder + - partitioning: {} + - sharded: {} + - storeColumnIds: + - - 2 + - storeColumnNames: + - - k + - unique: true + - version: 4 + - mutationId: 1 + - state: DELETE_ONLY + + mutations: [] + name: tbl + nextColumnId: 4 + ... + time: {} + unexposedParentSchemaId: 105 + - version: "8" + + version: "9" +persist all catalog changes to storage +create job #2 (non-cancelable: true): "GC for ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED CREATE FAMILY bob" + descriptor IDs: [106] +update progress of schema change job #1: "all stages completed" +set schema change job #1 to non-cancellable +updated schema change job #1 descriptor IDs to [] +write *eventpb.FinishSchemaChange to event log: + sc: + descriptorId: 106 +commit transaction #12 +notified job registry to adopt jobs: [2] +# end PostCommitPhase diff --git a/pkg/sql/schemachanger/testdata/explain/add_column_with_stored b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored new file mode 100644 index 000000000000..c2ff3608cf0b --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored @@ -0,0 +1,193 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +EXPLAIN (ddl) ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED; +---- +Schema change plan for ALTER TABLE ‹db›.‹public›.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED; + ├── StatementPhase + │ └── Stage 1 of 1 in StatementPhase + │ ├── 8 elements transitioning toward PUBLIC + │ │ ├── ABSENT → DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ ├── ABSENT → PUBLIC ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ ├── ABSENT → PUBLIC ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ │ ├── ABSENT → BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ ├── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ ├── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ ├── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ └── ABSENT → PUBLIC IndexData:{DescID: 106, IndexID: 2} + │ ├── 4 elements transitioning toward TRANSIENT_ABSENT + │ │ ├── ABSENT → DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ ├── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ ├── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ └── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ └── 11 Mutation operations + │ ├── MakeAbsentColumnDeleteOnly {"Column":{"ColumnID":3,"PgAttributeNum":3,"TableID":106}} + │ ├── SetColumnName {"ColumnID":3,"Name":"j","TableID":106} + │ ├── SetAddedColumnType {"ColumnType":{"ColumnID":3,"TableID":106}} + │ ├── MakeAbsentIndexBackfilling {"Index":{"ConstraintID":2,"IndexID":2,"IsUnique":true,"SourceIndexID":1,"TableID":106,"TemporaryIndexID":3}} + │ ├── AddColumnToIndex {"ColumnID":1,"IndexID":2,"TableID":106} + │ ├── AddColumnToIndex {"ColumnID":2,"IndexID":2,"Kind":2,"TableID":106} + │ ├── AddColumnToIndex {"ColumnID":3,"IndexID":2,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeAbsentTempIndexDeleteOnly {"Index":{"ConstraintID":3,"IndexID":3,"IsUnique":true,"SourceIndexID":1,"TableID":106}} + │ ├── AddColumnToIndex {"ColumnID":1,"IndexID":3,"TableID":106} + │ ├── AddColumnToIndex {"ColumnID":2,"IndexID":3,"Kind":2,"TableID":106} + │ └── AddColumnToIndex {"ColumnID":3,"IndexID":3,"Kind":2,"Ordinal":1,"TableID":106} + ├── PreCommitPhase + │ ├── Stage 1 of 2 in PreCommitPhase + │ │ ├── 8 elements transitioning toward PUBLIC + │ │ │ ├── DELETE_ONLY → ABSENT Column:{DescID: 106, ColumnID: 3} + │ │ │ ├── PUBLIC → ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ ├── PUBLIC → ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ │ │ ├── BACKFILL_ONLY → ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ └── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 2} + │ │ ├── 4 elements transitioning toward TRANSIENT_ABSENT + │ │ │ ├── DELETE_ONLY → ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ └── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ └── 1 Mutation operation + │ │ └── UndoAllInTxnImmediateMutationOpSideEffects + │ └── Stage 2 of 2 in PreCommitPhase + │ ├── 8 elements transitioning toward PUBLIC + │ │ ├── ABSENT → DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ ├── ABSENT → PUBLIC ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ ├── ABSENT → PUBLIC ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ │ ├── ABSENT → BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ ├── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ ├── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ ├── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ └── ABSENT → PUBLIC IndexData:{DescID: 106, IndexID: 2} + │ ├── 4 elements transitioning toward TRANSIENT_ABSENT + │ │ ├── ABSENT → DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ ├── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ ├── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ └── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ └── 15 Mutation operations + │ ├── MakeAbsentColumnDeleteOnly {"Column":{"ColumnID":3,"PgAttributeNum":3,"TableID":106}} + │ ├── SetColumnName {"ColumnID":3,"Name":"j","TableID":106} + │ ├── SetAddedColumnType {"ColumnType":{"ColumnID":3,"TableID":106}} + │ ├── MakeAbsentIndexBackfilling {"Index":{"ConstraintID":2,"IndexID":2,"IsUnique":true,"SourceIndexID":1,"TableID":106,"TemporaryIndexID":3}} + │ ├── MaybeAddSplitForIndex {"IndexID":2,"TableID":106} + │ ├── AddColumnToIndex {"ColumnID":1,"IndexID":2,"TableID":106} + │ ├── AddColumnToIndex {"ColumnID":2,"IndexID":2,"Kind":2,"TableID":106} + │ ├── AddColumnToIndex {"ColumnID":3,"IndexID":2,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeAbsentTempIndexDeleteOnly {"Index":{"ConstraintID":3,"IndexID":3,"IsUnique":true,"SourceIndexID":1,"TableID":106}} + │ ├── MaybeAddSplitForIndex {"IndexID":3,"TableID":106} + │ ├── AddColumnToIndex {"ColumnID":1,"IndexID":3,"TableID":106} + │ ├── AddColumnToIndex {"ColumnID":2,"IndexID":3,"Kind":2,"TableID":106} + │ ├── AddColumnToIndex {"ColumnID":3,"IndexID":3,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── SetJobStateOnDescriptor {"DescriptorID":106,"Initialize":true} + │ └── CreateSchemaChangerJob {"RunningStatus":"PostCommitPhase ..."} + ├── PostCommitPhase + │ ├── Stage 1 of 7 in PostCommitPhase + │ │ ├── 2 elements transitioning toward PUBLIC + │ │ │ ├── DELETE_ONLY → WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ └── ABSENT → WRITE_ONLY ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ ├── 2 elements transitioning toward TRANSIENT_ABSENT + │ │ │ ├── DELETE_ONLY → WRITE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ └── ABSENT → PUBLIC IndexData:{DescID: 106, IndexID: 3} + │ │ └── 5 Mutation operations + │ │ ├── MakeDeleteOnlyColumnWriteOnly {"ColumnID":3,"TableID":106} + │ │ ├── MakeDeleteOnlyIndexWriteOnly {"IndexID":3,"TableID":106} + │ │ ├── MakeAbsentColumnNotNullWriteOnly {"ColumnID":3,"TableID":106} + │ │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ │ └── UpdateSchemaChangerJob {"RunningStatus":"PostCommitPhase ..."} + │ ├── Stage 2 of 7 in PostCommitPhase + │ │ ├── 1 element transitioning toward PUBLIC + │ │ │ └── BACKFILL_ONLY → BACKFILLED PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ └── 1 Backfill operation + │ │ └── BackfillIndex {"IndexID":2,"SourceIndexID":1,"TableID":106} + │ ├── Stage 3 of 7 in PostCommitPhase + │ │ ├── 1 element transitioning toward PUBLIC + │ │ │ └── BACKFILLED → DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ └── 3 Mutation operations + │ │ ├── MakeBackfillingIndexDeleteOnly {"IndexID":2,"TableID":106} + │ │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ │ └── UpdateSchemaChangerJob {"RunningStatus":"PostCommitPhase ..."} + │ ├── Stage 4 of 7 in PostCommitPhase + │ │ ├── 1 element transitioning toward PUBLIC + │ │ │ └── DELETE_ONLY → MERGE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ └── 3 Mutation operations + │ │ ├── MakeBackfilledIndexMerging {"IndexID":2,"TableID":106} + │ │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ │ └── UpdateSchemaChangerJob {"RunningStatus":"PostCommitPhase ..."} + │ ├── Stage 5 of 7 in PostCommitPhase + │ │ ├── 1 element transitioning toward PUBLIC + │ │ │ └── MERGE_ONLY → MERGED PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ └── 1 Backfill operation + │ │ └── MergeIndex {"BackfilledIndexID":2,"TableID":106,"TemporaryIndexID":3} + │ ├── Stage 6 of 7 in PostCommitPhase + │ │ ├── 1 element transitioning toward PUBLIC + │ │ │ └── MERGED → WRITE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ └── 3 Mutation operations + │ │ ├── MakeMergedIndexWriteOnly {"IndexID":2,"TableID":106} + │ │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ │ └── UpdateSchemaChangerJob {"RunningStatus":"PostCommitPhase ..."} + │ └── Stage 7 of 7 in PostCommitPhase + │ ├── 2 elements transitioning toward PUBLIC + │ │ ├── WRITE_ONLY → VALIDATED PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ └── WRITE_ONLY → VALIDATED ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ └── 2 Validation operations + │ ├── ValidateIndex {"IndexID":2,"TableID":106} + │ └── ValidateColumnNotNull {"ColumnID":3,"IndexIDForValidation":2,"TableID":106} + └── PostCommitNonRevertiblePhase + ├── Stage 1 of 3 in PostCommitNonRevertiblePhase + │ ├── 4 elements transitioning toward PUBLIC + │ │ ├── WRITE_ONLY → PUBLIC Column:{DescID: 106, ColumnID: 3} + │ │ ├── VALIDATED → PUBLIC PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ ├── ABSENT → PUBLIC IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 2} + │ │ └── VALIDATED → PUBLIC ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ ├── 4 elements transitioning toward TRANSIENT_ABSENT + │ │ ├── WRITE_ONLY → TRANSIENT_DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → TRANSIENT_ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ ├── PUBLIC → TRANSIENT_ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ └── PUBLIC → TRANSIENT_ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ ├── 2 elements transitioning toward ABSENT + │ │ ├── PUBLIC → VALIDATED PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ └── PUBLIC → ABSENT IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 1} + │ └── 13 Mutation operations + │ ├── MakePublicPrimaryIndexWriteOnly {"IndexID":1,"TableID":106} + │ ├── SetIndexName {"IndexID":1,"Name":"crdb_internal_in...","TableID":106} + │ ├── SetIndexName {"IndexID":2,"Name":"tbl_pkey","TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":3,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":3,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeValidatedColumnNotNullPublic {"ColumnID":3,"TableID":106} + │ ├── MakeValidatedPrimaryIndexPublic {"IndexID":2,"TableID":106} + │ ├── MakeWriteOnlyColumnPublic {"ColumnID":3,"TableID":106} + │ ├── RefreshStats {"TableID":106} + │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"PostCommitNonRev..."} + ├── Stage 2 of 3 in PostCommitNonRevertiblePhase + │ ├── 1 element transitioning toward TRANSIENT_ABSENT + │ │ └── TRANSIENT_DELETE_ONLY → TRANSIENT_ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ ├── 3 elements transitioning toward ABSENT + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 1} + │ │ └── VALIDATED → DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ └── 6 Mutation operations + │ ├── MakeIndexAbsent {"IndexID":3,"TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":1,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":1,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":1,"Kind":2,"TableID":106} + │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"PostCommitNonRev..."} + └── Stage 3 of 3 in PostCommitNonRevertiblePhase + ├── 1 element transitioning toward TRANSIENT_ABSENT + │ └── PUBLIC → TRANSIENT_ABSENT IndexData:{DescID: 106, IndexID: 3} + ├── 2 elements transitioning toward ABSENT + │ ├── DELETE_ONLY → ABSENT PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ └── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 1} + └── 5 Mutation operations + ├── MakeIndexAbsent {"IndexID":1,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":1,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":3,"TableID":106} + ├── RemoveJobStateFromDescriptor {"DescriptorID":106} + └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"all stages compl..."} diff --git a/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_1_of_7 b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_1_of_7 new file mode 100644 index 000000000000..fd7f0b419e9a --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_1_of_7 @@ -0,0 +1,39 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED; +EXPLAIN (ddl) rollback at post-commit stage 1 of 7; +---- +Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED; + └── PostCommitNonRevertiblePhase + └── Stage 1 of 1 in PostCommitNonRevertiblePhase + ├── 12 elements transitioning toward ABSENT + │ ├── DELETE_ONLY → ABSENT Column:{DescID: 106, ColumnID: 3} + │ ├── PUBLIC → ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ ├── PUBLIC → ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ ├── BACKFILL_ONLY → ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ ├── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 2} + │ ├── DELETE_ONLY → ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ └── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + └── 13 Mutation operations + ├── SetColumnName {"ColumnID":3,"Name":"crdb_internal_co...","TableID":106} + ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":2,"TableID":106} + ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":2,"Kind":2,"TableID":106} + ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":2,"Kind":2,"Ordinal":1,"TableID":106} + ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":3,"TableID":106} + ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":3,"Kind":2,"TableID":106} + ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":3,"Kind":2,"Ordinal":1,"TableID":106} + ├── MakeIndexAbsent {"IndexID":2,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":2,"TableID":106} + ├── MakeIndexAbsent {"IndexID":3,"TableID":106} + ├── MakeDeleteOnlyColumnAbsent {"ColumnID":3,"TableID":106} + ├── RemoveJobStateFromDescriptor {"DescriptorID":106} + └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"all stages compl..."} diff --git a/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_2_of_7 b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_2_of_7 new file mode 100644 index 000000000000..d72f3d55861c --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_2_of_7 @@ -0,0 +1,52 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED; +EXPLAIN (ddl) rollback at post-commit stage 2 of 7; +---- +Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED; + └── PostCommitNonRevertiblePhase + ├── Stage 1 of 2 in PostCommitNonRevertiblePhase + │ ├── 11 elements transitioning toward ABSENT + │ │ ├── WRITE_ONLY → DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ ├── PUBLIC → ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ ├── BACKFILL_ONLY → ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ ├── WRITE_ONLY → DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ └── WRITE_ONLY → ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ └── 13 Mutation operations + │ ├── SetColumnName {"ColumnID":3,"Name":"crdb_internal_co...","TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":2,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":2,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":3,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":3,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeIndexAbsent {"IndexID":2,"TableID":106} + │ ├── RemoveColumnNotNull {"ColumnID":3,"TableID":106} + │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":3,"TableID":106} + │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"PostCommitNonRev..."} + └── Stage 2 of 2 in PostCommitNonRevertiblePhase + ├── 5 elements transitioning toward ABSENT + │ ├── DELETE_ONLY → ABSENT Column:{DescID: 106, ColumnID: 3} + │ ├── PUBLIC → ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ ├── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 2} + │ ├── DELETE_ONLY → ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ └── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 3} + └── 6 Mutation operations + ├── CreateGCJobForIndex {"IndexID":2,"TableID":106} + ├── MakeIndexAbsent {"IndexID":3,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":3,"TableID":106} + ├── MakeDeleteOnlyColumnAbsent {"ColumnID":3,"TableID":106} + ├── RemoveJobStateFromDescriptor {"DescriptorID":106} + └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"all stages compl..."} diff --git a/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_3_of_7 b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_3_of_7 new file mode 100644 index 000000000000..86bbecbe1798 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_3_of_7 @@ -0,0 +1,52 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED; +EXPLAIN (ddl) rollback at post-commit stage 3 of 7; +---- +Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED; + └── PostCommitNonRevertiblePhase + ├── Stage 1 of 2 in PostCommitNonRevertiblePhase + │ ├── 11 elements transitioning toward ABSENT + │ │ ├── WRITE_ONLY → DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ ├── PUBLIC → ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ ├── BACKFILL_ONLY → ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ ├── WRITE_ONLY → DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ └── WRITE_ONLY → ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ └── 13 Mutation operations + │ ├── SetColumnName {"ColumnID":3,"Name":"crdb_internal_co...","TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":2,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":2,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":3,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":3,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeIndexAbsent {"IndexID":2,"TableID":106} + │ ├── RemoveColumnNotNull {"ColumnID":3,"TableID":106} + │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":3,"TableID":106} + │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"PostCommitNonRev..."} + └── Stage 2 of 2 in PostCommitNonRevertiblePhase + ├── 5 elements transitioning toward ABSENT + │ ├── DELETE_ONLY → ABSENT Column:{DescID: 106, ColumnID: 3} + │ ├── PUBLIC → ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ ├── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 2} + │ ├── DELETE_ONLY → ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ └── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 3} + └── 6 Mutation operations + ├── CreateGCJobForIndex {"IndexID":2,"TableID":106} + ├── MakeIndexAbsent {"IndexID":3,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":3,"TableID":106} + ├── MakeDeleteOnlyColumnAbsent {"ColumnID":3,"TableID":106} + ├── RemoveJobStateFromDescriptor {"DescriptorID":106} + └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"all stages compl..."} diff --git a/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_4_of_7 b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_4_of_7 new file mode 100644 index 000000000000..54840559d545 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_4_of_7 @@ -0,0 +1,52 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED; +EXPLAIN (ddl) rollback at post-commit stage 4 of 7; +---- +Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED; + └── PostCommitNonRevertiblePhase + ├── Stage 1 of 2 in PostCommitNonRevertiblePhase + │ ├── 11 elements transitioning toward ABSENT + │ │ ├── WRITE_ONLY → DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ ├── PUBLIC → ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ ├── DELETE_ONLY → ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ ├── WRITE_ONLY → DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ └── WRITE_ONLY → ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ └── 13 Mutation operations + │ ├── SetColumnName {"ColumnID":3,"Name":"crdb_internal_co...","TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":2,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":2,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":3,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":3,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeIndexAbsent {"IndexID":2,"TableID":106} + │ ├── RemoveColumnNotNull {"ColumnID":3,"TableID":106} + │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":3,"TableID":106} + │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"PostCommitNonRev..."} + └── Stage 2 of 2 in PostCommitNonRevertiblePhase + ├── 5 elements transitioning toward ABSENT + │ ├── DELETE_ONLY → ABSENT Column:{DescID: 106, ColumnID: 3} + │ ├── PUBLIC → ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ ├── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 2} + │ ├── DELETE_ONLY → ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ └── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 3} + └── 6 Mutation operations + ├── CreateGCJobForIndex {"IndexID":2,"TableID":106} + ├── MakeIndexAbsent {"IndexID":3,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":3,"TableID":106} + ├── MakeDeleteOnlyColumnAbsent {"ColumnID":3,"TableID":106} + ├── RemoveJobStateFromDescriptor {"DescriptorID":106} + └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"all stages compl..."} diff --git a/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_5_of_7 b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_5_of_7 new file mode 100644 index 000000000000..819f6be5e713 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_5_of_7 @@ -0,0 +1,54 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED; +EXPLAIN (ddl) rollback at post-commit stage 5 of 7; +---- +Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED; + └── PostCommitNonRevertiblePhase + ├── Stage 1 of 2 in PostCommitNonRevertiblePhase + │ ├── 11 elements transitioning toward ABSENT + │ │ ├── WRITE_ONLY → DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ ├── PUBLIC → ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ ├── MERGE_ONLY → DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ ├── WRITE_ONLY → DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ └── WRITE_ONLY → ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ └── 13 Mutation operations + │ ├── SetColumnName {"ColumnID":3,"Name":"crdb_internal_co...","TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":3,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":3,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":2,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":2,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── RemoveColumnNotNull {"ColumnID":3,"TableID":106} + │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":3,"TableID":106} + │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"PostCommitNonRev..."} + └── Stage 2 of 2 in PostCommitNonRevertiblePhase + ├── 6 elements transitioning toward ABSENT + │ ├── DELETE_ONLY → ABSENT Column:{DescID: 106, ColumnID: 3} + │ ├── PUBLIC → ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ ├── DELETE_ONLY → ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ ├── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 2} + │ ├── DELETE_ONLY → ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ └── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 3} + └── 7 Mutation operations + ├── MakeIndexAbsent {"IndexID":2,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":2,"TableID":106} + ├── MakeIndexAbsent {"IndexID":3,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":3,"TableID":106} + ├── MakeDeleteOnlyColumnAbsent {"ColumnID":3,"TableID":106} + ├── RemoveJobStateFromDescriptor {"DescriptorID":106} + └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"all stages compl..."} diff --git a/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_6_of_7 b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_6_of_7 new file mode 100644 index 000000000000..6935290e0aad --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_6_of_7 @@ -0,0 +1,54 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED; +EXPLAIN (ddl) rollback at post-commit stage 6 of 7; +---- +Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED; + └── PostCommitNonRevertiblePhase + ├── Stage 1 of 2 in PostCommitNonRevertiblePhase + │ ├── 11 elements transitioning toward ABSENT + │ │ ├── WRITE_ONLY → DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ ├── PUBLIC → ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ ├── MERGE_ONLY → DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ ├── WRITE_ONLY → DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ └── WRITE_ONLY → ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ └── 13 Mutation operations + │ ├── SetColumnName {"ColumnID":3,"Name":"crdb_internal_co...","TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":3,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":3,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":2,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":2,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── RemoveColumnNotNull {"ColumnID":3,"TableID":106} + │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":3,"TableID":106} + │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"PostCommitNonRev..."} + └── Stage 2 of 2 in PostCommitNonRevertiblePhase + ├── 6 elements transitioning toward ABSENT + │ ├── DELETE_ONLY → ABSENT Column:{DescID: 106, ColumnID: 3} + │ ├── PUBLIC → ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ ├── DELETE_ONLY → ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ ├── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 2} + │ ├── DELETE_ONLY → ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ └── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 3} + └── 7 Mutation operations + ├── MakeIndexAbsent {"IndexID":2,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":2,"TableID":106} + ├── MakeIndexAbsent {"IndexID":3,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":3,"TableID":106} + ├── MakeDeleteOnlyColumnAbsent {"ColumnID":3,"TableID":106} + ├── RemoveJobStateFromDescriptor {"DescriptorID":106} + └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"all stages compl..."} diff --git a/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_7_of_7 b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_7_of_7 new file mode 100644 index 000000000000..39e21f0dab4f --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored.rollback_7_of_7 @@ -0,0 +1,54 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED; +EXPLAIN (ddl) rollback at post-commit stage 7 of 7; +---- +Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED; + └── PostCommitNonRevertiblePhase + ├── Stage 1 of 2 in PostCommitNonRevertiblePhase + │ ├── 11 elements transitioning toward ABSENT + │ │ ├── WRITE_ONLY → DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ ├── PUBLIC → ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ ├── WRITE_ONLY → DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ ├── WRITE_ONLY → DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ └── WRITE_ONLY → ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ └── 13 Mutation operations + │ ├── SetColumnName {"ColumnID":3,"Name":"crdb_internal_co...","TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":2,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":2,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":3,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":3,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── RemoveColumnNotNull {"ColumnID":3,"TableID":106} + │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":3,"TableID":106} + │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"PostCommitNonRev..."} + └── Stage 2 of 2 in PostCommitNonRevertiblePhase + ├── 6 elements transitioning toward ABSENT + │ ├── DELETE_ONLY → ABSENT Column:{DescID: 106, ColumnID: 3} + │ ├── PUBLIC → ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ ├── DELETE_ONLY → ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ ├── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 2} + │ ├── DELETE_ONLY → ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ └── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 3} + └── 7 Mutation operations + ├── MakeIndexAbsent {"IndexID":2,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":2,"TableID":106} + ├── MakeIndexAbsent {"IndexID":3,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":3,"TableID":106} + ├── MakeDeleteOnlyColumnAbsent {"ColumnID":3,"TableID":106} + ├── RemoveJobStateFromDescriptor {"DescriptorID":106} + └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"all stages compl..."} diff --git a/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family new file mode 100644 index 000000000000..c384afc408dc --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family @@ -0,0 +1,198 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +EXPLAIN (ddl) ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED CREATE FAMILY bob; +---- +Schema change plan for ALTER TABLE ‹db›.‹public›.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED CREATE FAMILY ‹bob›; + ├── StatementPhase + │ └── Stage 1 of 1 in StatementPhase + │ ├── 9 elements transitioning toward PUBLIC + │ │ ├── ABSENT → DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ ├── ABSENT → PUBLIC ColumnFamily:{DescID: 106, Name: bob, ColumnFamilyID: 1} + │ │ ├── ABSENT → PUBLIC ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ ├── ABSENT → PUBLIC ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ ├── ABSENT → BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ ├── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ ├── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ ├── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ └── ABSENT → PUBLIC IndexData:{DescID: 106, IndexID: 2} + │ ├── 4 elements transitioning toward TRANSIENT_ABSENT + │ │ ├── ABSENT → DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ ├── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ ├── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ └── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ └── 12 Mutation operations + │ ├── MakeAbsentColumnDeleteOnly {"Column":{"ColumnID":3,"PgAttributeNum":3,"TableID":106}} + │ ├── AddColumnFamily {"FamilyID":1,"Name":"bob","TableID":106} + │ ├── SetColumnName {"ColumnID":3,"Name":"j","TableID":106} + │ ├── SetAddedColumnType {"ColumnType":{"ColumnID":3,"FamilyID":1,"TableID":106}} + │ ├── MakeAbsentIndexBackfilling {"Index":{"ConstraintID":2,"IndexID":2,"IsUnique":true,"SourceIndexID":1,"TableID":106,"TemporaryIndexID":3}} + │ ├── AddColumnToIndex {"ColumnID":1,"IndexID":2,"TableID":106} + │ ├── AddColumnToIndex {"ColumnID":2,"IndexID":2,"Kind":2,"TableID":106} + │ ├── AddColumnToIndex {"ColumnID":3,"IndexID":2,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeAbsentTempIndexDeleteOnly {"Index":{"ConstraintID":3,"IndexID":3,"IsUnique":true,"SourceIndexID":1,"TableID":106}} + │ ├── AddColumnToIndex {"ColumnID":1,"IndexID":3,"TableID":106} + │ ├── AddColumnToIndex {"ColumnID":2,"IndexID":3,"Kind":2,"TableID":106} + │ └── AddColumnToIndex {"ColumnID":3,"IndexID":3,"Kind":2,"Ordinal":1,"TableID":106} + ├── PreCommitPhase + │ ├── Stage 1 of 2 in PreCommitPhase + │ │ ├── 9 elements transitioning toward PUBLIC + │ │ │ ├── DELETE_ONLY → ABSENT Column:{DescID: 106, ColumnID: 3} + │ │ │ ├── PUBLIC → ABSENT ColumnFamily:{DescID: 106, Name: bob, ColumnFamilyID: 1} + │ │ │ ├── PUBLIC → ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ ├── PUBLIC → ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ │ ├── BACKFILL_ONLY → ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ └── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 2} + │ │ ├── 4 elements transitioning toward TRANSIENT_ABSENT + │ │ │ ├── DELETE_ONLY → ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ └── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ └── 1 Mutation operation + │ │ └── UndoAllInTxnImmediateMutationOpSideEffects + │ └── Stage 2 of 2 in PreCommitPhase + │ ├── 9 elements transitioning toward PUBLIC + │ │ ├── ABSENT → DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ ├── ABSENT → PUBLIC ColumnFamily:{DescID: 106, Name: bob, ColumnFamilyID: 1} + │ │ ├── ABSENT → PUBLIC ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ ├── ABSENT → PUBLIC ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ ├── ABSENT → BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ ├── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ ├── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ ├── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ └── ABSENT → PUBLIC IndexData:{DescID: 106, IndexID: 2} + │ ├── 4 elements transitioning toward TRANSIENT_ABSENT + │ │ ├── ABSENT → DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ ├── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ ├── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ └── ABSENT → PUBLIC IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ └── 16 Mutation operations + │ ├── MakeAbsentColumnDeleteOnly {"Column":{"ColumnID":3,"PgAttributeNum":3,"TableID":106}} + │ ├── AddColumnFamily {"FamilyID":1,"Name":"bob","TableID":106} + │ ├── SetColumnName {"ColumnID":3,"Name":"j","TableID":106} + │ ├── SetAddedColumnType {"ColumnType":{"ColumnID":3,"FamilyID":1,"TableID":106}} + │ ├── MakeAbsentIndexBackfilling {"Index":{"ConstraintID":2,"IndexID":2,"IsUnique":true,"SourceIndexID":1,"TableID":106,"TemporaryIndexID":3}} + │ ├── MaybeAddSplitForIndex {"IndexID":2,"TableID":106} + │ ├── AddColumnToIndex {"ColumnID":1,"IndexID":2,"TableID":106} + │ ├── AddColumnToIndex {"ColumnID":2,"IndexID":2,"Kind":2,"TableID":106} + │ ├── AddColumnToIndex {"ColumnID":3,"IndexID":2,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeAbsentTempIndexDeleteOnly {"Index":{"ConstraintID":3,"IndexID":3,"IsUnique":true,"SourceIndexID":1,"TableID":106}} + │ ├── MaybeAddSplitForIndex {"IndexID":3,"TableID":106} + │ ├── AddColumnToIndex {"ColumnID":1,"IndexID":3,"TableID":106} + │ ├── AddColumnToIndex {"ColumnID":2,"IndexID":3,"Kind":2,"TableID":106} + │ ├── AddColumnToIndex {"ColumnID":3,"IndexID":3,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── SetJobStateOnDescriptor {"DescriptorID":106,"Initialize":true} + │ └── CreateSchemaChangerJob {"RunningStatus":"PostCommitPhase ..."} + ├── PostCommitPhase + │ ├── Stage 1 of 7 in PostCommitPhase + │ │ ├── 2 elements transitioning toward PUBLIC + │ │ │ ├── DELETE_ONLY → WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ └── ABSENT → WRITE_ONLY ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ ├── 2 elements transitioning toward TRANSIENT_ABSENT + │ │ │ ├── DELETE_ONLY → WRITE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ └── ABSENT → PUBLIC IndexData:{DescID: 106, IndexID: 3} + │ │ └── 5 Mutation operations + │ │ ├── MakeDeleteOnlyColumnWriteOnly {"ColumnID":3,"TableID":106} + │ │ ├── MakeDeleteOnlyIndexWriteOnly {"IndexID":3,"TableID":106} + │ │ ├── MakeAbsentColumnNotNullWriteOnly {"ColumnID":3,"TableID":106} + │ │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ │ └── UpdateSchemaChangerJob {"RunningStatus":"PostCommitPhase ..."} + │ ├── Stage 2 of 7 in PostCommitPhase + │ │ ├── 1 element transitioning toward PUBLIC + │ │ │ └── BACKFILL_ONLY → BACKFILLED PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ └── 1 Backfill operation + │ │ └── BackfillIndex {"IndexID":2,"SourceIndexID":1,"TableID":106} + │ ├── Stage 3 of 7 in PostCommitPhase + │ │ ├── 1 element transitioning toward PUBLIC + │ │ │ └── BACKFILLED → DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ └── 3 Mutation operations + │ │ ├── MakeBackfillingIndexDeleteOnly {"IndexID":2,"TableID":106} + │ │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ │ └── UpdateSchemaChangerJob {"RunningStatus":"PostCommitPhase ..."} + │ ├── Stage 4 of 7 in PostCommitPhase + │ │ ├── 1 element transitioning toward PUBLIC + │ │ │ └── DELETE_ONLY → MERGE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ └── 3 Mutation operations + │ │ ├── MakeBackfilledIndexMerging {"IndexID":2,"TableID":106} + │ │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ │ └── UpdateSchemaChangerJob {"RunningStatus":"PostCommitPhase ..."} + │ ├── Stage 5 of 7 in PostCommitPhase + │ │ ├── 1 element transitioning toward PUBLIC + │ │ │ └── MERGE_ONLY → MERGED PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ └── 1 Backfill operation + │ │ └── MergeIndex {"BackfilledIndexID":2,"TableID":106,"TemporaryIndexID":3} + │ ├── Stage 6 of 7 in PostCommitPhase + │ │ ├── 1 element transitioning toward PUBLIC + │ │ │ └── MERGED → WRITE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ └── 3 Mutation operations + │ │ ├── MakeMergedIndexWriteOnly {"IndexID":2,"TableID":106} + │ │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ │ └── UpdateSchemaChangerJob {"RunningStatus":"PostCommitPhase ..."} + │ └── Stage 7 of 7 in PostCommitPhase + │ ├── 2 elements transitioning toward PUBLIC + │ │ ├── WRITE_ONLY → VALIDATED PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ └── WRITE_ONLY → VALIDATED ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ └── 2 Validation operations + │ ├── ValidateIndex {"IndexID":2,"TableID":106} + │ └── ValidateColumnNotNull {"ColumnID":3,"IndexIDForValidation":2,"TableID":106} + └── PostCommitNonRevertiblePhase + ├── Stage 1 of 3 in PostCommitNonRevertiblePhase + │ ├── 4 elements transitioning toward PUBLIC + │ │ ├── WRITE_ONLY → PUBLIC Column:{DescID: 106, ColumnID: 3} + │ │ ├── VALIDATED → PUBLIC PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ ├── ABSENT → PUBLIC IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 2} + │ │ └── VALIDATED → PUBLIC ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ ├── 4 elements transitioning toward TRANSIENT_ABSENT + │ │ ├── WRITE_ONLY → TRANSIENT_DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → TRANSIENT_ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ ├── PUBLIC → TRANSIENT_ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ └── PUBLIC → TRANSIENT_ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ ├── 2 elements transitioning toward ABSENT + │ │ ├── PUBLIC → VALIDATED PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ └── PUBLIC → ABSENT IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 1} + │ └── 13 Mutation operations + │ ├── MakePublicPrimaryIndexWriteOnly {"IndexID":1,"TableID":106} + │ ├── SetIndexName {"IndexID":1,"Name":"crdb_internal_in...","TableID":106} + │ ├── SetIndexName {"IndexID":2,"Name":"tbl_pkey","TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":3,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":3,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeValidatedColumnNotNullPublic {"ColumnID":3,"TableID":106} + │ ├── MakeValidatedPrimaryIndexPublic {"IndexID":2,"TableID":106} + │ ├── MakeWriteOnlyColumnPublic {"ColumnID":3,"TableID":106} + │ ├── RefreshStats {"TableID":106} + │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"PostCommitNonRev..."} + ├── Stage 2 of 3 in PostCommitNonRevertiblePhase + │ ├── 1 element transitioning toward TRANSIENT_ABSENT + │ │ └── TRANSIENT_DELETE_ONLY → TRANSIENT_ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ ├── 3 elements transitioning toward ABSENT + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 1} + │ │ └── VALIDATED → DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ └── 6 Mutation operations + │ ├── MakeIndexAbsent {"IndexID":3,"TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":1,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":1,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":1,"Kind":2,"TableID":106} + │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"PostCommitNonRev..."} + └── Stage 3 of 3 in PostCommitNonRevertiblePhase + ├── 1 element transitioning toward TRANSIENT_ABSENT + │ └── PUBLIC → TRANSIENT_ABSENT IndexData:{DescID: 106, IndexID: 3} + ├── 2 elements transitioning toward ABSENT + │ ├── DELETE_ONLY → ABSENT PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ └── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 1} + └── 5 Mutation operations + ├── MakeIndexAbsent {"IndexID":1,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":1,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":3,"TableID":106} + ├── RemoveJobStateFromDescriptor {"DescriptorID":106} + └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"all stages compl..."} diff --git a/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_1_of_7 b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_1_of_7 new file mode 100644 index 000000000000..c44aa791b7a3 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_1_of_7 @@ -0,0 +1,41 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED CREATE FAMILY bob; +EXPLAIN (ddl) rollback at post-commit stage 1 of 7; +---- +Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED CREATE FAMILY ‹bob›; + └── PostCommitNonRevertiblePhase + └── Stage 1 of 1 in PostCommitNonRevertiblePhase + ├── 13 elements transitioning toward ABSENT + │ ├── DELETE_ONLY → ABSENT Column:{DescID: 106, ColumnID: 3} + │ ├── PUBLIC → ABSENT ColumnFamily:{DescID: 106, Name: bob, ColumnFamilyID: 1} + │ ├── PUBLIC → ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ ├── PUBLIC → ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ ├── BACKFILL_ONLY → ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ ├── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 2} + │ ├── DELETE_ONLY → ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ └── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + └── 14 Mutation operations + ├── SetColumnName {"ColumnID":3,"Name":"crdb_internal_co...","TableID":106} + ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":2,"TableID":106} + ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":2,"Kind":2,"TableID":106} + ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":2,"Kind":2,"Ordinal":1,"TableID":106} + ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":3,"TableID":106} + ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":3,"Kind":2,"TableID":106} + ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":3,"Kind":2,"Ordinal":1,"TableID":106} + ├── MakeIndexAbsent {"IndexID":2,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":2,"TableID":106} + ├── MakeIndexAbsent {"IndexID":3,"TableID":106} + ├── MakeDeleteOnlyColumnAbsent {"ColumnID":3,"TableID":106} + ├── AssertColumnFamilyIsRemoved {"FamilyID":1,"TableID":106} + ├── RemoveJobStateFromDescriptor {"DescriptorID":106} + └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"all stages compl..."} diff --git a/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_2_of_7 b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_2_of_7 new file mode 100644 index 000000000000..a9e796abb330 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_2_of_7 @@ -0,0 +1,54 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED CREATE FAMILY bob; +EXPLAIN (ddl) rollback at post-commit stage 2 of 7; +---- +Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED CREATE FAMILY ‹bob›; + └── PostCommitNonRevertiblePhase + ├── Stage 1 of 2 in PostCommitNonRevertiblePhase + │ ├── 11 elements transitioning toward ABSENT + │ │ ├── WRITE_ONLY → DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ ├── PUBLIC → ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ ├── BACKFILL_ONLY → ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ ├── WRITE_ONLY → DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ └── WRITE_ONLY → ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ └── 13 Mutation operations + │ ├── SetColumnName {"ColumnID":3,"Name":"crdb_internal_co...","TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":2,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":2,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":3,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":3,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeIndexAbsent {"IndexID":2,"TableID":106} + │ ├── RemoveColumnNotNull {"ColumnID":3,"TableID":106} + │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":3,"TableID":106} + │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"PostCommitNonRev..."} + └── Stage 2 of 2 in PostCommitNonRevertiblePhase + ├── 6 elements transitioning toward ABSENT + │ ├── DELETE_ONLY → ABSENT Column:{DescID: 106, ColumnID: 3} + │ ├── PUBLIC → ABSENT ColumnFamily:{DescID: 106, Name: bob, ColumnFamilyID: 1} + │ ├── PUBLIC → ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ ├── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 2} + │ ├── DELETE_ONLY → ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ └── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 3} + └── 7 Mutation operations + ├── CreateGCJobForIndex {"IndexID":2,"TableID":106} + ├── MakeIndexAbsent {"IndexID":3,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":3,"TableID":106} + ├── MakeDeleteOnlyColumnAbsent {"ColumnID":3,"TableID":106} + ├── AssertColumnFamilyIsRemoved {"FamilyID":1,"TableID":106} + ├── RemoveJobStateFromDescriptor {"DescriptorID":106} + └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"all stages compl..."} diff --git a/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_3_of_7 b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_3_of_7 new file mode 100644 index 000000000000..7a05a3c4dcf9 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_3_of_7 @@ -0,0 +1,54 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED CREATE FAMILY bob; +EXPLAIN (ddl) rollback at post-commit stage 3 of 7; +---- +Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED CREATE FAMILY ‹bob›; + └── PostCommitNonRevertiblePhase + ├── Stage 1 of 2 in PostCommitNonRevertiblePhase + │ ├── 11 elements transitioning toward ABSENT + │ │ ├── WRITE_ONLY → DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ ├── PUBLIC → ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ ├── BACKFILL_ONLY → ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ ├── WRITE_ONLY → DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ └── WRITE_ONLY → ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ └── 13 Mutation operations + │ ├── SetColumnName {"ColumnID":3,"Name":"crdb_internal_co...","TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":2,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":2,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":3,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":3,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeIndexAbsent {"IndexID":2,"TableID":106} + │ ├── RemoveColumnNotNull {"ColumnID":3,"TableID":106} + │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":3,"TableID":106} + │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"PostCommitNonRev..."} + └── Stage 2 of 2 in PostCommitNonRevertiblePhase + ├── 6 elements transitioning toward ABSENT + │ ├── DELETE_ONLY → ABSENT Column:{DescID: 106, ColumnID: 3} + │ ├── PUBLIC → ABSENT ColumnFamily:{DescID: 106, Name: bob, ColumnFamilyID: 1} + │ ├── PUBLIC → ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ ├── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 2} + │ ├── DELETE_ONLY → ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ └── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 3} + └── 7 Mutation operations + ├── CreateGCJobForIndex {"IndexID":2,"TableID":106} + ├── MakeIndexAbsent {"IndexID":3,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":3,"TableID":106} + ├── MakeDeleteOnlyColumnAbsent {"ColumnID":3,"TableID":106} + ├── AssertColumnFamilyIsRemoved {"FamilyID":1,"TableID":106} + ├── RemoveJobStateFromDescriptor {"DescriptorID":106} + └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"all stages compl..."} diff --git a/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_4_of_7 b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_4_of_7 new file mode 100644 index 000000000000..2b2910fe2b22 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_4_of_7 @@ -0,0 +1,54 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED CREATE FAMILY bob; +EXPLAIN (ddl) rollback at post-commit stage 4 of 7; +---- +Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED CREATE FAMILY ‹bob›; + └── PostCommitNonRevertiblePhase + ├── Stage 1 of 2 in PostCommitNonRevertiblePhase + │ ├── 11 elements transitioning toward ABSENT + │ │ ├── WRITE_ONLY → DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ ├── PUBLIC → ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ ├── DELETE_ONLY → ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ ├── WRITE_ONLY → DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ └── WRITE_ONLY → ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ └── 13 Mutation operations + │ ├── SetColumnName {"ColumnID":3,"Name":"crdb_internal_co...","TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":2,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":2,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":3,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":3,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeIndexAbsent {"IndexID":2,"TableID":106} + │ ├── RemoveColumnNotNull {"ColumnID":3,"TableID":106} + │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":3,"TableID":106} + │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"PostCommitNonRev..."} + └── Stage 2 of 2 in PostCommitNonRevertiblePhase + ├── 6 elements transitioning toward ABSENT + │ ├── DELETE_ONLY → ABSENT Column:{DescID: 106, ColumnID: 3} + │ ├── PUBLIC → ABSENT ColumnFamily:{DescID: 106, Name: bob, ColumnFamilyID: 1} + │ ├── PUBLIC → ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ ├── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 2} + │ ├── DELETE_ONLY → ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ └── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 3} + └── 7 Mutation operations + ├── CreateGCJobForIndex {"IndexID":2,"TableID":106} + ├── MakeIndexAbsent {"IndexID":3,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":3,"TableID":106} + ├── MakeDeleteOnlyColumnAbsent {"ColumnID":3,"TableID":106} + ├── AssertColumnFamilyIsRemoved {"FamilyID":1,"TableID":106} + ├── RemoveJobStateFromDescriptor {"DescriptorID":106} + └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"all stages compl..."} diff --git a/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_5_of_7 b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_5_of_7 new file mode 100644 index 000000000000..2aacaead247b --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_5_of_7 @@ -0,0 +1,56 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED CREATE FAMILY bob; +EXPLAIN (ddl) rollback at post-commit stage 5 of 7; +---- +Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED CREATE FAMILY ‹bob›; + └── PostCommitNonRevertiblePhase + ├── Stage 1 of 2 in PostCommitNonRevertiblePhase + │ ├── 11 elements transitioning toward ABSENT + │ │ ├── WRITE_ONLY → DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ ├── PUBLIC → ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ ├── MERGE_ONLY → DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ ├── WRITE_ONLY → DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ └── WRITE_ONLY → ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ └── 13 Mutation operations + │ ├── SetColumnName {"ColumnID":3,"Name":"crdb_internal_co...","TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":3,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":3,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":2,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":2,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── RemoveColumnNotNull {"ColumnID":3,"TableID":106} + │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":3,"TableID":106} + │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"PostCommitNonRev..."} + └── Stage 2 of 2 in PostCommitNonRevertiblePhase + ├── 7 elements transitioning toward ABSENT + │ ├── DELETE_ONLY → ABSENT Column:{DescID: 106, ColumnID: 3} + │ ├── PUBLIC → ABSENT ColumnFamily:{DescID: 106, Name: bob, ColumnFamilyID: 1} + │ ├── PUBLIC → ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ ├── DELETE_ONLY → ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ ├── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 2} + │ ├── DELETE_ONLY → ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ └── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 3} + └── 8 Mutation operations + ├── MakeIndexAbsent {"IndexID":2,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":2,"TableID":106} + ├── MakeIndexAbsent {"IndexID":3,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":3,"TableID":106} + ├── MakeDeleteOnlyColumnAbsent {"ColumnID":3,"TableID":106} + ├── AssertColumnFamilyIsRemoved {"FamilyID":1,"TableID":106} + ├── RemoveJobStateFromDescriptor {"DescriptorID":106} + └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"all stages compl..."} diff --git a/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_6_of_7 b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_6_of_7 new file mode 100644 index 000000000000..47b9eabcd8c0 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_6_of_7 @@ -0,0 +1,56 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED CREATE FAMILY bob; +EXPLAIN (ddl) rollback at post-commit stage 6 of 7; +---- +Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED CREATE FAMILY ‹bob›; + └── PostCommitNonRevertiblePhase + ├── Stage 1 of 2 in PostCommitNonRevertiblePhase + │ ├── 11 elements transitioning toward ABSENT + │ │ ├── WRITE_ONLY → DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ ├── PUBLIC → ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ ├── MERGE_ONLY → DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ ├── WRITE_ONLY → DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ └── WRITE_ONLY → ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ └── 13 Mutation operations + │ ├── SetColumnName {"ColumnID":3,"Name":"crdb_internal_co...","TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":3,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":3,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":2,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":2,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── RemoveColumnNotNull {"ColumnID":3,"TableID":106} + │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":3,"TableID":106} + │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"PostCommitNonRev..."} + └── Stage 2 of 2 in PostCommitNonRevertiblePhase + ├── 7 elements transitioning toward ABSENT + │ ├── DELETE_ONLY → ABSENT Column:{DescID: 106, ColumnID: 3} + │ ├── PUBLIC → ABSENT ColumnFamily:{DescID: 106, Name: bob, ColumnFamilyID: 1} + │ ├── PUBLIC → ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ ├── DELETE_ONLY → ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ ├── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 2} + │ ├── DELETE_ONLY → ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ └── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 3} + └── 8 Mutation operations + ├── MakeIndexAbsent {"IndexID":2,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":2,"TableID":106} + ├── MakeIndexAbsent {"IndexID":3,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":3,"TableID":106} + ├── MakeDeleteOnlyColumnAbsent {"ColumnID":3,"TableID":106} + ├── AssertColumnFamilyIsRemoved {"FamilyID":1,"TableID":106} + ├── RemoveJobStateFromDescriptor {"DescriptorID":106} + └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"all stages compl..."} diff --git a/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_7_of_7 b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_7_of_7 new file mode 100644 index 000000000000..05702f50767c --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain/add_column_with_stored_family.rollback_7_of_7 @@ -0,0 +1,56 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED CREATE FAMILY bob; +EXPLAIN (ddl) rollback at post-commit stage 7 of 7; +---- +Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED CREATE FAMILY ‹bob›; + └── PostCommitNonRevertiblePhase + ├── Stage 1 of 2 in PostCommitNonRevertiblePhase + │ ├── 11 elements transitioning toward ABSENT + │ │ ├── WRITE_ONLY → DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ ├── PUBLIC → ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ ├── WRITE_ONLY → DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ ├── WRITE_ONLY → DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ ├── PUBLIC → ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ └── WRITE_ONLY → ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ └── 13 Mutation operations + │ ├── SetColumnName {"ColumnID":3,"Name":"crdb_internal_co...","TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":2,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":2,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":3,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":2,"IndexID":3,"Kind":2,"TableID":106} + │ ├── RemoveColumnFromIndex {"ColumnID":3,"IndexID":3,"Kind":2,"Ordinal":1,"TableID":106} + │ ├── RemoveColumnNotNull {"ColumnID":3,"TableID":106} + │ ├── MakeWriteOnlyColumnDeleteOnly {"ColumnID":3,"TableID":106} + │ ├── SetJobStateOnDescriptor {"DescriptorID":106} + │ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"PostCommitNonRev..."} + └── Stage 2 of 2 in PostCommitNonRevertiblePhase + ├── 7 elements transitioning toward ABSENT + │ ├── DELETE_ONLY → ABSENT Column:{DescID: 106, ColumnID: 3} + │ ├── PUBLIC → ABSENT ColumnFamily:{DescID: 106, Name: bob, ColumnFamilyID: 1} + │ ├── PUBLIC → ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ ├── DELETE_ONLY → ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ ├── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 2} + │ ├── DELETE_ONLY → ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ └── PUBLIC → ABSENT IndexData:{DescID: 106, IndexID: 3} + └── 8 Mutation operations + ├── MakeIndexAbsent {"IndexID":2,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":2,"TableID":106} + ├── MakeIndexAbsent {"IndexID":3,"TableID":106} + ├── CreateGCJobForIndex {"IndexID":3,"TableID":106} + ├── MakeDeleteOnlyColumnAbsent {"ColumnID":3,"TableID":106} + ├── AssertColumnFamilyIsRemoved {"FamilyID":1,"TableID":106} + ├── RemoveJobStateFromDescriptor {"DescriptorID":106} + └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"all stages compl..."} diff --git a/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored new file mode 100644 index 000000000000..85cda324878d --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored @@ -0,0 +1,947 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +EXPLAIN (ddl, verbose) ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED; +---- +• Schema change plan for ALTER TABLE ‹db›.‹public›.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED; +│ +├── • StatementPhase +│ │ +│ └── • Stage 1 of 1 in StatementPhase +│ │ +│ ├── • 8 elements transitioning toward PUBLIC +│ │ │ +│ │ ├── • Column:{DescID: 106, ColumnID: 3} +│ │ │ │ ABSENT → DELETE_ONLY +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from ABSENT Column:{DescID: 106, ColumnID: 3} +│ │ │ rule: "Column transitions to PUBLIC uphold 2-version invariant: ABSENT->DELETE_ONLY" +│ │ │ +│ │ ├── • ColumnName:{DescID: 106, Name: j, ColumnID: 3} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • SameStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ rule: "column existence precedes column dependents" +│ │ │ rule: "column name and type set right after column existence" +│ │ │ +│ │ ├── • ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • SameStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ rule: "column existence precedes column dependents" +│ │ │ rule: "column name and type set right after column existence" +│ │ │ +│ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ │ ABSENT → BACKFILL_ONLY +│ │ │ │ +│ │ │ ├── • Precedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ │ rule: "column existence precedes index existence" +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "PrimaryIndex transitions to PUBLIC uphold 2-version invariant: ABSENT->BACKFILL_ONLY" +│ │ │ +│ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • Precedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "index existence precedes index dependents" +│ │ │ +│ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • Precedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "index existence precedes index dependents" +│ │ │ +│ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ ├── • Precedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ │ rule: "column existence precedes column dependents" +│ │ │ │ +│ │ │ └── • Precedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "index existence precedes index dependents" +│ │ │ +│ │ └── • IndexData:{DescID: 106, IndexID: 2} +│ │ │ ABSENT → PUBLIC +│ │ │ +│ │ └── • SameStagePrecedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ rule: "index data exists as soon as index accepts backfills" +│ │ +│ ├── • 4 elements transitioning toward TRANSIENT_ABSENT +│ │ │ +│ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ │ ABSENT → DELETE_ONLY +│ │ │ │ +│ │ │ ├── • Precedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ │ rule: "column existence precedes temp index existence" +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ rule: "TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: ABSENT->DELETE_ONLY" +│ │ │ +│ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ rule: "temp index existence precedes index dependents" +│ │ │ +│ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ rule: "temp index existence precedes index dependents" +│ │ │ +│ │ └── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} +│ │ │ ABSENT → PUBLIC +│ │ │ +│ │ ├── • Precedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ rule: "column existence precedes column dependents" +│ │ │ +│ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ rule: "temp index existence precedes index dependents" +│ │ +│ └── • 11 Mutation operations +│ │ +│ ├── • MakeAbsentColumnDeleteOnly +│ │ Column: +│ │ ColumnID: 3 +│ │ PgAttributeNum: 3 +│ │ TableID: 106 +│ │ +│ ├── • SetColumnName +│ │ ColumnID: 3 +│ │ Name: j +│ │ TableID: 106 +│ │ +│ ├── • SetAddedColumnType +│ │ ColumnType: +│ │ ColumnID: 3 +│ │ ComputeExpr: +│ │ expr: k +│ │ referencedColumnIds: +│ │ - 2 +│ │ ElementCreationMetadata: +│ │ in231OrLater: true +│ │ TableID: 106 +│ │ TypeT: +│ │ Type: +│ │ family: IntFamily +│ │ oid: 20 +│ │ width: 64 +│ │ +│ ├── • MakeAbsentIndexBackfilling +│ │ Index: +│ │ ConstraintID: 2 +│ │ IndexID: 2 +│ │ IsUnique: true +│ │ SourceIndexID: 1 +│ │ TableID: 106 +│ │ TemporaryIndexID: 3 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 1 +│ │ IndexID: 2 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 2 +│ │ IndexID: 2 +│ │ Kind: 2 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 3 +│ │ IndexID: 2 +│ │ Kind: 2 +│ │ Ordinal: 1 +│ │ TableID: 106 +│ │ +│ ├── • MakeAbsentTempIndexDeleteOnly +│ │ Index: +│ │ ConstraintID: 3 +│ │ IndexID: 3 +│ │ IsUnique: true +│ │ SourceIndexID: 1 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 1 +│ │ IndexID: 3 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 2 +│ │ IndexID: 3 +│ │ Kind: 2 +│ │ TableID: 106 +│ │ +│ └── • AddColumnToIndex +│ ColumnID: 3 +│ IndexID: 3 +│ Kind: 2 +│ Ordinal: 1 +│ TableID: 106 +│ +├── • PreCommitPhase +│ │ +│ ├── • Stage 1 of 2 in PreCommitPhase +│ │ │ +│ │ ├── • 8 elements transitioning toward PUBLIC +│ │ │ │ +│ │ │ ├── • Column:{DescID: 106, ColumnID: 3} +│ │ │ │ DELETE_ONLY → ABSENT +│ │ │ │ +│ │ │ ├── • ColumnName:{DescID: 106, Name: j, ColumnID: 3} +│ │ │ │ PUBLIC → ABSENT +│ │ │ │ +│ │ │ ├── • ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} +│ │ │ │ PUBLIC → ABSENT +│ │ │ │ +│ │ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ │ BACKFILL_ONLY → ABSENT +│ │ │ │ +│ │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} +│ │ │ │ PUBLIC → ABSENT +│ │ │ │ +│ │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} +│ │ │ │ PUBLIC → ABSENT +│ │ │ │ +│ │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} +│ │ │ │ PUBLIC → ABSENT +│ │ │ │ +│ │ │ └── • IndexData:{DescID: 106, IndexID: 2} +│ │ │ PUBLIC → ABSENT +│ │ │ +│ │ ├── • 4 elements transitioning toward TRANSIENT_ABSENT +│ │ │ │ +│ │ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ │ DELETE_ONLY → ABSENT +│ │ │ │ +│ │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} +│ │ │ │ PUBLIC → ABSENT +│ │ │ │ +│ │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} +│ │ │ │ PUBLIC → ABSENT +│ │ │ │ +│ │ │ └── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} +│ │ │ PUBLIC → ABSENT +│ │ │ +│ │ └── • 1 Mutation operation +│ │ │ +│ │ └── • UndoAllInTxnImmediateMutationOpSideEffects +│ │ {} +│ │ +│ └── • Stage 2 of 2 in PreCommitPhase +│ │ +│ ├── • 8 elements transitioning toward PUBLIC +│ │ │ +│ │ ├── • Column:{DescID: 106, ColumnID: 3} +│ │ │ │ ABSENT → DELETE_ONLY +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from ABSENT Column:{DescID: 106, ColumnID: 3} +│ │ │ rule: "Column transitions to PUBLIC uphold 2-version invariant: ABSENT->DELETE_ONLY" +│ │ │ +│ │ ├── • ColumnName:{DescID: 106, Name: j, ColumnID: 3} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • SameStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ rule: "column existence precedes column dependents" +│ │ │ rule: "column name and type set right after column existence" +│ │ │ +│ │ ├── • ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • SameStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ rule: "column existence precedes column dependents" +│ │ │ rule: "column name and type set right after column existence" +│ │ │ +│ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ │ ABSENT → BACKFILL_ONLY +│ │ │ │ +│ │ │ ├── • Precedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ │ rule: "column existence precedes index existence" +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "PrimaryIndex transitions to PUBLIC uphold 2-version invariant: ABSENT->BACKFILL_ONLY" +│ │ │ +│ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • Precedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "index existence precedes index dependents" +│ │ │ +│ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • Precedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "index existence precedes index dependents" +│ │ │ +│ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ ├── • Precedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ │ rule: "column existence precedes column dependents" +│ │ │ │ +│ │ │ └── • Precedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "index existence precedes index dependents" +│ │ │ +│ │ └── • IndexData:{DescID: 106, IndexID: 2} +│ │ │ ABSENT → PUBLIC +│ │ │ +│ │ └── • SameStagePrecedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ rule: "index data exists as soon as index accepts backfills" +│ │ +│ ├── • 4 elements transitioning toward TRANSIENT_ABSENT +│ │ │ +│ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ │ ABSENT → DELETE_ONLY +│ │ │ │ +│ │ │ ├── • Precedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ │ rule: "column existence precedes temp index existence" +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ rule: "TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: ABSENT->DELETE_ONLY" +│ │ │ +│ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ rule: "temp index existence precedes index dependents" +│ │ │ +│ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ rule: "temp index existence precedes index dependents" +│ │ │ +│ │ └── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} +│ │ │ ABSENT → PUBLIC +│ │ │ +│ │ ├── • Precedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ rule: "column existence precedes column dependents" +│ │ │ +│ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ rule: "temp index existence precedes index dependents" +│ │ +│ └── • 15 Mutation operations +│ │ +│ ├── • MakeAbsentColumnDeleteOnly +│ │ Column: +│ │ ColumnID: 3 +│ │ PgAttributeNum: 3 +│ │ TableID: 106 +│ │ +│ ├── • SetColumnName +│ │ ColumnID: 3 +│ │ Name: j +│ │ TableID: 106 +│ │ +│ ├── • SetAddedColumnType +│ │ ColumnType: +│ │ ColumnID: 3 +│ │ ComputeExpr: +│ │ expr: k +│ │ referencedColumnIds: +│ │ - 2 +│ │ ElementCreationMetadata: +│ │ in231OrLater: true +│ │ TableID: 106 +│ │ TypeT: +│ │ Type: +│ │ family: IntFamily +│ │ oid: 20 +│ │ width: 64 +│ │ +│ ├── • MakeAbsentIndexBackfilling +│ │ Index: +│ │ ConstraintID: 2 +│ │ IndexID: 2 +│ │ IsUnique: true +│ │ SourceIndexID: 1 +│ │ TableID: 106 +│ │ TemporaryIndexID: 3 +│ │ +│ ├── • MaybeAddSplitForIndex +│ │ IndexID: 2 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 1 +│ │ IndexID: 2 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 2 +│ │ IndexID: 2 +│ │ Kind: 2 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 3 +│ │ IndexID: 2 +│ │ Kind: 2 +│ │ Ordinal: 1 +│ │ TableID: 106 +│ │ +│ ├── • MakeAbsentTempIndexDeleteOnly +│ │ Index: +│ │ ConstraintID: 3 +│ │ IndexID: 3 +│ │ IsUnique: true +│ │ SourceIndexID: 1 +│ │ TableID: 106 +│ │ +│ ├── • MaybeAddSplitForIndex +│ │ IndexID: 3 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 1 +│ │ IndexID: 3 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 2 +│ │ IndexID: 3 +│ │ Kind: 2 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 3 +│ │ IndexID: 3 +│ │ Kind: 2 +│ │ Ordinal: 1 +│ │ TableID: 106 +│ │ +│ ├── • SetJobStateOnDescriptor +│ │ DescriptorID: 106 +│ │ Initialize: true +│ │ +│ └── • CreateSchemaChangerJob +│ Authorization: +│ UserName: root +│ DescriptorIDs: +│ - 106 +│ JobID: 1 +│ RunningStatus: PostCommitPhase stage 1 of 7 with 3 MutationType ops pending +│ Statements: +│ - statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED +│ redactedstatement: ALTER TABLE ‹db›.‹public›.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL +│ AS (‹k›) STORED +│ statementtag: ALTER TABLE +│ +├── • PostCommitPhase +│ │ +│ ├── • Stage 1 of 7 in PostCommitPhase +│ │ │ +│ │ ├── • 2 elements transitioning toward PUBLIC +│ │ │ │ +│ │ │ ├── • Column:{DescID: 106, ColumnID: 3} +│ │ │ │ │ DELETE_ONLY → WRITE_ONLY +│ │ │ │ │ +│ │ │ │ └── • PreviousStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ │ rule: "Column transitions to PUBLIC uphold 2-version invariant: DELETE_ONLY->WRITE_ONLY" +│ │ │ │ +│ │ │ └── • ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} +│ │ │ │ ABSENT → WRITE_ONLY +│ │ │ │ +│ │ │ ├── • SameStagePrecedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ │ rule: "column writable right before column constraint is enforced." +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} +│ │ │ rule: "ColumnNotNull transitions to PUBLIC uphold 2-version invariant: ABSENT->WRITE_ONLY" +│ │ │ +│ │ ├── • 2 elements transitioning toward TRANSIENT_ABSENT +│ │ │ │ +│ │ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ │ │ DELETE_ONLY → WRITE_ONLY +│ │ │ │ │ +│ │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ │ │ rule: "column is WRITE_ONLY before temporary index is WRITE_ONLY" +│ │ │ │ │ +│ │ │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ │ │ rule: "TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: DELETE_ONLY->WRITE_ONLY" +│ │ │ │ │ +│ │ │ │ ├── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} +│ │ │ │ │ rule: "index-column added to index before temp index receives writes" +│ │ │ │ │ +│ │ │ │ ├── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} +│ │ │ │ │ rule: "index-column added to index before temp index receives writes" +│ │ │ │ │ +│ │ │ │ └── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} +│ │ │ │ rule: "index-column added to index before temp index receives writes" +│ │ │ │ +│ │ │ └── • IndexData:{DescID: 106, IndexID: 3} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • SameStagePrecedence dependency from WRITE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ rule: "temp index data exists as soon as temp index accepts writes" +│ │ │ +│ │ └── • 5 Mutation operations +│ │ │ +│ │ ├── • MakeDeleteOnlyColumnWriteOnly +│ │ │ ColumnID: 3 +│ │ │ TableID: 106 +│ │ │ +│ │ ├── • MakeDeleteOnlyIndexWriteOnly +│ │ │ IndexID: 3 +│ │ │ TableID: 106 +│ │ │ +│ │ ├── • MakeAbsentColumnNotNullWriteOnly +│ │ │ ColumnID: 3 +│ │ │ TableID: 106 +│ │ │ +│ │ ├── • SetJobStateOnDescriptor +│ │ │ DescriptorID: 106 +│ │ │ +│ │ └── • UpdateSchemaChangerJob +│ │ JobID: 1 +│ │ RunningStatus: PostCommitPhase stage 2 of 7 with 1 BackfillType op pending +│ │ +│ ├── • Stage 2 of 7 in PostCommitPhase +│ │ │ +│ │ ├── • 1 element transitioning toward PUBLIC +│ │ │ │ +│ │ │ └── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ │ BACKFILL_ONLY → BACKFILLED +│ │ │ │ +│ │ │ ├── • PreviousStagePrecedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ │ rule: "PrimaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILL_ONLY->BACKFILLED" +│ │ │ │ +│ │ │ ├── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} +│ │ │ │ rule: "index-column added to index before index is backfilled" +│ │ │ │ +│ │ │ ├── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} +│ │ │ │ rule: "index-column added to index before index is backfilled" +│ │ │ │ +│ │ │ ├── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} +│ │ │ │ rule: "index-column added to index before index is backfilled" +│ │ │ │ +│ │ │ └── • Precedence dependency from WRITE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ rule: "temp index is WRITE_ONLY before backfill" +│ │ │ +│ │ └── • 1 Backfill operation +│ │ │ +│ │ └── • BackfillIndex +│ │ IndexID: 2 +│ │ SourceIndexID: 1 +│ │ TableID: 106 +│ │ +│ ├── • Stage 3 of 7 in PostCommitPhase +│ │ │ +│ │ ├── • 1 element transitioning toward PUBLIC +│ │ │ │ +│ │ │ └── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ │ BACKFILLED → DELETE_ONLY +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from BACKFILLED PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "PrimaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILLED->DELETE_ONLY" +│ │ │ +│ │ └── • 3 Mutation operations +│ │ │ +│ │ ├── • MakeBackfillingIndexDeleteOnly +│ │ │ IndexID: 2 +│ │ │ TableID: 106 +│ │ │ +│ │ ├── • SetJobStateOnDescriptor +│ │ │ DescriptorID: 106 +│ │ │ +│ │ └── • UpdateSchemaChangerJob +│ │ JobID: 1 +│ │ RunningStatus: PostCommitPhase stage 4 of 7 with 1 MutationType op pending +│ │ +│ ├── • Stage 4 of 7 in PostCommitPhase +│ │ │ +│ │ ├── • 1 element transitioning toward PUBLIC +│ │ │ │ +│ │ │ └── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ │ DELETE_ONLY → MERGE_ONLY +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "PrimaryIndex transitions to PUBLIC uphold 2-version invariant: DELETE_ONLY->MERGE_ONLY" +│ │ │ +│ │ └── • 3 Mutation operations +│ │ │ +│ │ ├── • MakeBackfilledIndexMerging +│ │ │ IndexID: 2 +│ │ │ TableID: 106 +│ │ │ +│ │ ├── • SetJobStateOnDescriptor +│ │ │ DescriptorID: 106 +│ │ │ +│ │ └── • UpdateSchemaChangerJob +│ │ JobID: 1 +│ │ RunningStatus: PostCommitPhase stage 5 of 7 with 1 BackfillType op pending +│ │ +│ ├── • Stage 5 of 7 in PostCommitPhase +│ │ │ +│ │ ├── • 1 element transitioning toward PUBLIC +│ │ │ │ +│ │ │ └── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ │ MERGE_ONLY → MERGED +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from MERGE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "PrimaryIndex transitions to PUBLIC uphold 2-version invariant: MERGE_ONLY->MERGED" +│ │ │ +│ │ └── • 1 Backfill operation +│ │ │ +│ │ └── • MergeIndex +│ │ BackfilledIndexID: 2 +│ │ TableID: 106 +│ │ TemporaryIndexID: 3 +│ │ +│ ├── • Stage 6 of 7 in PostCommitPhase +│ │ │ +│ │ ├── • 1 element transitioning toward PUBLIC +│ │ │ │ +│ │ │ └── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ │ MERGED → WRITE_ONLY +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from MERGED PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "PrimaryIndex transitions to PUBLIC uphold 2-version invariant: MERGED->WRITE_ONLY" +│ │ │ +│ │ └── • 3 Mutation operations +│ │ │ +│ │ ├── • MakeMergedIndexWriteOnly +│ │ │ IndexID: 2 +│ │ │ TableID: 106 +│ │ │ +│ │ ├── • SetJobStateOnDescriptor +│ │ │ DescriptorID: 106 +│ │ │ +│ │ └── • UpdateSchemaChangerJob +│ │ JobID: 1 +│ │ RunningStatus: PostCommitPhase stage 7 of 7 with 2 ValidationType ops pending +│ │ +│ └── • Stage 7 of 7 in PostCommitPhase +│ │ +│ ├── • 2 elements transitioning toward PUBLIC +│ │ │ +│ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ │ WRITE_ONLY → VALIDATED +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from WRITE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "PrimaryIndex transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED" +│ │ │ +│ │ └── • ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} +│ │ │ WRITE_ONLY → VALIDATED +│ │ │ +│ │ ├── • Precedence dependency from VALIDATED PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "index is ready to be validated before we validate constraint on it" +│ │ │ +│ │ └── • PreviousStagePrecedence dependency from WRITE_ONLY ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} +│ │ rule: "ColumnNotNull transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED" +│ │ +│ └── • 2 Validation operations +│ │ +│ ├── • ValidateIndex +│ │ IndexID: 2 +│ │ TableID: 106 +│ │ +│ └── • ValidateColumnNotNull +│ ColumnID: 3 +│ IndexIDForValidation: 2 +│ TableID: 106 +│ +└── • PostCommitNonRevertiblePhase + │ + ├── • Stage 1 of 3 in PostCommitNonRevertiblePhase + │ │ + │ ├── • 4 elements transitioning toward PUBLIC + │ │ │ + │ │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ │ WRITE_ONLY → PUBLIC + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "Column transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->PUBLIC" + │ │ │ │ + │ │ │ ├── • Precedence dependency from PUBLIC ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ │ rule: "column dependents exist before column becomes public" + │ │ │ │ + │ │ │ ├── • Precedence dependency from PUBLIC ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ │ │ │ rule: "column dependents exist before column becomes public" + │ │ │ │ + │ │ │ ├── • Precedence dependency from PUBLIC PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ rule: "swapped primary index public before column" + │ │ │ │ + │ │ │ ├── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ │ rule: "column dependents exist before column becomes public" + │ │ │ │ + │ │ │ ├── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ │ rule: "column dependents exist before column becomes public" + │ │ │ │ + │ │ │ └── • Precedence dependency from PUBLIC ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "column dependents exist before column becomes public" + │ │ │ + │ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ VALIDATED → PUBLIC + │ │ │ │ + │ │ │ ├── • SameStagePrecedence dependency from VALIDATED PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ │ │ rule: "primary index swap" + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from VALIDATED PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ rule: "PrimaryIndex transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC" + │ │ │ │ + │ │ │ ├── • SameStagePrecedence dependency from PUBLIC IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 2} + │ │ │ │ rule: "index dependents exist before index becomes public" + │ │ │ │ rule: "primary index named right before index becomes public" + │ │ │ │ + │ │ │ ├── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ │ rule: "index dependents exist before index becomes public" + │ │ │ │ + │ │ │ ├── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ │ rule: "index dependents exist before index becomes public" + │ │ │ │ + │ │ │ └── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "index dependents exist before index becomes public" + │ │ │ + │ │ ├── • IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 2} + │ │ │ │ ABSENT → PUBLIC + │ │ │ │ + │ │ │ └── • Precedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index existence precedes index dependents" + │ │ │ + │ │ └── • ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ VALIDATED → PUBLIC + │ │ │ + │ │ ├── • Precedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "column existence precedes column dependents" + │ │ │ + │ │ └── • PreviousStagePrecedence dependency from VALIDATED ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "ColumnNotNull transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC" + │ │ + │ ├── • 4 elements transitioning toward TRANSIENT_ABSENT + │ │ │ + │ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ │ WRITE_ONLY → TRANSIENT_DELETE_ONLY + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from WRITE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: WRITE_ONLY->TRANSIENT_DELETE_ONLY" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ │ PUBLIC → TRANSIENT_ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from TRANSIENT_DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ │ PUBLIC → TRANSIENT_ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from TRANSIENT_DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ └── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ PUBLIC → TRANSIENT_ABSENT + │ │ │ + │ │ └── • Precedence dependency from TRANSIENT_DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ + │ ├── • 2 elements transitioning toward ABSENT + │ │ │ + │ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ │ │ PUBLIC → VALIDATED + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from PUBLIC PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED" + │ │ │ + │ │ └── • IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 1} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from VALIDATED PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ rule: "index no longer public before dependents, excluding columns" + │ │ + │ └── • 13 Mutation operations + │ │ + │ ├── • MakePublicPrimaryIndexWriteOnly + │ │ IndexID: 1 + │ │ TableID: 106 + │ │ + │ ├── • SetIndexName + │ │ IndexID: 1 + │ │ Name: crdb_internal_index_1_name_placeholder + │ │ TableID: 106 + │ │ + │ ├── • SetIndexName + │ │ IndexID: 2 + │ │ Name: tbl_pkey + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • MakeValidatedColumnNotNullPublic + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • MakeValidatedPrimaryIndexPublic + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyColumnPublic + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RefreshStats + │ │ TableID: 106 + │ │ + │ ├── • SetJobStateOnDescriptor + │ │ DescriptorID: 106 + │ │ + │ └── • UpdateSchemaChangerJob + │ IsNonCancelable: true + │ JobID: 1 + │ RunningStatus: PostCommitNonRevertiblePhase stage 2 of 3 with 4 MutationType ops pending + │ + ├── • Stage 2 of 3 in PostCommitNonRevertiblePhase + │ │ + │ ├── • 1 element transitioning toward TRANSIENT_ABSENT + │ │ │ + │ │ └── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ TRANSIENT_DELETE_ONLY → TRANSIENT_ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from TRANSIENT_DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_DELETE_ONLY->TRANSIENT_ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from TRANSIENT_ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from TRANSIENT_ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from TRANSIENT_ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ rule: "dependents removed before index" + │ │ + │ ├── • 3 elements transitioning toward ABSENT + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 1} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 1} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ └── • PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ │ VALIDATED → DELETE_ONLY + │ │ │ + │ │ └── • PreviousStagePrecedence dependency from VALIDATED PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: VALIDATED->WRITE_ONLY" + │ │ + │ └── • 6 Mutation operations + │ │ + │ ├── • MakeIndexAbsent + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 1 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 1 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 1 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • SetJobStateOnDescriptor + │ │ DescriptorID: 106 + │ │ + │ └── • UpdateSchemaChangerJob + │ IsNonCancelable: true + │ JobID: 1 + │ RunningStatus: PostCommitNonRevertiblePhase stage 3 of 3 with 3 MutationType ops pending + │ + └── • Stage 3 of 3 in PostCommitNonRevertiblePhase + │ + ├── • 1 element transitioning toward TRANSIENT_ABSENT + │ │ + │ └── • IndexData:{DescID: 106, IndexID: 3} + │ │ PUBLIC → TRANSIENT_ABSENT + │ │ + │ ├── • SameStagePrecedence dependency from DROPPED IndexData:{DescID: 106, IndexID: 1} + │ │ rule: "schedule all GC jobs for a descriptor in the same stage" + │ │ + │ └── • Precedence dependency from TRANSIENT_ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ rule: "index removed before garbage collection" + │ + ├── • 2 elements transitioning toward ABSENT + │ │ + │ ├── • PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 1} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 1} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 1} + │ │ rule: "dependents removed before index" + │ │ + │ └── • IndexData:{DescID: 106, IndexID: 1} + │ │ PUBLIC → ABSENT + │ │ + │ └── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ rule: "index removed before garbage collection" + │ + └── • 5 Mutation operations + │ + ├── • MakeIndexAbsent + │ IndexID: 1 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 1 + │ StatementForDropJob: + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 3 + │ StatementForDropJob: + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED + │ TableID: 106 + │ + ├── • RemoveJobStateFromDescriptor + │ DescriptorID: 106 + │ JobID: 1 + │ + └── • UpdateSchemaChangerJob + DescriptorIDsToRemove: + - 106 + IsNonCancelable: true + JobID: 1 + RunningStatus: all stages completed diff --git a/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_1_of_7 b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_1_of_7 new file mode 100644 index 000000000000..6484f56a4a99 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_1_of_7 @@ -0,0 +1,195 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED; +EXPLAIN (ddl, verbose) rollback at post-commit stage 1 of 7; +---- +• Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED; +│ +└── • PostCommitNonRevertiblePhase + │ + └── • Stage 1 of 1 in PostCommitNonRevertiblePhase + │ + ├── • 12 elements transitioning toward ABSENT + │ │ + │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • SameStagePrecedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ rule: "column type removed right before column when not dropping relation" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "indexes containing column reach absent before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before column" + │ │ + │ ├── • ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ PUBLIC → ABSENT + │ │ + │ ├── • ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ │ PUBLIC → ABSENT + │ │ + │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ BACKFILL_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: BACKFILL_ONLY->DELETE_ONLY" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before index" + │ │ + │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ + │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ + │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ + │ ├── • IndexData:{DescID: 106, IndexID: 2} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ rule: "index removed before garbage collection" + │ │ + │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ rule: "dependents removed before index" + │ │ + │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ + │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ + │ └── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ PUBLIC → ABSENT + │ │ + │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ rule: "index drop mutation visible before cleaning up index columns" + │ + └── • 13 Mutation operations + │ + ├── • SetColumnName + │ ColumnID: 3 + │ Name: crdb_internal_column_3_name_placeholder + │ TableID: 106 + │ + ├── • RemoveColumnFromIndex + │ ColumnID: 1 + │ IndexID: 2 + │ TableID: 106 + │ + ├── • RemoveColumnFromIndex + │ ColumnID: 2 + │ IndexID: 2 + │ Kind: 2 + │ TableID: 106 + │ + ├── • RemoveColumnFromIndex + │ ColumnID: 3 + │ IndexID: 2 + │ Kind: 2 + │ Ordinal: 1 + │ TableID: 106 + │ + ├── • RemoveColumnFromIndex + │ ColumnID: 1 + │ IndexID: 3 + │ TableID: 106 + │ + ├── • RemoveColumnFromIndex + │ ColumnID: 2 + │ IndexID: 3 + │ Kind: 2 + │ TableID: 106 + │ + ├── • RemoveColumnFromIndex + │ ColumnID: 3 + │ IndexID: 3 + │ Kind: 2 + │ Ordinal: 1 + │ TableID: 106 + │ + ├── • MakeIndexAbsent + │ IndexID: 2 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 2 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED + │ TableID: 106 + │ + ├── • MakeIndexAbsent + │ IndexID: 3 + │ TableID: 106 + │ + ├── • MakeDeleteOnlyColumnAbsent + │ ColumnID: 3 + │ TableID: 106 + │ + ├── • RemoveJobStateFromDescriptor + │ DescriptorID: 106 + │ JobID: 1 + │ + └── • UpdateSchemaChangerJob + DescriptorIDsToRemove: + - 106 + IsNonCancelable: true + JobID: 1 + RunningStatus: all stages completed diff --git a/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_2_of_7 b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_2_of_7 new file mode 100644 index 000000000000..a9f4944c2520 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_2_of_7 @@ -0,0 +1,273 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED; +EXPLAIN (ddl, verbose) rollback at post-commit stage 2 of 7; +---- +• Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED; +│ +└── • PostCommitNonRevertiblePhase + │ + ├── • Stage 1 of 2 in PostCommitNonRevertiblePhase + │ │ + │ ├── • 11 elements transitioning toward ABSENT + │ │ │ + │ │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ │ + │ │ │ └── • SameStagePrecedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "column constraint removed right before column reaches delete only" + │ │ │ + │ │ ├── • ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "column no longer public before dependents" + │ │ │ + │ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ BACKFILL_ONLY → ABSENT + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: BACKFILL_ONLY->DELETE_ONLY" + │ │ │ │ + │ │ │ ├── • Precedence dependency from ABSENT IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 2} + │ │ │ │ rule: "dependents removed before index" + │ │ │ │ + │ │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ │ rule: "dependents removed before index" + │ │ │ │ + │ │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ │ rule: "dependents removed before index" + │ │ │ │ + │ │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from WRITE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ └── • ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ WRITE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "ColumnNotNull transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED" + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ └── • 13 Mutation operations + │ │ + │ ├── • SetColumnName + │ │ ColumnID: 3 + │ │ Name: crdb_internal_column_3_name_placeholder + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • MakeIndexAbsent + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnNotNull + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyColumnDeleteOnly + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • SetJobStateOnDescriptor + │ │ DescriptorID: 106 + │ │ + │ └── • UpdateSchemaChangerJob + │ IsNonCancelable: true + │ JobID: 1 + │ RunningStatus: PostCommitNonRevertiblePhase stage 2 of 2 with 4 MutationType ops pending + │ + └── • Stage 2 of 2 in PostCommitNonRevertiblePhase + │ + ├── • 5 elements transitioning toward ABSENT + │ │ + │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • SameStagePrecedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ rule: "column type removed right before column when not dropping relation" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "indexes containing column reach absent before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before column" + │ │ + │ ├── • ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ ├── • IndexData:{DescID: 106, IndexID: 2} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ rule: "index removed before garbage collection" + │ │ + │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ rule: "dependents removed before index" + │ │ + │ └── • IndexData:{DescID: 106, IndexID: 3} + │ │ PUBLIC → ABSENT + │ │ + │ ├── • SameStagePrecedence dependency from DROPPED IndexData:{DescID: 106, IndexID: 2} + │ │ rule: "schedule all GC jobs for a descriptor in the same stage" + │ │ + │ └── • Precedence dependency from ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ rule: "index removed before garbage collection" + │ + └── • 6 Mutation operations + │ + ├── • CreateGCJobForIndex + │ IndexID: 2 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED + │ TableID: 106 + │ + ├── • MakeIndexAbsent + │ IndexID: 3 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 3 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED + │ TableID: 106 + │ + ├── • MakeDeleteOnlyColumnAbsent + │ ColumnID: 3 + │ TableID: 106 + │ + ├── • RemoveJobStateFromDescriptor + │ DescriptorID: 106 + │ JobID: 1 + │ + └── • UpdateSchemaChangerJob + DescriptorIDsToRemove: + - 106 + IsNonCancelable: true + JobID: 1 + RunningStatus: all stages completed diff --git a/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_3_of_7 b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_3_of_7 new file mode 100644 index 000000000000..4c44edf1d102 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_3_of_7 @@ -0,0 +1,273 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED; +EXPLAIN (ddl, verbose) rollback at post-commit stage 3 of 7; +---- +• Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED; +│ +└── • PostCommitNonRevertiblePhase + │ + ├── • Stage 1 of 2 in PostCommitNonRevertiblePhase + │ │ + │ ├── • 11 elements transitioning toward ABSENT + │ │ │ + │ │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ │ + │ │ │ └── • SameStagePrecedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "column constraint removed right before column reaches delete only" + │ │ │ + │ │ ├── • ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "column no longer public before dependents" + │ │ │ + │ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ BACKFILL_ONLY → ABSENT + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: BACKFILL_ONLY->DELETE_ONLY" + │ │ │ │ + │ │ │ ├── • Precedence dependency from ABSENT IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 2} + │ │ │ │ rule: "dependents removed before index" + │ │ │ │ + │ │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ │ rule: "dependents removed before index" + │ │ │ │ + │ │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ │ rule: "dependents removed before index" + │ │ │ │ + │ │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from WRITE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ └── • ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ WRITE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "ColumnNotNull transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED" + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ └── • 13 Mutation operations + │ │ + │ ├── • SetColumnName + │ │ ColumnID: 3 + │ │ Name: crdb_internal_column_3_name_placeholder + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • MakeIndexAbsent + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnNotNull + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyColumnDeleteOnly + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • SetJobStateOnDescriptor + │ │ DescriptorID: 106 + │ │ + │ └── • UpdateSchemaChangerJob + │ IsNonCancelable: true + │ JobID: 1 + │ RunningStatus: PostCommitNonRevertiblePhase stage 2 of 2 with 4 MutationType ops pending + │ + └── • Stage 2 of 2 in PostCommitNonRevertiblePhase + │ + ├── • 5 elements transitioning toward ABSENT + │ │ + │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • SameStagePrecedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ rule: "column type removed right before column when not dropping relation" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "indexes containing column reach absent before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before column" + │ │ + │ ├── • ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ ├── • IndexData:{DescID: 106, IndexID: 2} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ rule: "index removed before garbage collection" + │ │ + │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ rule: "dependents removed before index" + │ │ + │ └── • IndexData:{DescID: 106, IndexID: 3} + │ │ PUBLIC → ABSENT + │ │ + │ ├── • SameStagePrecedence dependency from DROPPED IndexData:{DescID: 106, IndexID: 2} + │ │ rule: "schedule all GC jobs for a descriptor in the same stage" + │ │ + │ └── • Precedence dependency from ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ rule: "index removed before garbage collection" + │ + └── • 6 Mutation operations + │ + ├── • CreateGCJobForIndex + │ IndexID: 2 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED + │ TableID: 106 + │ + ├── • MakeIndexAbsent + │ IndexID: 3 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 3 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED + │ TableID: 106 + │ + ├── • MakeDeleteOnlyColumnAbsent + │ ColumnID: 3 + │ TableID: 106 + │ + ├── • RemoveJobStateFromDescriptor + │ DescriptorID: 106 + │ JobID: 1 + │ + └── • UpdateSchemaChangerJob + DescriptorIDsToRemove: + - 106 + IsNonCancelable: true + JobID: 1 + RunningStatus: all stages completed diff --git a/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_4_of_7 b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_4_of_7 new file mode 100644 index 000000000000..8c96ca6bfc9c --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_4_of_7 @@ -0,0 +1,273 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED; +EXPLAIN (ddl, verbose) rollback at post-commit stage 4 of 7; +---- +• Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED; +│ +└── • PostCommitNonRevertiblePhase + │ + ├── • Stage 1 of 2 in PostCommitNonRevertiblePhase + │ │ + │ ├── • 11 elements transitioning toward ABSENT + │ │ │ + │ │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ │ + │ │ │ └── • SameStagePrecedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "column constraint removed right before column reaches delete only" + │ │ │ + │ │ ├── • ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "column no longer public before dependents" + │ │ │ + │ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ DELETE_ONLY → ABSENT + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ │ + │ │ │ ├── • Precedence dependency from ABSENT IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 2} + │ │ │ │ rule: "dependents removed before index" + │ │ │ │ + │ │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ │ rule: "dependents removed before index" + │ │ │ │ + │ │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ │ rule: "dependents removed before index" + │ │ │ │ + │ │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from WRITE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ └── • ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ WRITE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "ColumnNotNull transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED" + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ └── • 13 Mutation operations + │ │ + │ ├── • SetColumnName + │ │ ColumnID: 3 + │ │ Name: crdb_internal_column_3_name_placeholder + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • MakeIndexAbsent + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnNotNull + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyColumnDeleteOnly + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • SetJobStateOnDescriptor + │ │ DescriptorID: 106 + │ │ + │ └── • UpdateSchemaChangerJob + │ IsNonCancelable: true + │ JobID: 1 + │ RunningStatus: PostCommitNonRevertiblePhase stage 2 of 2 with 4 MutationType ops pending + │ + └── • Stage 2 of 2 in PostCommitNonRevertiblePhase + │ + ├── • 5 elements transitioning toward ABSENT + │ │ + │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • SameStagePrecedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ rule: "column type removed right before column when not dropping relation" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "indexes containing column reach absent before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before column" + │ │ + │ ├── • ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ ├── • IndexData:{DescID: 106, IndexID: 2} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ rule: "index removed before garbage collection" + │ │ + │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ rule: "dependents removed before index" + │ │ + │ └── • IndexData:{DescID: 106, IndexID: 3} + │ │ PUBLIC → ABSENT + │ │ + │ ├── • SameStagePrecedence dependency from DROPPED IndexData:{DescID: 106, IndexID: 2} + │ │ rule: "schedule all GC jobs for a descriptor in the same stage" + │ │ + │ └── • Precedence dependency from ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ rule: "index removed before garbage collection" + │ + └── • 6 Mutation operations + │ + ├── • CreateGCJobForIndex + │ IndexID: 2 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED + │ TableID: 106 + │ + ├── • MakeIndexAbsent + │ IndexID: 3 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 3 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED + │ TableID: 106 + │ + ├── • MakeDeleteOnlyColumnAbsent + │ ColumnID: 3 + │ TableID: 106 + │ + ├── • RemoveJobStateFromDescriptor + │ DescriptorID: 106 + │ JobID: 1 + │ + └── • UpdateSchemaChangerJob + DescriptorIDsToRemove: + - 106 + IsNonCancelable: true + JobID: 1 + RunningStatus: all stages completed diff --git a/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_5_of_7 b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_5_of_7 new file mode 100644 index 000000000000..78f100cd52f8 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_5_of_7 @@ -0,0 +1,283 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED; +EXPLAIN (ddl, verbose) rollback at post-commit stage 5 of 7; +---- +• Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED; +│ +└── • PostCommitNonRevertiblePhase + │ + ├── • Stage 1 of 2 in PostCommitNonRevertiblePhase + │ │ + │ ├── • 11 elements transitioning toward ABSENT + │ │ │ + │ │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ │ + │ │ │ └── • SameStagePrecedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "column constraint removed right before column reaches delete only" + │ │ │ + │ │ ├── • ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "column no longer public before dependents" + │ │ │ + │ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ MERGE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from MERGE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: MERGE_ONLY->WRITE_ONLY" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from WRITE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ └── • ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ WRITE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "ColumnNotNull transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED" + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ └── • 13 Mutation operations + │ │ + │ ├── • SetColumnName + │ │ ColumnID: 3 + │ │ Name: crdb_internal_column_3_name_placeholder + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnNotNull + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyColumnDeleteOnly + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • SetJobStateOnDescriptor + │ │ DescriptorID: 106 + │ │ + │ └── • UpdateSchemaChangerJob + │ IsNonCancelable: true + │ JobID: 1 + │ RunningStatus: PostCommitNonRevertiblePhase stage 2 of 2 with 5 MutationType ops pending + │ + └── • Stage 2 of 2 in PostCommitNonRevertiblePhase + │ + ├── • 6 elements transitioning toward ABSENT + │ │ + │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • SameStagePrecedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ rule: "column type removed right before column when not dropping relation" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "indexes containing column reach absent before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before column" + │ │ + │ ├── • ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before index" + │ │ + │ ├── • IndexData:{DescID: 106, IndexID: 2} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ rule: "index removed before garbage collection" + │ │ + │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ rule: "dependents removed before index" + │ │ + │ └── • IndexData:{DescID: 106, IndexID: 3} + │ │ PUBLIC → ABSENT + │ │ + │ ├── • SameStagePrecedence dependency from DROPPED IndexData:{DescID: 106, IndexID: 2} + │ │ rule: "schedule all GC jobs for a descriptor in the same stage" + │ │ + │ └── • Precedence dependency from ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ rule: "index removed before garbage collection" + │ + └── • 7 Mutation operations + │ + ├── • MakeIndexAbsent + │ IndexID: 2 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 2 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED + │ TableID: 106 + │ + ├── • MakeIndexAbsent + │ IndexID: 3 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 3 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED + │ TableID: 106 + │ + ├── • MakeDeleteOnlyColumnAbsent + │ ColumnID: 3 + │ TableID: 106 + │ + ├── • RemoveJobStateFromDescriptor + │ DescriptorID: 106 + │ JobID: 1 + │ + └── • UpdateSchemaChangerJob + DescriptorIDsToRemove: + - 106 + IsNonCancelable: true + JobID: 1 + RunningStatus: all stages completed diff --git a/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_6_of_7 b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_6_of_7 new file mode 100644 index 000000000000..9c4e098e3fd3 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_6_of_7 @@ -0,0 +1,283 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED; +EXPLAIN (ddl, verbose) rollback at post-commit stage 6 of 7; +---- +• Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED; +│ +└── • PostCommitNonRevertiblePhase + │ + ├── • Stage 1 of 2 in PostCommitNonRevertiblePhase + │ │ + │ ├── • 11 elements transitioning toward ABSENT + │ │ │ + │ │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ │ + │ │ │ └── • SameStagePrecedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "column constraint removed right before column reaches delete only" + │ │ │ + │ │ ├── • ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "column no longer public before dependents" + │ │ │ + │ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ MERGE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from MERGE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: MERGE_ONLY->WRITE_ONLY" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from WRITE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ └── • ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ WRITE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "ColumnNotNull transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED" + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ └── • 13 Mutation operations + │ │ + │ ├── • SetColumnName + │ │ ColumnID: 3 + │ │ Name: crdb_internal_column_3_name_placeholder + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnNotNull + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyColumnDeleteOnly + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • SetJobStateOnDescriptor + │ │ DescriptorID: 106 + │ │ + │ └── • UpdateSchemaChangerJob + │ IsNonCancelable: true + │ JobID: 1 + │ RunningStatus: PostCommitNonRevertiblePhase stage 2 of 2 with 5 MutationType ops pending + │ + └── • Stage 2 of 2 in PostCommitNonRevertiblePhase + │ + ├── • 6 elements transitioning toward ABSENT + │ │ + │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • SameStagePrecedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ rule: "column type removed right before column when not dropping relation" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "indexes containing column reach absent before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before column" + │ │ + │ ├── • ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before index" + │ │ + │ ├── • IndexData:{DescID: 106, IndexID: 2} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ rule: "index removed before garbage collection" + │ │ + │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ rule: "dependents removed before index" + │ │ + │ └── • IndexData:{DescID: 106, IndexID: 3} + │ │ PUBLIC → ABSENT + │ │ + │ ├── • SameStagePrecedence dependency from DROPPED IndexData:{DescID: 106, IndexID: 2} + │ │ rule: "schedule all GC jobs for a descriptor in the same stage" + │ │ + │ └── • Precedence dependency from ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ rule: "index removed before garbage collection" + │ + └── • 7 Mutation operations + │ + ├── • MakeIndexAbsent + │ IndexID: 2 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 2 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED + │ TableID: 106 + │ + ├── • MakeIndexAbsent + │ IndexID: 3 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 3 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED + │ TableID: 106 + │ + ├── • MakeDeleteOnlyColumnAbsent + │ ColumnID: 3 + │ TableID: 106 + │ + ├── • RemoveJobStateFromDescriptor + │ DescriptorID: 106 + │ JobID: 1 + │ + └── • UpdateSchemaChangerJob + DescriptorIDsToRemove: + - 106 + IsNonCancelable: true + JobID: 1 + RunningStatus: all stages completed diff --git a/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_7_of_7 b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_7_of_7 new file mode 100644 index 000000000000..62990e923aab --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored.rollback_7_of_7 @@ -0,0 +1,283 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED; +EXPLAIN (ddl, verbose) rollback at post-commit stage 7 of 7; +---- +• Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED; +│ +└── • PostCommitNonRevertiblePhase + │ + ├── • Stage 1 of 2 in PostCommitNonRevertiblePhase + │ │ + │ ├── • 11 elements transitioning toward ABSENT + │ │ │ + │ │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ │ + │ │ │ └── • SameStagePrecedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "column constraint removed right before column reaches delete only" + │ │ │ + │ │ ├── • ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "column no longer public before dependents" + │ │ │ + │ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from WRITE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from WRITE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ └── • ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ WRITE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "ColumnNotNull transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED" + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ └── • 13 Mutation operations + │ │ + │ ├── • SetColumnName + │ │ ColumnID: 3 + │ │ Name: crdb_internal_column_3_name_placeholder + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnNotNull + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyColumnDeleteOnly + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • SetJobStateOnDescriptor + │ │ DescriptorID: 106 + │ │ + │ └── • UpdateSchemaChangerJob + │ IsNonCancelable: true + │ JobID: 1 + │ RunningStatus: PostCommitNonRevertiblePhase stage 2 of 2 with 5 MutationType ops pending + │ + └── • Stage 2 of 2 in PostCommitNonRevertiblePhase + │ + ├── • 6 elements transitioning toward ABSENT + │ │ + │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • SameStagePrecedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ rule: "column type removed right before column when not dropping relation" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "indexes containing column reach absent before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before column" + │ │ + │ ├── • ColumnType:{DescID: 106, ColumnFamilyID: 0, ColumnID: 3} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before index" + │ │ + │ ├── • IndexData:{DescID: 106, IndexID: 2} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ rule: "index removed before garbage collection" + │ │ + │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ rule: "dependents removed before index" + │ │ + │ └── • IndexData:{DescID: 106, IndexID: 3} + │ │ PUBLIC → ABSENT + │ │ + │ ├── • SameStagePrecedence dependency from DROPPED IndexData:{DescID: 106, IndexID: 2} + │ │ rule: "schedule all GC jobs for a descriptor in the same stage" + │ │ + │ └── • Precedence dependency from ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ rule: "index removed before garbage collection" + │ + └── • 7 Mutation operations + │ + ├── • MakeIndexAbsent + │ IndexID: 2 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 2 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED + │ TableID: 106 + │ + ├── • MakeIndexAbsent + │ IndexID: 3 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 3 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED + │ TableID: 106 + │ + ├── • MakeDeleteOnlyColumnAbsent + │ ColumnID: 3 + │ TableID: 106 + │ + ├── • RemoveJobStateFromDescriptor + │ DescriptorID: 106 + │ JobID: 1 + │ + └── • UpdateSchemaChangerJob + DescriptorIDsToRemove: + - 106 + IsNonCancelable: true + JobID: 1 + RunningStatus: all stages completed diff --git a/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family new file mode 100644 index 000000000000..efc37195ea52 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family @@ -0,0 +1,971 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +EXPLAIN (ddl, verbose) ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED CREATE FAMILY bob; +---- +• Schema change plan for ALTER TABLE ‹db›.‹public›.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED CREATE FAMILY ‹bob›; +│ +├── • StatementPhase +│ │ +│ └── • Stage 1 of 1 in StatementPhase +│ │ +│ ├── • 9 elements transitioning toward PUBLIC +│ │ │ +│ │ ├── • Column:{DescID: 106, ColumnID: 3} +│ │ │ │ ABSENT → DELETE_ONLY +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from ABSENT Column:{DescID: 106, ColumnID: 3} +│ │ │ rule: "Column transitions to PUBLIC uphold 2-version invariant: ABSENT->DELETE_ONLY" +│ │ │ +│ │ ├── • ColumnFamily:{DescID: 106, Name: bob, ColumnFamilyID: 1} +│ │ │ ABSENT → PUBLIC +│ │ │ +│ │ ├── • ColumnName:{DescID: 106, Name: j, ColumnID: 3} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • SameStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ rule: "column existence precedes column dependents" +│ │ │ rule: "column name and type set right after column existence" +│ │ │ +│ │ ├── • ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • SameStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ rule: "column existence precedes column dependents" +│ │ │ rule: "column name and type set right after column existence" +│ │ │ +│ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ │ ABSENT → BACKFILL_ONLY +│ │ │ │ +│ │ │ ├── • Precedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ │ rule: "column existence precedes index existence" +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "PrimaryIndex transitions to PUBLIC uphold 2-version invariant: ABSENT->BACKFILL_ONLY" +│ │ │ +│ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • Precedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "index existence precedes index dependents" +│ │ │ +│ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • Precedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "index existence precedes index dependents" +│ │ │ +│ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ ├── • Precedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ │ rule: "column existence precedes column dependents" +│ │ │ │ +│ │ │ └── • Precedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "index existence precedes index dependents" +│ │ │ +│ │ └── • IndexData:{DescID: 106, IndexID: 2} +│ │ │ ABSENT → PUBLIC +│ │ │ +│ │ └── • SameStagePrecedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ rule: "index data exists as soon as index accepts backfills" +│ │ +│ ├── • 4 elements transitioning toward TRANSIENT_ABSENT +│ │ │ +│ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ │ ABSENT → DELETE_ONLY +│ │ │ │ +│ │ │ ├── • Precedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ │ rule: "column existence precedes temp index existence" +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ rule: "TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: ABSENT->DELETE_ONLY" +│ │ │ +│ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ rule: "temp index existence precedes index dependents" +│ │ │ +│ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ rule: "temp index existence precedes index dependents" +│ │ │ +│ │ └── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} +│ │ │ ABSENT → PUBLIC +│ │ │ +│ │ ├── • Precedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ rule: "column existence precedes column dependents" +│ │ │ +│ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ rule: "temp index existence precedes index dependents" +│ │ +│ └── • 12 Mutation operations +│ │ +│ ├── • MakeAbsentColumnDeleteOnly +│ │ Column: +│ │ ColumnID: 3 +│ │ PgAttributeNum: 3 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnFamily +│ │ FamilyID: 1 +│ │ Name: bob +│ │ TableID: 106 +│ │ +│ ├── • SetColumnName +│ │ ColumnID: 3 +│ │ Name: j +│ │ TableID: 106 +│ │ +│ ├── • SetAddedColumnType +│ │ ColumnType: +│ │ ColumnID: 3 +│ │ ComputeExpr: +│ │ expr: k +│ │ referencedColumnIds: +│ │ - 2 +│ │ ElementCreationMetadata: +│ │ in231OrLater: true +│ │ FamilyID: 1 +│ │ TableID: 106 +│ │ TypeT: +│ │ Type: +│ │ family: IntFamily +│ │ oid: 20 +│ │ width: 64 +│ │ +│ ├── • MakeAbsentIndexBackfilling +│ │ Index: +│ │ ConstraintID: 2 +│ │ IndexID: 2 +│ │ IsUnique: true +│ │ SourceIndexID: 1 +│ │ TableID: 106 +│ │ TemporaryIndexID: 3 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 1 +│ │ IndexID: 2 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 2 +│ │ IndexID: 2 +│ │ Kind: 2 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 3 +│ │ IndexID: 2 +│ │ Kind: 2 +│ │ Ordinal: 1 +│ │ TableID: 106 +│ │ +│ ├── • MakeAbsentTempIndexDeleteOnly +│ │ Index: +│ │ ConstraintID: 3 +│ │ IndexID: 3 +│ │ IsUnique: true +│ │ SourceIndexID: 1 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 1 +│ │ IndexID: 3 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 2 +│ │ IndexID: 3 +│ │ Kind: 2 +│ │ TableID: 106 +│ │ +│ └── • AddColumnToIndex +│ ColumnID: 3 +│ IndexID: 3 +│ Kind: 2 +│ Ordinal: 1 +│ TableID: 106 +│ +├── • PreCommitPhase +│ │ +│ ├── • Stage 1 of 2 in PreCommitPhase +│ │ │ +│ │ ├── • 9 elements transitioning toward PUBLIC +│ │ │ │ +│ │ │ ├── • Column:{DescID: 106, ColumnID: 3} +│ │ │ │ DELETE_ONLY → ABSENT +│ │ │ │ +│ │ │ ├── • ColumnFamily:{DescID: 106, Name: bob, ColumnFamilyID: 1} +│ │ │ │ PUBLIC → ABSENT +│ │ │ │ +│ │ │ ├── • ColumnName:{DescID: 106, Name: j, ColumnID: 3} +│ │ │ │ PUBLIC → ABSENT +│ │ │ │ +│ │ │ ├── • ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} +│ │ │ │ PUBLIC → ABSENT +│ │ │ │ +│ │ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ │ BACKFILL_ONLY → ABSENT +│ │ │ │ +│ │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} +│ │ │ │ PUBLIC → ABSENT +│ │ │ │ +│ │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} +│ │ │ │ PUBLIC → ABSENT +│ │ │ │ +│ │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} +│ │ │ │ PUBLIC → ABSENT +│ │ │ │ +│ │ │ └── • IndexData:{DescID: 106, IndexID: 2} +│ │ │ PUBLIC → ABSENT +│ │ │ +│ │ ├── • 4 elements transitioning toward TRANSIENT_ABSENT +│ │ │ │ +│ │ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ │ DELETE_ONLY → ABSENT +│ │ │ │ +│ │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} +│ │ │ │ PUBLIC → ABSENT +│ │ │ │ +│ │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} +│ │ │ │ PUBLIC → ABSENT +│ │ │ │ +│ │ │ └── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} +│ │ │ PUBLIC → ABSENT +│ │ │ +│ │ └── • 1 Mutation operation +│ │ │ +│ │ └── • UndoAllInTxnImmediateMutationOpSideEffects +│ │ {} +│ │ +│ └── • Stage 2 of 2 in PreCommitPhase +│ │ +│ ├── • 9 elements transitioning toward PUBLIC +│ │ │ +│ │ ├── • Column:{DescID: 106, ColumnID: 3} +│ │ │ │ ABSENT → DELETE_ONLY +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from ABSENT Column:{DescID: 106, ColumnID: 3} +│ │ │ rule: "Column transitions to PUBLIC uphold 2-version invariant: ABSENT->DELETE_ONLY" +│ │ │ +│ │ ├── • ColumnFamily:{DescID: 106, Name: bob, ColumnFamilyID: 1} +│ │ │ ABSENT → PUBLIC +│ │ │ +│ │ ├── • ColumnName:{DescID: 106, Name: j, ColumnID: 3} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • SameStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ rule: "column existence precedes column dependents" +│ │ │ rule: "column name and type set right after column existence" +│ │ │ +│ │ ├── • ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • SameStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ rule: "column existence precedes column dependents" +│ │ │ rule: "column name and type set right after column existence" +│ │ │ +│ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ │ ABSENT → BACKFILL_ONLY +│ │ │ │ +│ │ │ ├── • Precedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ │ rule: "column existence precedes index existence" +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "PrimaryIndex transitions to PUBLIC uphold 2-version invariant: ABSENT->BACKFILL_ONLY" +│ │ │ +│ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • Precedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "index existence precedes index dependents" +│ │ │ +│ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • Precedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "index existence precedes index dependents" +│ │ │ +│ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ ├── • Precedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ │ rule: "column existence precedes column dependents" +│ │ │ │ +│ │ │ └── • Precedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "index existence precedes index dependents" +│ │ │ +│ │ └── • IndexData:{DescID: 106, IndexID: 2} +│ │ │ ABSENT → PUBLIC +│ │ │ +│ │ └── • SameStagePrecedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ rule: "index data exists as soon as index accepts backfills" +│ │ +│ ├── • 4 elements transitioning toward TRANSIENT_ABSENT +│ │ │ +│ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ │ ABSENT → DELETE_ONLY +│ │ │ │ +│ │ │ ├── • Precedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ │ rule: "column existence precedes temp index existence" +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ rule: "TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: ABSENT->DELETE_ONLY" +│ │ │ +│ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ rule: "temp index existence precedes index dependents" +│ │ │ +│ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ rule: "temp index existence precedes index dependents" +│ │ │ +│ │ └── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} +│ │ │ ABSENT → PUBLIC +│ │ │ +│ │ ├── • Precedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ rule: "column existence precedes column dependents" +│ │ │ +│ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ rule: "temp index existence precedes index dependents" +│ │ +│ └── • 16 Mutation operations +│ │ +│ ├── • MakeAbsentColumnDeleteOnly +│ │ Column: +│ │ ColumnID: 3 +│ │ PgAttributeNum: 3 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnFamily +│ │ FamilyID: 1 +│ │ Name: bob +│ │ TableID: 106 +│ │ +│ ├── • SetColumnName +│ │ ColumnID: 3 +│ │ Name: j +│ │ TableID: 106 +│ │ +│ ├── • SetAddedColumnType +│ │ ColumnType: +│ │ ColumnID: 3 +│ │ ComputeExpr: +│ │ expr: k +│ │ referencedColumnIds: +│ │ - 2 +│ │ ElementCreationMetadata: +│ │ in231OrLater: true +│ │ FamilyID: 1 +│ │ TableID: 106 +│ │ TypeT: +│ │ Type: +│ │ family: IntFamily +│ │ oid: 20 +│ │ width: 64 +│ │ +│ ├── • MakeAbsentIndexBackfilling +│ │ Index: +│ │ ConstraintID: 2 +│ │ IndexID: 2 +│ │ IsUnique: true +│ │ SourceIndexID: 1 +│ │ TableID: 106 +│ │ TemporaryIndexID: 3 +│ │ +│ ├── • MaybeAddSplitForIndex +│ │ IndexID: 2 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 1 +│ │ IndexID: 2 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 2 +│ │ IndexID: 2 +│ │ Kind: 2 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 3 +│ │ IndexID: 2 +│ │ Kind: 2 +│ │ Ordinal: 1 +│ │ TableID: 106 +│ │ +│ ├── • MakeAbsentTempIndexDeleteOnly +│ │ Index: +│ │ ConstraintID: 3 +│ │ IndexID: 3 +│ │ IsUnique: true +│ │ SourceIndexID: 1 +│ │ TableID: 106 +│ │ +│ ├── • MaybeAddSplitForIndex +│ │ IndexID: 3 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 1 +│ │ IndexID: 3 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 2 +│ │ IndexID: 3 +│ │ Kind: 2 +│ │ TableID: 106 +│ │ +│ ├── • AddColumnToIndex +│ │ ColumnID: 3 +│ │ IndexID: 3 +│ │ Kind: 2 +│ │ Ordinal: 1 +│ │ TableID: 106 +│ │ +│ ├── • SetJobStateOnDescriptor +│ │ DescriptorID: 106 +│ │ Initialize: true +│ │ +│ └── • CreateSchemaChangerJob +│ Authorization: +│ UserName: root +│ DescriptorIDs: +│ - 106 +│ JobID: 1 +│ RunningStatus: PostCommitPhase stage 1 of 7 with 3 MutationType ops pending +│ Statements: +│ - statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED CREATE +│ FAMILY bob +│ redactedstatement: ALTER TABLE ‹db›.‹public›.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL +│ AS (‹k›) STORED CREATE FAMILY ‹bob› +│ statementtag: ALTER TABLE +│ +├── • PostCommitPhase +│ │ +│ ├── • Stage 1 of 7 in PostCommitPhase +│ │ │ +│ │ ├── • 2 elements transitioning toward PUBLIC +│ │ │ │ +│ │ │ ├── • Column:{DescID: 106, ColumnID: 3} +│ │ │ │ │ DELETE_ONLY → WRITE_ONLY +│ │ │ │ │ +│ │ │ │ └── • PreviousStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ │ rule: "Column transitions to PUBLIC uphold 2-version invariant: DELETE_ONLY->WRITE_ONLY" +│ │ │ │ +│ │ │ └── • ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} +│ │ │ │ ABSENT → WRITE_ONLY +│ │ │ │ +│ │ │ ├── • SameStagePrecedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ │ rule: "column writable right before column constraint is enforced." +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} +│ │ │ rule: "ColumnNotNull transitions to PUBLIC uphold 2-version invariant: ABSENT->WRITE_ONLY" +│ │ │ +│ │ ├── • 2 elements transitioning toward TRANSIENT_ABSENT +│ │ │ │ +│ │ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ │ │ DELETE_ONLY → WRITE_ONLY +│ │ │ │ │ +│ │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} +│ │ │ │ │ rule: "column is WRITE_ONLY before temporary index is WRITE_ONLY" +│ │ │ │ │ +│ │ │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ │ │ rule: "TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: DELETE_ONLY->WRITE_ONLY" +│ │ │ │ │ +│ │ │ │ ├── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} +│ │ │ │ │ rule: "index-column added to index before temp index receives writes" +│ │ │ │ │ +│ │ │ │ ├── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} +│ │ │ │ │ rule: "index-column added to index before temp index receives writes" +│ │ │ │ │ +│ │ │ │ └── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} +│ │ │ │ rule: "index-column added to index before temp index receives writes" +│ │ │ │ +│ │ │ └── • IndexData:{DescID: 106, IndexID: 3} +│ │ │ │ ABSENT → PUBLIC +│ │ │ │ +│ │ │ └── • SameStagePrecedence dependency from WRITE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ rule: "temp index data exists as soon as temp index accepts writes" +│ │ │ +│ │ └── • 5 Mutation operations +│ │ │ +│ │ ├── • MakeDeleteOnlyColumnWriteOnly +│ │ │ ColumnID: 3 +│ │ │ TableID: 106 +│ │ │ +│ │ ├── • MakeDeleteOnlyIndexWriteOnly +│ │ │ IndexID: 3 +│ │ │ TableID: 106 +│ │ │ +│ │ ├── • MakeAbsentColumnNotNullWriteOnly +│ │ │ ColumnID: 3 +│ │ │ TableID: 106 +│ │ │ +│ │ ├── • SetJobStateOnDescriptor +│ │ │ DescriptorID: 106 +│ │ │ +│ │ └── • UpdateSchemaChangerJob +│ │ JobID: 1 +│ │ RunningStatus: PostCommitPhase stage 2 of 7 with 1 BackfillType op pending +│ │ +│ ├── • Stage 2 of 7 in PostCommitPhase +│ │ │ +│ │ ├── • 1 element transitioning toward PUBLIC +│ │ │ │ +│ │ │ └── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ │ BACKFILL_ONLY → BACKFILLED +│ │ │ │ +│ │ │ ├── • PreviousStagePrecedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ │ rule: "PrimaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILL_ONLY->BACKFILLED" +│ │ │ │ +│ │ │ ├── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} +│ │ │ │ rule: "index-column added to index before index is backfilled" +│ │ │ │ +│ │ │ ├── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} +│ │ │ │ rule: "index-column added to index before index is backfilled" +│ │ │ │ +│ │ │ ├── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} +│ │ │ │ rule: "index-column added to index before index is backfilled" +│ │ │ │ +│ │ │ └── • Precedence dependency from WRITE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} +│ │ │ rule: "temp index is WRITE_ONLY before backfill" +│ │ │ +│ │ └── • 1 Backfill operation +│ │ │ +│ │ └── • BackfillIndex +│ │ IndexID: 2 +│ │ SourceIndexID: 1 +│ │ TableID: 106 +│ │ +│ ├── • Stage 3 of 7 in PostCommitPhase +│ │ │ +│ │ ├── • 1 element transitioning toward PUBLIC +│ │ │ │ +│ │ │ └── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ │ BACKFILLED → DELETE_ONLY +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from BACKFILLED PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "PrimaryIndex transitions to PUBLIC uphold 2-version invariant: BACKFILLED->DELETE_ONLY" +│ │ │ +│ │ └── • 3 Mutation operations +│ │ │ +│ │ ├── • MakeBackfillingIndexDeleteOnly +│ │ │ IndexID: 2 +│ │ │ TableID: 106 +│ │ │ +│ │ ├── • SetJobStateOnDescriptor +│ │ │ DescriptorID: 106 +│ │ │ +│ │ └── • UpdateSchemaChangerJob +│ │ JobID: 1 +│ │ RunningStatus: PostCommitPhase stage 4 of 7 with 1 MutationType op pending +│ │ +│ ├── • Stage 4 of 7 in PostCommitPhase +│ │ │ +│ │ ├── • 1 element transitioning toward PUBLIC +│ │ │ │ +│ │ │ └── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ │ DELETE_ONLY → MERGE_ONLY +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "PrimaryIndex transitions to PUBLIC uphold 2-version invariant: DELETE_ONLY->MERGE_ONLY" +│ │ │ +│ │ └── • 3 Mutation operations +│ │ │ +│ │ ├── • MakeBackfilledIndexMerging +│ │ │ IndexID: 2 +│ │ │ TableID: 106 +│ │ │ +│ │ ├── • SetJobStateOnDescriptor +│ │ │ DescriptorID: 106 +│ │ │ +│ │ └── • UpdateSchemaChangerJob +│ │ JobID: 1 +│ │ RunningStatus: PostCommitPhase stage 5 of 7 with 1 BackfillType op pending +│ │ +│ ├── • Stage 5 of 7 in PostCommitPhase +│ │ │ +│ │ ├── • 1 element transitioning toward PUBLIC +│ │ │ │ +│ │ │ └── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ │ MERGE_ONLY → MERGED +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from MERGE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "PrimaryIndex transitions to PUBLIC uphold 2-version invariant: MERGE_ONLY->MERGED" +│ │ │ +│ │ └── • 1 Backfill operation +│ │ │ +│ │ └── • MergeIndex +│ │ BackfilledIndexID: 2 +│ │ TableID: 106 +│ │ TemporaryIndexID: 3 +│ │ +│ ├── • Stage 6 of 7 in PostCommitPhase +│ │ │ +│ │ ├── • 1 element transitioning toward PUBLIC +│ │ │ │ +│ │ │ └── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ │ MERGED → WRITE_ONLY +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from MERGED PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "PrimaryIndex transitions to PUBLIC uphold 2-version invariant: MERGED->WRITE_ONLY" +│ │ │ +│ │ └── • 3 Mutation operations +│ │ │ +│ │ ├── • MakeMergedIndexWriteOnly +│ │ │ IndexID: 2 +│ │ │ TableID: 106 +│ │ │ +│ │ ├── • SetJobStateOnDescriptor +│ │ │ DescriptorID: 106 +│ │ │ +│ │ └── • UpdateSchemaChangerJob +│ │ JobID: 1 +│ │ RunningStatus: PostCommitPhase stage 7 of 7 with 2 ValidationType ops pending +│ │ +│ └── • Stage 7 of 7 in PostCommitPhase +│ │ +│ ├── • 2 elements transitioning toward PUBLIC +│ │ │ +│ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ │ WRITE_ONLY → VALIDATED +│ │ │ │ +│ │ │ └── • PreviousStagePrecedence dependency from WRITE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "PrimaryIndex transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED" +│ │ │ +│ │ └── • ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} +│ │ │ WRITE_ONLY → VALIDATED +│ │ │ +│ │ ├── • Precedence dependency from VALIDATED PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} +│ │ │ rule: "index is ready to be validated before we validate constraint on it" +│ │ │ +│ │ └── • PreviousStagePrecedence dependency from WRITE_ONLY ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} +│ │ rule: "ColumnNotNull transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->VALIDATED" +│ │ +│ └── • 2 Validation operations +│ │ +│ ├── • ValidateIndex +│ │ IndexID: 2 +│ │ TableID: 106 +│ │ +│ └── • ValidateColumnNotNull +│ ColumnID: 3 +│ IndexIDForValidation: 2 +│ TableID: 106 +│ +└── • PostCommitNonRevertiblePhase + │ + ├── • Stage 1 of 3 in PostCommitNonRevertiblePhase + │ │ + │ ├── • 4 elements transitioning toward PUBLIC + │ │ │ + │ │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ │ WRITE_ONLY → PUBLIC + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "Column transitions to PUBLIC uphold 2-version invariant: WRITE_ONLY->PUBLIC" + │ │ │ │ + │ │ │ ├── • Precedence dependency from PUBLIC ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ │ rule: "column dependents exist before column becomes public" + │ │ │ │ + │ │ │ ├── • Precedence dependency from PUBLIC ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ │ │ rule: "column dependents exist before column becomes public" + │ │ │ │ + │ │ │ ├── • Precedence dependency from PUBLIC PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ rule: "swapped primary index public before column" + │ │ │ │ + │ │ │ ├── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ │ rule: "column dependents exist before column becomes public" + │ │ │ │ + │ │ │ ├── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ │ rule: "column dependents exist before column becomes public" + │ │ │ │ + │ │ │ └── • Precedence dependency from PUBLIC ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "column dependents exist before column becomes public" + │ │ │ + │ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ VALIDATED → PUBLIC + │ │ │ │ + │ │ │ ├── • SameStagePrecedence dependency from VALIDATED PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ │ │ rule: "primary index swap" + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from VALIDATED PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ rule: "PrimaryIndex transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC" + │ │ │ │ + │ │ │ ├── • SameStagePrecedence dependency from PUBLIC IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 2} + │ │ │ │ rule: "index dependents exist before index becomes public" + │ │ │ │ rule: "primary index named right before index becomes public" + │ │ │ │ + │ │ │ ├── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ │ rule: "index dependents exist before index becomes public" + │ │ │ │ + │ │ │ ├── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ │ rule: "index dependents exist before index becomes public" + │ │ │ │ + │ │ │ └── • Precedence dependency from PUBLIC IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "index dependents exist before index becomes public" + │ │ │ + │ │ ├── • IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 2} + │ │ │ │ ABSENT → PUBLIC + │ │ │ │ + │ │ │ └── • Precedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index existence precedes index dependents" + │ │ │ + │ │ └── • ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ VALIDATED → PUBLIC + │ │ │ + │ │ ├── • Precedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "column existence precedes column dependents" + │ │ │ + │ │ └── • PreviousStagePrecedence dependency from VALIDATED ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "ColumnNotNull transitions to PUBLIC uphold 2-version invariant: VALIDATED->PUBLIC" + │ │ + │ ├── • 4 elements transitioning toward TRANSIENT_ABSENT + │ │ │ + │ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ │ WRITE_ONLY → TRANSIENT_DELETE_ONLY + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from WRITE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: WRITE_ONLY->TRANSIENT_DELETE_ONLY" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ │ PUBLIC → TRANSIENT_ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from TRANSIENT_DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ │ PUBLIC → TRANSIENT_ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from TRANSIENT_DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ └── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ PUBLIC → TRANSIENT_ABSENT + │ │ │ + │ │ └── • Precedence dependency from TRANSIENT_DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ + │ ├── • 2 elements transitioning toward ABSENT + │ │ │ + │ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ │ │ PUBLIC → VALIDATED + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from PUBLIC PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: PUBLIC->VALIDATED" + │ │ │ + │ │ └── • IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 1} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from VALIDATED PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ rule: "index no longer public before dependents, excluding columns" + │ │ + │ └── • 13 Mutation operations + │ │ + │ ├── • MakePublicPrimaryIndexWriteOnly + │ │ IndexID: 1 + │ │ TableID: 106 + │ │ + │ ├── • SetIndexName + │ │ IndexID: 1 + │ │ Name: crdb_internal_index_1_name_placeholder + │ │ TableID: 106 + │ │ + │ ├── • SetIndexName + │ │ IndexID: 2 + │ │ Name: tbl_pkey + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • MakeValidatedColumnNotNullPublic + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • MakeValidatedPrimaryIndexPublic + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyColumnPublic + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RefreshStats + │ │ TableID: 106 + │ │ + │ ├── • SetJobStateOnDescriptor + │ │ DescriptorID: 106 + │ │ + │ └── • UpdateSchemaChangerJob + │ IsNonCancelable: true + │ JobID: 1 + │ RunningStatus: PostCommitNonRevertiblePhase stage 2 of 3 with 4 MutationType ops pending + │ + ├── • Stage 2 of 3 in PostCommitNonRevertiblePhase + │ │ + │ ├── • 1 element transitioning toward TRANSIENT_ABSENT + │ │ │ + │ │ └── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ TRANSIENT_DELETE_ONLY → TRANSIENT_ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from TRANSIENT_DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to TRANSIENT_ABSENT uphold 2-version invariant: TRANSIENT_DELETE_ONLY->TRANSIENT_ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from TRANSIENT_ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from TRANSIENT_ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from TRANSIENT_ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ rule: "dependents removed before index" + │ │ + │ ├── • 3 elements transitioning toward ABSENT + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 1} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 1} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ └── • PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ │ VALIDATED → DELETE_ONLY + │ │ │ + │ │ └── • PreviousStagePrecedence dependency from VALIDATED PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: VALIDATED->WRITE_ONLY" + │ │ + │ └── • 6 Mutation operations + │ │ + │ ├── • MakeIndexAbsent + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 1 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 1 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 1 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • SetJobStateOnDescriptor + │ │ DescriptorID: 106 + │ │ + │ └── • UpdateSchemaChangerJob + │ IsNonCancelable: true + │ JobID: 1 + │ RunningStatus: PostCommitNonRevertiblePhase stage 3 of 3 with 3 MutationType ops pending + │ + └── • Stage 3 of 3 in PostCommitNonRevertiblePhase + │ + ├── • 1 element transitioning toward TRANSIENT_ABSENT + │ │ + │ └── • IndexData:{DescID: 106, IndexID: 3} + │ │ PUBLIC → TRANSIENT_ABSENT + │ │ + │ ├── • SameStagePrecedence dependency from DROPPED IndexData:{DescID: 106, IndexID: 1} + │ │ rule: "schedule all GC jobs for a descriptor in the same stage" + │ │ + │ └── • Precedence dependency from TRANSIENT_ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ rule: "index removed before garbage collection" + │ + ├── • 2 elements transitioning toward ABSENT + │ │ + │ ├── • PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 1} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 1} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 1} + │ │ rule: "dependents removed before index" + │ │ + │ └── • IndexData:{DescID: 106, IndexID: 1} + │ │ PUBLIC → ABSENT + │ │ + │ └── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 1, ConstraintID: 1} + │ rule: "index removed before garbage collection" + │ + └── • 5 Mutation operations + │ + ├── • MakeIndexAbsent + │ IndexID: 1 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 1 + │ StatementForDropJob: + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED CREATE + │ FAMILY bob + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 3 + │ StatementForDropJob: + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED CREATE + │ FAMILY bob + │ TableID: 106 + │ + ├── • RemoveJobStateFromDescriptor + │ DescriptorID: 106 + │ JobID: 1 + │ + └── • UpdateSchemaChangerJob + DescriptorIDsToRemove: + - 106 + IsNonCancelable: true + JobID: 1 + RunningStatus: all stages completed diff --git a/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_1_of_7 b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_1_of_7 new file mode 100644 index 000000000000..80f0a4fdc423 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_1_of_7 @@ -0,0 +1,206 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED CREATE FAMILY bob; +EXPLAIN (ddl, verbose) rollback at post-commit stage 1 of 7; +---- +• Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED CREATE FAMILY ‹bob›; +│ +└── • PostCommitNonRevertiblePhase + │ + └── • Stage 1 of 1 in PostCommitNonRevertiblePhase + │ + ├── • 13 elements transitioning toward ABSENT + │ │ + │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • SameStagePrecedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ rule: "column type removed right before column when not dropping relation" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "indexes containing column reach absent before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before column" + │ │ + │ ├── • ColumnFamily:{DescID: 106, Name: bob, ColumnFamilyID: 1} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ rule: "column type removed before column family" + │ │ + │ ├── • ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ PUBLIC → ABSENT + │ │ + │ ├── • ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ PUBLIC → ABSENT + │ │ + │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ BACKFILL_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: BACKFILL_ONLY->DELETE_ONLY" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before index" + │ │ + │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ + │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ + │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ + │ ├── • IndexData:{DescID: 106, IndexID: 2} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ rule: "index removed before garbage collection" + │ │ + │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ rule: "dependents removed before index" + │ │ + │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ + │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ + │ └── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ PUBLIC → ABSENT + │ │ + │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ rule: "index drop mutation visible before cleaning up index columns" + │ + └── • 14 Mutation operations + │ + ├── • SetColumnName + │ ColumnID: 3 + │ Name: crdb_internal_column_3_name_placeholder + │ TableID: 106 + │ + ├── • RemoveColumnFromIndex + │ ColumnID: 1 + │ IndexID: 2 + │ TableID: 106 + │ + ├── • RemoveColumnFromIndex + │ ColumnID: 2 + │ IndexID: 2 + │ Kind: 2 + │ TableID: 106 + │ + ├── • RemoveColumnFromIndex + │ ColumnID: 3 + │ IndexID: 2 + │ Kind: 2 + │ Ordinal: 1 + │ TableID: 106 + │ + ├── • RemoveColumnFromIndex + │ ColumnID: 1 + │ IndexID: 3 + │ TableID: 106 + │ + ├── • RemoveColumnFromIndex + │ ColumnID: 2 + │ IndexID: 3 + │ Kind: 2 + │ TableID: 106 + │ + ├── • RemoveColumnFromIndex + │ ColumnID: 3 + │ IndexID: 3 + │ Kind: 2 + │ Ordinal: 1 + │ TableID: 106 + │ + ├── • MakeIndexAbsent + │ IndexID: 2 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 2 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED CREATE + │ FAMILY bob + │ TableID: 106 + │ + ├── • MakeIndexAbsent + │ IndexID: 3 + │ TableID: 106 + │ + ├── • MakeDeleteOnlyColumnAbsent + │ ColumnID: 3 + │ TableID: 106 + │ + ├── • AssertColumnFamilyIsRemoved + │ FamilyID: 1 + │ TableID: 106 + │ + ├── • RemoveJobStateFromDescriptor + │ DescriptorID: 106 + │ JobID: 1 + │ + └── • UpdateSchemaChangerJob + DescriptorIDsToRemove: + - 106 + IsNonCancelable: true + JobID: 1 + RunningStatus: all stages completed diff --git a/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_2_of_7 b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_2_of_7 new file mode 100644 index 000000000000..a8dd30793374 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_2_of_7 @@ -0,0 +1,285 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED CREATE FAMILY bob; +EXPLAIN (ddl, verbose) rollback at post-commit stage 2 of 7; +---- +• Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED CREATE FAMILY ‹bob›; +│ +└── • PostCommitNonRevertiblePhase + │ + ├── • Stage 1 of 2 in PostCommitNonRevertiblePhase + │ │ + │ ├── • 11 elements transitioning toward ABSENT + │ │ │ + │ │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ │ + │ │ │ └── • SameStagePrecedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "column constraint removed right before column reaches delete only" + │ │ │ + │ │ ├── • ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "column no longer public before dependents" + │ │ │ + │ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ BACKFILL_ONLY → ABSENT + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: BACKFILL_ONLY->DELETE_ONLY" + │ │ │ │ + │ │ │ ├── • Precedence dependency from ABSENT IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 2} + │ │ │ │ rule: "dependents removed before index" + │ │ │ │ + │ │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ │ rule: "dependents removed before index" + │ │ │ │ + │ │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ │ rule: "dependents removed before index" + │ │ │ │ + │ │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from WRITE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ └── • ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ WRITE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "ColumnNotNull transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED" + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ └── • 13 Mutation operations + │ │ + │ ├── • SetColumnName + │ │ ColumnID: 3 + │ │ Name: crdb_internal_column_3_name_placeholder + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • MakeIndexAbsent + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnNotNull + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyColumnDeleteOnly + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • SetJobStateOnDescriptor + │ │ DescriptorID: 106 + │ │ + │ └── • UpdateSchemaChangerJob + │ IsNonCancelable: true + │ JobID: 1 + │ RunningStatus: PostCommitNonRevertiblePhase stage 2 of 2 with 5 MutationType ops pending + │ + └── • Stage 2 of 2 in PostCommitNonRevertiblePhase + │ + ├── • 6 elements transitioning toward ABSENT + │ │ + │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • SameStagePrecedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ rule: "column type removed right before column when not dropping relation" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "indexes containing column reach absent before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before column" + │ │ + │ ├── • ColumnFamily:{DescID: 106, Name: bob, ColumnFamilyID: 1} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ rule: "column type removed before column family" + │ │ + │ ├── • ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ ├── • IndexData:{DescID: 106, IndexID: 2} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ rule: "index removed before garbage collection" + │ │ + │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ rule: "dependents removed before index" + │ │ + │ └── • IndexData:{DescID: 106, IndexID: 3} + │ │ PUBLIC → ABSENT + │ │ + │ ├── • SameStagePrecedence dependency from DROPPED IndexData:{DescID: 106, IndexID: 2} + │ │ rule: "schedule all GC jobs for a descriptor in the same stage" + │ │ + │ └── • Precedence dependency from ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ rule: "index removed before garbage collection" + │ + └── • 7 Mutation operations + │ + ├── • CreateGCJobForIndex + │ IndexID: 2 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED CREATE + │ FAMILY bob + │ TableID: 106 + │ + ├── • MakeIndexAbsent + │ IndexID: 3 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 3 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED CREATE + │ FAMILY bob + │ TableID: 106 + │ + ├── • MakeDeleteOnlyColumnAbsent + │ ColumnID: 3 + │ TableID: 106 + │ + ├── • AssertColumnFamilyIsRemoved + │ FamilyID: 1 + │ TableID: 106 + │ + ├── • RemoveJobStateFromDescriptor + │ DescriptorID: 106 + │ JobID: 1 + │ + └── • UpdateSchemaChangerJob + DescriptorIDsToRemove: + - 106 + IsNonCancelable: true + JobID: 1 + RunningStatus: all stages completed diff --git a/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_3_of_7 b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_3_of_7 new file mode 100644 index 000000000000..8eaca35940e4 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_3_of_7 @@ -0,0 +1,285 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED CREATE FAMILY bob; +EXPLAIN (ddl, verbose) rollback at post-commit stage 3 of 7; +---- +• Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED CREATE FAMILY ‹bob›; +│ +└── • PostCommitNonRevertiblePhase + │ + ├── • Stage 1 of 2 in PostCommitNonRevertiblePhase + │ │ + │ ├── • 11 elements transitioning toward ABSENT + │ │ │ + │ │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ │ + │ │ │ └── • SameStagePrecedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "column constraint removed right before column reaches delete only" + │ │ │ + │ │ ├── • ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "column no longer public before dependents" + │ │ │ + │ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ BACKFILL_ONLY → ABSENT + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from BACKFILL_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: BACKFILL_ONLY->DELETE_ONLY" + │ │ │ │ + │ │ │ ├── • Precedence dependency from ABSENT IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 2} + │ │ │ │ rule: "dependents removed before index" + │ │ │ │ + │ │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ │ rule: "dependents removed before index" + │ │ │ │ + │ │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ │ rule: "dependents removed before index" + │ │ │ │ + │ │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from WRITE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ └── • ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ WRITE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "ColumnNotNull transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED" + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ └── • 13 Mutation operations + │ │ + │ ├── • SetColumnName + │ │ ColumnID: 3 + │ │ Name: crdb_internal_column_3_name_placeholder + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • MakeIndexAbsent + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnNotNull + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyColumnDeleteOnly + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • SetJobStateOnDescriptor + │ │ DescriptorID: 106 + │ │ + │ └── • UpdateSchemaChangerJob + │ IsNonCancelable: true + │ JobID: 1 + │ RunningStatus: PostCommitNonRevertiblePhase stage 2 of 2 with 5 MutationType ops pending + │ + └── • Stage 2 of 2 in PostCommitNonRevertiblePhase + │ + ├── • 6 elements transitioning toward ABSENT + │ │ + │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • SameStagePrecedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ rule: "column type removed right before column when not dropping relation" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "indexes containing column reach absent before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before column" + │ │ + │ ├── • ColumnFamily:{DescID: 106, Name: bob, ColumnFamilyID: 1} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ rule: "column type removed before column family" + │ │ + │ ├── • ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ ├── • IndexData:{DescID: 106, IndexID: 2} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ rule: "index removed before garbage collection" + │ │ + │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ rule: "dependents removed before index" + │ │ + │ └── • IndexData:{DescID: 106, IndexID: 3} + │ │ PUBLIC → ABSENT + │ │ + │ ├── • SameStagePrecedence dependency from DROPPED IndexData:{DescID: 106, IndexID: 2} + │ │ rule: "schedule all GC jobs for a descriptor in the same stage" + │ │ + │ └── • Precedence dependency from ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ rule: "index removed before garbage collection" + │ + └── • 7 Mutation operations + │ + ├── • CreateGCJobForIndex + │ IndexID: 2 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED CREATE + │ FAMILY bob + │ TableID: 106 + │ + ├── • MakeIndexAbsent + │ IndexID: 3 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 3 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED CREATE + │ FAMILY bob + │ TableID: 106 + │ + ├── • MakeDeleteOnlyColumnAbsent + │ ColumnID: 3 + │ TableID: 106 + │ + ├── • AssertColumnFamilyIsRemoved + │ FamilyID: 1 + │ TableID: 106 + │ + ├── • RemoveJobStateFromDescriptor + │ DescriptorID: 106 + │ JobID: 1 + │ + └── • UpdateSchemaChangerJob + DescriptorIDsToRemove: + - 106 + IsNonCancelable: true + JobID: 1 + RunningStatus: all stages completed diff --git a/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_4_of_7 b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_4_of_7 new file mode 100644 index 000000000000..20da6383c080 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_4_of_7 @@ -0,0 +1,285 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED CREATE FAMILY bob; +EXPLAIN (ddl, verbose) rollback at post-commit stage 4 of 7; +---- +• Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED CREATE FAMILY ‹bob›; +│ +└── • PostCommitNonRevertiblePhase + │ + ├── • Stage 1 of 2 in PostCommitNonRevertiblePhase + │ │ + │ ├── • 11 elements transitioning toward ABSENT + │ │ │ + │ │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ │ + │ │ │ └── • SameStagePrecedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "column constraint removed right before column reaches delete only" + │ │ │ + │ │ ├── • ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "column no longer public before dependents" + │ │ │ + │ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ DELETE_ONLY → ABSENT + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ │ + │ │ │ ├── • Precedence dependency from ABSENT IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 2} + │ │ │ │ rule: "dependents removed before index" + │ │ │ │ + │ │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ │ rule: "dependents removed before index" + │ │ │ │ + │ │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ │ rule: "dependents removed before index" + │ │ │ │ + │ │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from WRITE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ └── • ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ WRITE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "ColumnNotNull transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED" + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ └── • 13 Mutation operations + │ │ + │ ├── • SetColumnName + │ │ ColumnID: 3 + │ │ Name: crdb_internal_column_3_name_placeholder + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • MakeIndexAbsent + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnNotNull + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyColumnDeleteOnly + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • SetJobStateOnDescriptor + │ │ DescriptorID: 106 + │ │ + │ └── • UpdateSchemaChangerJob + │ IsNonCancelable: true + │ JobID: 1 + │ RunningStatus: PostCommitNonRevertiblePhase stage 2 of 2 with 5 MutationType ops pending + │ + └── • Stage 2 of 2 in PostCommitNonRevertiblePhase + │ + ├── • 6 elements transitioning toward ABSENT + │ │ + │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • SameStagePrecedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ rule: "column type removed right before column when not dropping relation" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "indexes containing column reach absent before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before column" + │ │ + │ ├── • ColumnFamily:{DescID: 106, Name: bob, ColumnFamilyID: 1} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ rule: "column type removed before column family" + │ │ + │ ├── • ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ ├── • IndexData:{DescID: 106, IndexID: 2} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ rule: "index removed before garbage collection" + │ │ + │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ rule: "dependents removed before index" + │ │ + │ └── • IndexData:{DescID: 106, IndexID: 3} + │ │ PUBLIC → ABSENT + │ │ + │ ├── • SameStagePrecedence dependency from DROPPED IndexData:{DescID: 106, IndexID: 2} + │ │ rule: "schedule all GC jobs for a descriptor in the same stage" + │ │ + │ └── • Precedence dependency from ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ rule: "index removed before garbage collection" + │ + └── • 7 Mutation operations + │ + ├── • CreateGCJobForIndex + │ IndexID: 2 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED CREATE + │ FAMILY bob + │ TableID: 106 + │ + ├── • MakeIndexAbsent + │ IndexID: 3 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 3 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED CREATE + │ FAMILY bob + │ TableID: 106 + │ + ├── • MakeDeleteOnlyColumnAbsent + │ ColumnID: 3 + │ TableID: 106 + │ + ├── • AssertColumnFamilyIsRemoved + │ FamilyID: 1 + │ TableID: 106 + │ + ├── • RemoveJobStateFromDescriptor + │ DescriptorID: 106 + │ JobID: 1 + │ + └── • UpdateSchemaChangerJob + DescriptorIDsToRemove: + - 106 + IsNonCancelable: true + JobID: 1 + RunningStatus: all stages completed diff --git a/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_5_of_7 b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_5_of_7 new file mode 100644 index 000000000000..af4d87bcf3c3 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_5_of_7 @@ -0,0 +1,295 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED CREATE FAMILY bob; +EXPLAIN (ddl, verbose) rollback at post-commit stage 5 of 7; +---- +• Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED CREATE FAMILY ‹bob›; +│ +└── • PostCommitNonRevertiblePhase + │ + ├── • Stage 1 of 2 in PostCommitNonRevertiblePhase + │ │ + │ ├── • 11 elements transitioning toward ABSENT + │ │ │ + │ │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ │ + │ │ │ └── • SameStagePrecedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "column constraint removed right before column reaches delete only" + │ │ │ + │ │ ├── • ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "column no longer public before dependents" + │ │ │ + │ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ MERGE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from MERGE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: MERGE_ONLY->WRITE_ONLY" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from WRITE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ └── • ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ WRITE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "ColumnNotNull transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED" + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ └── • 13 Mutation operations + │ │ + │ ├── • SetColumnName + │ │ ColumnID: 3 + │ │ Name: crdb_internal_column_3_name_placeholder + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnNotNull + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyColumnDeleteOnly + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • SetJobStateOnDescriptor + │ │ DescriptorID: 106 + │ │ + │ └── • UpdateSchemaChangerJob + │ IsNonCancelable: true + │ JobID: 1 + │ RunningStatus: PostCommitNonRevertiblePhase stage 2 of 2 with 6 MutationType ops pending + │ + └── • Stage 2 of 2 in PostCommitNonRevertiblePhase + │ + ├── • 7 elements transitioning toward ABSENT + │ │ + │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • SameStagePrecedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ rule: "column type removed right before column when not dropping relation" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "indexes containing column reach absent before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before column" + │ │ + │ ├── • ColumnFamily:{DescID: 106, Name: bob, ColumnFamilyID: 1} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ rule: "column type removed before column family" + │ │ + │ ├── • ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before index" + │ │ + │ ├── • IndexData:{DescID: 106, IndexID: 2} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ rule: "index removed before garbage collection" + │ │ + │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ rule: "dependents removed before index" + │ │ + │ └── • IndexData:{DescID: 106, IndexID: 3} + │ │ PUBLIC → ABSENT + │ │ + │ ├── • SameStagePrecedence dependency from DROPPED IndexData:{DescID: 106, IndexID: 2} + │ │ rule: "schedule all GC jobs for a descriptor in the same stage" + │ │ + │ └── • Precedence dependency from ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ rule: "index removed before garbage collection" + │ + └── • 8 Mutation operations + │ + ├── • MakeIndexAbsent + │ IndexID: 2 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 2 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED CREATE + │ FAMILY bob + │ TableID: 106 + │ + ├── • MakeIndexAbsent + │ IndexID: 3 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 3 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED CREATE + │ FAMILY bob + │ TableID: 106 + │ + ├── • MakeDeleteOnlyColumnAbsent + │ ColumnID: 3 + │ TableID: 106 + │ + ├── • AssertColumnFamilyIsRemoved + │ FamilyID: 1 + │ TableID: 106 + │ + ├── • RemoveJobStateFromDescriptor + │ DescriptorID: 106 + │ JobID: 1 + │ + └── • UpdateSchemaChangerJob + DescriptorIDsToRemove: + - 106 + IsNonCancelable: true + JobID: 1 + RunningStatus: all stages completed diff --git a/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_6_of_7 b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_6_of_7 new file mode 100644 index 000000000000..cc75c5cf5d10 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_6_of_7 @@ -0,0 +1,295 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED CREATE FAMILY bob; +EXPLAIN (ddl, verbose) rollback at post-commit stage 6 of 7; +---- +• Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED CREATE FAMILY ‹bob›; +│ +└── • PostCommitNonRevertiblePhase + │ + ├── • Stage 1 of 2 in PostCommitNonRevertiblePhase + │ │ + │ ├── • 11 elements transitioning toward ABSENT + │ │ │ + │ │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ │ + │ │ │ └── • SameStagePrecedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "column constraint removed right before column reaches delete only" + │ │ │ + │ │ ├── • ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "column no longer public before dependents" + │ │ │ + │ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ MERGE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from MERGE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: MERGE_ONLY->WRITE_ONLY" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from WRITE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ └── • ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ WRITE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "ColumnNotNull transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED" + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ └── • 13 Mutation operations + │ │ + │ ├── • SetColumnName + │ │ ColumnID: 3 + │ │ Name: crdb_internal_column_3_name_placeholder + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnNotNull + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyColumnDeleteOnly + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • SetJobStateOnDescriptor + │ │ DescriptorID: 106 + │ │ + │ └── • UpdateSchemaChangerJob + │ IsNonCancelable: true + │ JobID: 1 + │ RunningStatus: PostCommitNonRevertiblePhase stage 2 of 2 with 6 MutationType ops pending + │ + └── • Stage 2 of 2 in PostCommitNonRevertiblePhase + │ + ├── • 7 elements transitioning toward ABSENT + │ │ + │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • SameStagePrecedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ rule: "column type removed right before column when not dropping relation" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "indexes containing column reach absent before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before column" + │ │ + │ ├── • ColumnFamily:{DescID: 106, Name: bob, ColumnFamilyID: 1} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ rule: "column type removed before column family" + │ │ + │ ├── • ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before index" + │ │ + │ ├── • IndexData:{DescID: 106, IndexID: 2} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ rule: "index removed before garbage collection" + │ │ + │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ rule: "dependents removed before index" + │ │ + │ └── • IndexData:{DescID: 106, IndexID: 3} + │ │ PUBLIC → ABSENT + │ │ + │ ├── • SameStagePrecedence dependency from DROPPED IndexData:{DescID: 106, IndexID: 2} + │ │ rule: "schedule all GC jobs for a descriptor in the same stage" + │ │ + │ └── • Precedence dependency from ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ rule: "index removed before garbage collection" + │ + └── • 8 Mutation operations + │ + ├── • MakeIndexAbsent + │ IndexID: 2 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 2 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED CREATE + │ FAMILY bob + │ TableID: 106 + │ + ├── • MakeIndexAbsent + │ IndexID: 3 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 3 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED CREATE + │ FAMILY bob + │ TableID: 106 + │ + ├── • MakeDeleteOnlyColumnAbsent + │ ColumnID: 3 + │ TableID: 106 + │ + ├── • AssertColumnFamilyIsRemoved + │ FamilyID: 1 + │ TableID: 106 + │ + ├── • RemoveJobStateFromDescriptor + │ DescriptorID: 106 + │ JobID: 1 + │ + └── • UpdateSchemaChangerJob + DescriptorIDsToRemove: + - 106 + IsNonCancelable: true + JobID: 1 + RunningStatus: all stages completed diff --git a/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_7_of_7 b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_7_of_7 new file mode 100644 index 000000000000..6939acbf94e1 --- /dev/null +++ b/pkg/sql/schemachanger/testdata/explain_verbose/add_column_with_stored_family.rollback_7_of_7 @@ -0,0 +1,295 @@ +/* setup */ +CREATE DATABASE db; +CREATE TABLE db.public.tbl (i INT PRIMARY KEY, k INT); +CREATE SEQUENCE db.public.sq1; + +/* test */ +ALTER TABLE db.public.tbl ADD COLUMN j INT NOT NULL AS (k) STORED CREATE FAMILY bob; +EXPLAIN (ddl, verbose) rollback at post-commit stage 7 of 7; +---- +• Schema change plan for rolling back ALTER TABLE ‹db›.public.‹tbl› ADD COLUMN ‹j› INT8 NOT NULL AS (‹k›) STORED CREATE FAMILY ‹bob›; +│ +└── • PostCommitNonRevertiblePhase + │ + ├── • Stage 1 of 2 in PostCommitNonRevertiblePhase + │ │ + │ ├── • 11 elements transitioning toward ABSENT + │ │ │ + │ │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ │ + │ │ │ └── • SameStagePrecedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "column constraint removed right before column reaches delete only" + │ │ │ + │ │ ├── • ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "column no longer public before dependents" + │ │ │ + │ │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from WRITE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ │ WRITE_ONLY → DELETE_ONLY + │ │ │ │ + │ │ │ └── • PreviousStagePrecedence dependency from WRITE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->DELETE_ONLY" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ ├── • IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ │ PUBLIC → ABSENT + │ │ │ │ + │ │ │ ├── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ │ rule: "column no longer public before dependents" + │ │ │ │ + │ │ │ └── • Precedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "index drop mutation visible before cleaning up index columns" + │ │ │ + │ │ └── • ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ WRITE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from WRITE_ONLY ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "ColumnNotNull transitions to ABSENT uphold 2-version invariant: WRITE_ONLY->VALIDATED" + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ └── • 13 Mutation operations + │ │ + │ ├── • SetColumnName + │ │ ColumnID: 3 + │ │ Name: crdb_internal_column_3_name_placeholder + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 2 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyIndexDeleteOnly + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 1 + │ │ IndexID: 3 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 2 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnFromIndex + │ │ ColumnID: 3 + │ │ IndexID: 3 + │ │ Kind: 2 + │ │ Ordinal: 1 + │ │ TableID: 106 + │ │ + │ ├── • RemoveColumnNotNull + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • MakeWriteOnlyColumnDeleteOnly + │ │ ColumnID: 3 + │ │ TableID: 106 + │ │ + │ ├── • SetJobStateOnDescriptor + │ │ DescriptorID: 106 + │ │ + │ └── • UpdateSchemaChangerJob + │ IsNonCancelable: true + │ JobID: 1 + │ RunningStatus: PostCommitNonRevertiblePhase stage 2 of 2 with 6 MutationType ops pending + │ + └── • Stage 2 of 2 in PostCommitNonRevertiblePhase + │ + ├── • 7 elements transitioning toward ABSENT + │ │ + │ ├── • Column:{DescID: 106, ColumnID: 3} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ │ rule: "Column transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT ColumnName:{DescID: 106, Name: j, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • SameStagePrecedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ rule: "column type removed right before column when not dropping relation" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "indexes containing column reach absent before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ │ rule: "dependents removed before column" + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnNotNull:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before column" + │ │ + │ ├── • ColumnFamily:{DescID: 106, Name: bob, ColumnFamilyID: 1} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ rule: "column type removed before column family" + │ │ + │ ├── • ColumnType:{DescID: 106, ColumnFamilyID: 1, ColumnID: 3} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from WRITE_ONLY Column:{DescID: 106, ColumnID: 3} + │ │ rule: "column no longer public before dependents" + │ │ + │ ├── • PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ │ rule: "PrimaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexName:{DescID: 106, Name: tbl_pkey, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 2} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 2} + │ │ rule: "dependents removed before index" + │ │ + │ ├── • IndexData:{DescID: 106, IndexID: 2} + │ │ │ PUBLIC → ABSENT + │ │ │ + │ │ └── • Precedence dependency from ABSENT PrimaryIndex:{DescID: 106, IndexID: 2, ConstraintID: 2, TemporaryIndexID: 3, SourceIndexID: 1} + │ │ rule: "index removed before garbage collection" + │ │ + │ ├── • TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ DELETE_ONLY → ABSENT + │ │ │ + │ │ ├── • PreviousStagePrecedence dependency from DELETE_ONLY TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ │ │ rule: "TemporaryIndex transitions to ABSENT uphold 2-version invariant: DELETE_ONLY->ABSENT" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 1, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ ├── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 2, IndexID: 3} + │ │ │ rule: "dependents removed before index" + │ │ │ + │ │ └── • Precedence dependency from ABSENT IndexColumn:{DescID: 106, ColumnID: 3, IndexID: 3} + │ │ rule: "dependents removed before index" + │ │ + │ └── • IndexData:{DescID: 106, IndexID: 3} + │ │ PUBLIC → ABSENT + │ │ + │ ├── • SameStagePrecedence dependency from DROPPED IndexData:{DescID: 106, IndexID: 2} + │ │ rule: "schedule all GC jobs for a descriptor in the same stage" + │ │ + │ └── • Precedence dependency from ABSENT TemporaryIndex:{DescID: 106, IndexID: 3, ConstraintID: 3, SourceIndexID: 1} + │ rule: "index removed before garbage collection" + │ + └── • 8 Mutation operations + │ + ├── • MakeIndexAbsent + │ IndexID: 2 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 2 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED CREATE + │ FAMILY bob + │ TableID: 106 + │ + ├── • MakeIndexAbsent + │ IndexID: 3 + │ TableID: 106 + │ + ├── • CreateGCJobForIndex + │ IndexID: 3 + │ StatementForDropJob: + │ Rollback: true + │ Statement: ALTER TABLE db.public.tbl ADD COLUMN j INT8 NOT NULL AS (k) STORED CREATE + │ FAMILY bob + │ TableID: 106 + │ + ├── • MakeDeleteOnlyColumnAbsent + │ ColumnID: 3 + │ TableID: 106 + │ + ├── • AssertColumnFamilyIsRemoved + │ FamilyID: 1 + │ TableID: 106 + │ + ├── • RemoveJobStateFromDescriptor + │ DescriptorID: 106 + │ JobID: 1 + │ + └── • UpdateSchemaChangerJob + DescriptorIDsToRemove: + - 106 + IsNonCancelable: true + JobID: 1 + RunningStatus: all stages completed