From f2951a747ef530c4054594a9eae92f8467347863 Mon Sep 17 00:00:00 2001 From: Zhang Hao Date: Tue, 1 Aug 2023 11:30:11 +0800 Subject: [PATCH 1/7] Remove python dependencies. (#16091) Remove the following packages from gpdb7: - psutil and pyyaml: Use the corresponding packages from distro's repo. - pygresql: pygresql is replaced by psycopg2 which will be installed from distro's repo. Co-authored-by: Chen Mulong Co-authored-by: Xing Guo --- configure | 36 ------------ configure.ac | 8 --- deploy/build/README.Rhel-Rocky.bash | 1 + deploy/build/README.Ubuntu.bash | 1 - gpAux/Makefile | 17 +----- .../install/src/windows/CreatePackage.bat | 2 - .../install/src/windows/greenplum-clients.wxs | 31 ----------- gpMgmt/Makefile | 11 ---- gpMgmt/bin/Makefile | 44 --------------- gpMgmt/bin/pythonSrc/PyGreSQL/CMakeLists.txt | 52 ------------------ gpMgmt/bin/pythonSrc/ext/PyGreSQL-5.2.tar.gz | Bin 267557 -> 0 bytes gpMgmt/bin/pythonSrc/ext/PyYAML-5.3.1.tar.gz | Bin 269377 -> 0 bytes gpMgmt/bin/pythonSrc/ext/psutil-5.7.0.tar.gz | Bin 449628 -> 0 bytes gpMgmt/test/coveragerc | 3 - python-dependencies.txt | 1 - src/Makefile.global.in | 1 - 16 files changed, 3 insertions(+), 205 deletions(-) delete mode 100644 gpMgmt/bin/pythonSrc/PyGreSQL/CMakeLists.txt delete mode 100644 gpMgmt/bin/pythonSrc/ext/PyGreSQL-5.2.tar.gz delete mode 100644 gpMgmt/bin/pythonSrc/ext/PyYAML-5.3.1.tar.gz delete mode 100644 gpMgmt/bin/pythonSrc/ext/psutil-5.7.0.tar.gz diff --git a/configure b/configure index e612c658399..94a195b6d40 100755 --- a/configure +++ b/configure @@ -742,7 +742,6 @@ with_ldap with_krb_srvnam krb_srvtab with_gssapi -with_pythonsrc_ext with_python with_perl with_tcl @@ -909,7 +908,6 @@ with_tcl with_tclconfig with_perl with_python -with_pythonsrc_ext with_gssapi with_krb_srvnam with_pam @@ -1647,7 +1645,6 @@ Optional Packages: --with-tclconfig=DIR tclConfig.sh is in DIR --with-perl build Perl modules (PL/Perl) --without-python build Python modules (PL/Python) - --with-pythonsrc-ext build Python modules for gpMgmt --with-gssapi build with GSSAPI support --with-krb-srvnam=NAME default service principal name in Kerberos (GSSAPI) [postgres] @@ -9456,39 +9453,6 @@ fi $as_echo "$with_python" >&6; } -# -# Optionally build Python modules for gpMgmt -# -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build Python modules for gpMgmt" >&5 -$as_echo_n "checking whether to build Python modules for gpMgmt... " >&6; } - - - -# Check whether --with-pythonsrc-ext was given. -if test "${with_pythonsrc_ext+set}" = set; then : - withval=$with_pythonsrc_ext; - case $withval in - yes) - : - ;; - no) - : - ;; - *) - as_fn_error $? "no argument expected for --with-pythonsrc-ext option" "$LINENO" 5 - ;; - esac - -else - with_pythonsrc_ext=no - -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_pythonsrc_ext" >&5 -$as_echo "$with_pythonsrc_ext" >&6; } - - # # GSSAPI diff --git a/configure.ac b/configure.ac index a1e3d9709db..ca68dfa89e9 100644 --- a/configure.ac +++ b/configure.ac @@ -1021,14 +1021,6 @@ PGAC_ARG_BOOL(with, python, yes, [build Python modules (PL/Python)]) AC_MSG_RESULT([$with_python]) AC_SUBST(with_python) -# -# Optionally build Python modules for gpMgmt -# -AC_MSG_CHECKING([whether to build Python modules for gpMgmt]) -PGAC_ARG_BOOL(with, pythonsrc-ext, no, [build Python modules for gpMgmt]) -AC_MSG_RESULT([$with_pythonsrc_ext]) -AC_SUBST(with_pythonsrc_ext) - # # GSSAPI diff --git a/deploy/build/README.Rhel-Rocky.bash b/deploy/build/README.Rhel-Rocky.bash index 8fdf57c781e..93aa1e68965 100755 --- a/deploy/build/README.Rhel-Rocky.bash +++ b/deploy/build/README.Rhel-Rocky.bash @@ -10,6 +10,7 @@ sudo yum --enablerepo=powertools install -y libyaml-devel sudo yum install -y postgresql sudo yum install -y postgresql-devel +sudo yum install -y python3-psycopg2 pip3.9 install -r ../../python-dependencies.txt diff --git a/deploy/build/README.Ubuntu.bash b/deploy/build/README.Ubuntu.bash index ec9ca3ee752..7a0086ada44 100755 --- a/deploy/build/README.Ubuntu.bash +++ b/deploy/build/README.Ubuntu.bash @@ -36,7 +36,6 @@ sudo apt-get install -y \ python3-dev \ python3-pip \ python3-psutil \ - python3-pygresql \ python3-yaml \ zlib1g-dev diff --git a/gpAux/Makefile b/gpAux/Makefile index 6502cffd0c4..52d0773f375 100644 --- a/gpAux/Makefile +++ b/gpAux/Makefile @@ -218,8 +218,8 @@ perl_archlibexp:=$(shell perl -MConfig -e 'print $$Config{archlibexp}') # set default build steps define BUILD_STEPS @$(MAKE) -C $(BUILDDIR)/src/backend generated-headers - cd $(BUILDDIR) && PYGRESQL_LDFLAGS=' -Wl,-rpath,\$$$$ORIGIN/.. -Wl,--enable-new-dtags ' $(MAKE) $(PARALLEL_MAKE_OPTS) install - cd $(BUILDDIR)/src/pl/plpython && $(MAKE) clean && $(MAKE) $(PARALLEL_MAKE_OPTS) install && cd $(BUILDDIR) + cd $(BUILDDIR) && $(MAKE) $(PARALLEL_MAKE_OPTS) install + cd $(BUILDDIR)/src/pl/plpython && $(MAKE) clean && echo 'LDFLAGS += -Wl,-rpath,\$$$$ORIGIN/../../ext/python/lib/ -Wl,--enable-new-dtags' >> Makefile && $(MAKE) $(PARALLEL_MAKE_OPTS) install && cd $(BUILDDIR) cd $(BUILDDIR)/src/pl/plperl && $(MAKE) clean && echo "LDFLAGS += -Wl,-rpath,$(perl_archlibexp)/CORE -Wl,--enable-new-dtags" >> GNUmakefile && echo "LDFLAGS_SL += -Wl,-rpath,$(perl_archlibexp)/CORE -Wl,--enable-new-dtags" >> GNUmakefile && $(MAKE) $(PARALLEL_MAKE_OPTS) install && cd $(BUILDDIR) #@$(MAKE) greenplum_path INSTLOC=$(INSTLOC) #@$(MAKE) mgmtcopy INSTLOC=$(INSTLOC) @@ -254,7 +254,6 @@ define BUILD_STEPS cp -p $(GPMGMT)/bin/gpload $(INSTLOC)/bin/gpload cp -p $(GPMGMT)/bin/gpload.py $(INSTLOC)/bin/gpload.py $(MAKE) copylibs INSTLOC=$(INSTLOC) - cd $(GPMGMT)/bin && $(MAKE) pygresql INSTLOC=$(INSTLOC) $(MAKE) clients INSTLOC=$(INSTLOC) CLIENTSINSTLOC=$(CLIENTSINSTLOC) endef endif @@ -348,7 +347,6 @@ CLIENTS_HOME_DIR=$(BLD_HOME) endif CLIENTSINSTLOC=$(CLIENTS_HOME_DIR)/cloudberry-clients CLIENTSINSTLOC_BIN=$(CLIENTSINSTLOC)/bin -CLIENTSINSTLOC_BINEXT=$(CLIENTSINSTLOC)/bin/ext/ CLIENTSINSTLOC_EXT=$(CLIENTSINSTLOC)/ext CLIENTSINSTLOC_LIB=$(CLIENTSINSTLOC)/lib CLIENTSINSTLOC_LIB_PWARE=$(CLIENTSINSTLOC)/lib/pware @@ -372,15 +370,6 @@ define tmpCLIENTS_FILESET_BIN endef CLIENTS_FILESET_BIN = $(strip $(tmpCLIENTS_FILESET_BIN)) -# pg.py, pgdb.py, _pg.so are from pygresql which does not install into a single module -define tmpCLIENTS_FILESET_BINEXT - pg.py - pgdb.py - _pg*.so - yaml -endef -CLIENTS_FILESET_BINEXT = $(strip $(tmpCLIENTS_FILESET_BINEXT)) - BLD_PYTHON_FILESET=. BLD_OS:=$(shell uname -s) @@ -418,8 +407,6 @@ else # ---- copy GPDB fileset ---- mkdir -p $(CLIENTSINSTLOC_BIN) (cd $(INSTLOC)/bin/ && $(TAR) cf - $(CLIENTS_FILESET_BIN)) | (cd $(CLIENTSINSTLOC_BIN)/ && $(TAR) xpf -)$(check_pipe_for_errors) - mkdir -p $(CLIENTSINSTLOC_BINEXT) - (cd $(GPMGMT)/bin/ext/ && $(TAR) cf - $(CLIENTS_FILESET_BINEXT)) | (cd $(CLIENTSINSTLOC_BINEXT)/ && $(TAR) xpf -)$(check_pipe_for_errors) ifneq "$(PYTHONHOME)" "" mkdir -p $(CLIENTSINSTLOC_EXT)/python (cd $(PYTHONHOME) && $(TAR) cf - $(BLD_PYTHON_FILESET)) | (cd $(CLIENTSINSTLOC_EXT)/python/ && $(TAR) xpf -)$(check_pipe_for_errors) diff --git a/gpAux/client/install/src/windows/CreatePackage.bat b/gpAux/client/install/src/windows/CreatePackage.bat index b6a782bebda..6eb46cd4ebe 100644 --- a/gpAux/client/install/src/windows/CreatePackage.bat +++ b/gpAux/client/install/src/windows/CreatePackage.bat @@ -11,8 +11,6 @@ type nul > %GPDB_INSTALL_PATH%\bin\gppylib\__init__.py copy ..\..\..\..\..\gpMgmt\bin\gppylib\gpversion.py %GPDB_INSTALL_PATH%\bin\gppylib\ perl -pi.bak -e "s,\$Revision\$,%VERSION%," %GPDB_INSTALL_PATH%\bin\gpload.py copy ..\..\..\..\..\gpMgmt\bin\gpload.bat %GPDB_INSTALL_PATH%\bin -for %%f in (..\..\..\..\..\gpMgmt\bin\pythonSrc\ext\PyYAML-*.tar.gz) do tar -xf %%f -for /D %%d in (PyYAML-*) do copy %%d\lib\yaml\* %GPDB_INSTALL_PATH%\lib\python\yaml perl -p -e "s,__VERSION_PLACEHOLDER__,%VERSION%," greenplum-clients.wxs > greenplum-clients-%VERSION%.wxs candle.exe -nologo greenplum-clients-%VERSION%.wxs -out greenplum-clients-%VERSION%.wixobj -dSRCDIR=%GPDB_INSTALL_PATH% -dVERSION=%VERSION% light.exe -nologo -sval greenplum-clients-%VERSION%.wixobj -out greenplum-clients-x86_64.msi \ No newline at end of file diff --git a/gpAux/client/install/src/windows/greenplum-clients.wxs b/gpAux/client/install/src/windows/greenplum-clients.wxs index 0f17c299112..bdb679f555e 100755 --- a/gpAux/client/install/src/windows/greenplum-clients.wxs +++ b/gpAux/client/install/src/windows/greenplum-clients.wxs @@ -1139,35 +1139,6 @@ If you want to review or change any of your installation settings, click Back. C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1179,8 +1150,6 @@ If you want to review or change any of your installation settings, click Back. C - - diff --git a/gpMgmt/Makefile b/gpMgmt/Makefile index 372dae8ed46..499f21170db 100644 --- a/gpMgmt/Makefile +++ b/gpMgmt/Makefile @@ -18,17 +18,6 @@ install: generate_greenplum_path_file if [ -e bin/ext/__init__.py ]; then \ cp -rp bin/ext/__init__.py $(DESTDIR)$(prefix)/lib/python ; \ fi - if [ -e bin/ext/psutil ]; then \ - cp -rp bin/ext/psutil $(DESTDIR)$(prefix)/lib/python ; \ - fi - if [ -e bin/ext/pgdb.py ]; then \ - cp -rp bin/ext/pgdb.py $(DESTDIR)$(prefix)/lib/python && \ - cp -rp bin/ext/pg.py $(DESTDIR)$(prefix)/lib/python && \ - cp -rp bin/ext/_pg*.so $(DESTDIR)$(prefix)/lib/python ; \ - fi - if [ -e bin/ext/yaml ]; then \ - cp -rp bin/ext/yaml $(DESTDIR)$(prefix)/lib/python ; \ - fi clean distclean: $(MAKE) -C bin $@ diff --git a/gpMgmt/bin/Makefile b/gpMgmt/bin/Makefile index 3d9ab50ad79..3c29c6be68a 100644 --- a/gpMgmt/bin/Makefile +++ b/gpMgmt/bin/Makefile @@ -70,54 +70,12 @@ PYLIB_DIR=$(SRC)/ext core: python3 gpconfig_modules/parse_guc_metadata.py $(DESTDIR)$(prefix) -ifeq ($(with_pythonsrc_ext), yes) -install: installdirs installprograms core psutil pygresql pyyaml -else install: installdirs installprograms core -endif # # Python Libraries # -# -# PyGreSQL -# -PYGRESQL_VERSION=5.2 -PYGRESQL_DIR=PyGreSQL-$(PYGRESQL_VERSION) -pygresql: - @echo "--- PyGreSQL" - cd $(PYLIB_SRC_EXT)/ && $(TAR) xzf $(PYGRESQL_DIR).tar.gz - cd $(PYLIB_SRC_EXT)/$(PYGRESQL_DIR)/ && PATH=$(DESTDIR)$(bindir):$$PATH LDFLAGS='$(LDFLAGS) $(PYGRESQL_LDFLAGS)' python3 setup.py build - cp -r $(PYLIB_SRC_EXT)/$(PYGRESQL_DIR)/build/lib*-3*/* $(PYLIB_DIR)/ - - -# -# PSUTIL -# -PSUTIL_VERSION=5.7.0 -PSUTIL_DIR=psutil-$(PSUTIL_VERSION) - -psutil: - @echo "--- psutil" -ifeq "$(findstring $(BLD_ARCH),aix7_ppc_64 )" "" - cd $(PYLIB_SRC_EXT)/ && $(TAR) xzf $(PSUTIL_DIR).tar.gz - cd $(PYLIB_SRC_EXT)/$(PSUTIL_DIR)/ && env -u CC python3 setup.py build - cp -r $(PYLIB_SRC_EXT)/$(PSUTIL_DIR)/build/lib.*/psutil $(PYLIB_DIR) -endif - -# -# PYYAML -# -PYYAML_VERSION=5.3.1 -PYYAML_DIR=PyYAML-$(PYYAML_VERSION) - -pyyaml: - @echo "--- pyyaml" - cd $(PYLIB_SRC_EXT)/ && $(TAR) xzf $(PYYAML_DIR).tar.gz - cd $(PYLIB_SRC_EXT)/$(PYYAML_DIR)/ && env -u CC python3 setup.py build - cp -r $(PYLIB_SRC_EXT)/$(PYYAML_DIR)/build/lib*-3*/* $(PYLIB_DIR)/ - # # PYLINT # @@ -190,8 +148,6 @@ installcheck: installcheck-bash clean distclean: rm -rf $(PYLIB_SRC_EXT)/$(PYLINT_DIR) - rm -rf $(PYLIB_SRC_EXT)/$(PYGRESQL_DIR)/build - rm -rf $(PYLIB_SRC)/$(PYGRESQL_DIR)/build rm -rf *.pyc rm -f analyzedbc gpactivatestandbyc gpaddmirrorsc gpcheckcatc \ gpcheckperfc gpcheckresgroupimplc gpchecksubnetcfgc gpconfigc \ diff --git a/gpMgmt/bin/pythonSrc/PyGreSQL/CMakeLists.txt b/gpMgmt/bin/pythonSrc/PyGreSQL/CMakeLists.txt deleted file mode 100644 index ce1b626d3c6..00000000000 --- a/gpMgmt/bin/pythonSrc/PyGreSQL/CMakeLists.txt +++ /dev/null @@ -1,52 +0,0 @@ -cmake_minimum_required(VERSION 3.12) - -set (CMAKE_CONFIGURATION_TYPES Release RelWithDebInfo) -project(pygresql C) - -find_package(Python2 COMPONENTS Interpreter Development) -if (Python2_FOUND) - include_directories(${Python2_INCLUDE_DIRS}) -else () - message(FATAL_ERROR "python2 not found") -endif(Python2_FOUND) - -file(GLOB SRC_TARBALL ${CMAKE_CURRENT_SOURCE_DIR}/../ext/PyGreSQL-*.tar.gz) -if (NOT SRC_TARBALL) - message(FATAL_ERROR "PyGreSQL source tarball not found, run git submodule update --init --recursive") -endif() - -execute_process(COMMAND tar -xf ${SRC_TARBALL} --strip-components=1 - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - -file(READ pgmodule.c PGMODULE_LINES) -file(WRITE pgmodule.c "__declspec(dllexport) void init_pg(void);\n") -file(APPEND pgmodule.c "${PGMODULE_LINES}") - -add_definitions("/D FRONTEND") - -set (CPPFLAGS "/MP /wd4996 /wd4018 /wd4090 /wd4102 /wd4244 /wd4267 /wd4273 /wd4715") -add_definitions("${CPPFLAGS}") - -file(WRITE "${CMAKE_CURRENT_SOURCE_DIR}/__init__.py" "") -set(GPDB_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../) -include_directories(${GPDB_SRC_DIR}/src/include - ${GPDB_SRC_DIR}/src/interfaces/libpq - ${GPDB_SRC_DIR}/src/include/port - ${GPDB_SRC_DIR}/src/include/port/win32 - ${GPDB_SRC_DIR}/src/include/port/win32_msvc - ${GPDB_SRC_DIR}/src/port - ${Python2_INCLUDE_DIRS}) -link_directories(${CMAKE_PREFIX_PATH}/lib) -find_library(LIBPQ NAMES libpq HINTS ${CMAKE_INSTALL_PREFIX}/LIB) -find_library(LIBPGPORT NAMES libpgport HINTS ${CMAKE_INSTALL_PREFIX}/LIB) -find_library(LIBPGCOMMON NAMES libpgcommon HINTS ${CMAKE_INSTALL_PREFIX}/LIB) - -add_library (pygresql SHARED pgmodule.c) -target_link_libraries(pygresql ${LIBPQ} ${LIBPGPORT} ${LIBPGCOMMON} ws2_32 secur32 ${Python2_LIBRARIES}) - -set_target_properties(pygresql PROPERTIES OUTPUT_NAME "_pg") -set_target_properties(pygresql PROPERTIES SUFFIX ".pyd") -install(TARGETS pygresql DESTINATION lib/python) -install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/pg.py DESTINATION lib/python) -install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/pgdb.py DESTINATION lib/python) -install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/__init__.py DESTINATION lib/python) \ No newline at end of file diff --git a/gpMgmt/bin/pythonSrc/ext/PyGreSQL-5.2.tar.gz b/gpMgmt/bin/pythonSrc/ext/PyGreSQL-5.2.tar.gz deleted file mode 100644 index 9c39e0acc34b42298c3ce80229c0d601b88547c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267557 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%0A*$V^&p^r= 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 D30BGP diff --git a/gpMgmt/bin/pythonSrc/ext/PyYAML-5.3.1.tar.gz b/gpMgmt/bin/pythonSrc/ext/PyYAML-5.3.1.tar.gz deleted file mode 100644 index 915d67b38f2b096b4cb0097746b392f3270cc5e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269377 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

w%$ zS+zs{bF8wkouPF{cAWL<1hXm=s7u}|{#6ARYyQ8j{h$7U{y#?obCnAq0{?U4zew}{ zg@B!Z82{(2{jWep0Q}FwzgqbZ99q~Az=G?4*z|u<3_$;%Gxk5XUir>^w5!>=AI1)~ z+=VuKUG(49H7|Mj_Vl3yvtYA@aWCi%6jXLdi6L)Pw_ zX^WXJ{|nIo3h*y7XTQ1p`+yE4OpkYF7rZOqS6wT`=X4{?dV!X?Epr#PP2GlVg>LK&w;`+Eq$TU@Z*VHBkzh+4rN8}TZ8M+yoT*vu zh0M2v$(k|GT}^-Q`M(C~T6^K&F1OlW;Fp`>RkCEloW9+xB^2e}nX+i+mxis_;mSoe zEw-k=tY|)0HN_mwyLIjvm^7qcBuf9t29B{`|DP_z{?CIHOOn!JOb_Q)F*|t|`(@&; z(phG7&hnogxg|X$%SG`2CD`WwRlxjTXF{3zOcC>;uT+;o0|40n1^IvT{=a;@oqy>6 zcSiru_WwnnF@g#K_@9aYgi*C_-m`xS^DpwEz5gG^|2Yy8!>)G%)$|MOD; z3d;YAJp4od{}Rdnkw>F-BOPdT?@0Sd^GM4`$4CR+dpddojqVw(8{JJKT1K9NW>C8P zd*8797i{bQQvRX;-;v<7_=jraUEtpV`49Yq{D-i7_&0lj+^o;V&3a7cqXHC^|Nh+e zKOYb4|2h+_r9N5jq3A+h7xJZ7+gv>rlU{~%r(iCR>kT5`u5`?5-o>v8BHo4Qp0LL3 z7Ni;Z$vqaw?|M^XRUj-Q{^y|r%-{bvhKEU~P0?dE?PoF44 z|Gy(40sVcz|HAm6vj$MO|KDfh-wW%1I&c4{pD~O90R9W|?|p;v-!}e_@(=BQjs!p* z_+KFZ#g+fi{}1vX!t&#P0b>9Q_y3Fb_CL`7ow5I6008j6ApYmx0Z_RAKVat{+W(eN z{=*mm;D2`hy>C?h3n2fOD1i6}{ujo7k>x-5{{Z<9VHxnR;~y8g@aG))_j+^vfAV4g z+W#C0JIzrvWgDVus0QgqGK$NBXmi;&SPLbzWSI+<{co%!bhh)kq!|&m^NpmL5&xQq z%Ldli?ncQ-XbRi=izcPhe~aTrLcwhJ`)I;Y%hE#&%f5)JI~=&yE~uW~6#olc_;YUj z3sm0Q_y_-A&V*IyJ1vYg97gmxCopqzrB)$@*7rJ>RVgrcKr{j8Mrm3p$E(l}DsvU2 zBR9=}qH=Y_pf8U`v&b~NhbA_8X3W#XpJ6E+mFXMiLF?m2G>Mp(@Gwhd!k$j`jjFSA zVOcZSDTY5vpW29VOh-5tHrpx zpn3F!f+CU@rdQM>vSNMdbX{U5-Jr5A5D)rRMQq1BZ&onr@ANk{fkIL=N=uV9~^BW3&QGVybcl zsXQ=NZ)W;e4f-bZO_IJlKCr zrvH6j8;{B%nQ2`{GHxn@RQ1ZO5G*x@&Exn4W!DL2#8jnV9%j`F+$uDs3USkGhIEl= zCz@V0xX|>9fvGsts|5sAf`j}o-0|aF+kb82Kj{(3e@6lg^#cCq%Kt*OfP(zn{J+y9 z5%_l^Sp7fX_!0P@jsFEYew-u!_VJ%WpaRB!ITB#}C-6TH{uiVI6kh+?Yv&*4e>pAx zVbBNgKkU8vKU8o0KWt4|D@pb}6;j#CHYMALNS163X+a^`LL3r`>|~1x6WKyYh#{ec zFhbTL%UH5+W0rH>$NT=?kNfk(eg6aB$M?6HIrEq^=eo{$U9Z=3d0iS{{ML7faT*+E zJqVhCCfWZg%nZbVggg%%GYYz6KEjY94@^XE=W90gZHmu-;C`5W;#40D1@>^v2;p$>m%jF}Er&rGAW}HL*IfQ)H4Nd^{Nc0-QZDEg*!7GZ;y_0if0HHOuEXw`dK`nk_W7Pli^tUjUp3Qrd?Q-ECS5dFhRdU2tiK~cUyTeh@0<>M=+O)PGhx%s7<4IvL84uqUh;tOq=II3GaLHrtX2}E5I3s!-DnS^VcSIF%?7-6h4-bFnrY|s6r<=^xP zxeJe|b@uwYwhN zYc@rfG;T|MnZ5m?)yRa9^i)hcsp!OVbB!}Cs^3g9 zl24W1VKHgZr69K~#(TybQiIf+lnWL8Tjc_oos z>p7BV)w6ltgN}N~K3#%B?5L={Dx4Fz%;;ZkHGd%0$hFVz<9yX-vYOO8!MMH+=J0pX zR*c6o?rXR!hZWwNxiS0iZt>|`X&HA*I5KRV52jY76^;H#K1ueLdC>4n_=mjx{x0<* zg>;TfbqNxdi#EI?L8Zp{3fo|xbfdN*`G<`?eE287hckt_a0ZFO(2gPwr(bibqoU+)`QBv^vz$UW(OER zGOYvm*xss`KbP%D&R%KJzY?{D6?p|T6u6o#SU3mvzp~;uj$zToFqDXJzGH+*`D{o2 zfvOsC4bG(#&+dYz{;%QbWHsujEFY8KYM8I;^MZbs*^{-&Vkkg$OhXEM8%%s;G{xHIP7RxjF_+`1uryd@4kNZ7ntM;eqdX5*pP6_anK?>G+aREkH+qQn-4nuTFo^5>95+o1|obR%R z=J3$EV}V*87-R_EFT7$Q2rIuf3c96AB+7De^1 zvBo#wSqX2#4AZ94AAFJy*@OnYwb&oGCFTqY5wx9T-wM0U}r&Q zDw%fgIi~L1@wU3`*;6-N%imNVK9S$i(s|bM&<{tn_5>;h=%_Z+I>0V-NDmM>fPI4< zdp$JO&06M=zR66pqX|9uW2%#=BO$DYGcpQ!8XchWaxC{b4lNNr%$Ne6axfp+1{otT z|0?wj5{%3~${ga}(Cqw<Q5%6*VCP9VQlr-ymih>Rm$l(c^b?s62Df!Etu@ULXBv0bpgC08T|% zyxX_V0~NCLPJXZ0r!aUx5mQ926)!aj=pkNeW7|DtaUMbQR;IPVJ|m{J%)<2ZhP9V{ zG>mJdd^C(|oqaT}*7C}?pzE{qMqKN&b4P6Iv-3v+>Kz;poF*(C9y{H)#6A|1J5ugL zjrG7+u~^Uh#d-|R`-OX`&HKf8)Xw`w$$Yv}8|2eqTFd4WWLRt96J%T~E8lXxUMqjZ zyT0*_9rKvr{D5w4n*1fDF>{~$xps16!*c^yYq{%v2`p)I!Jl+jT4e&oPWMtDz8H_X zvZ-yKw=;RTf#?745aGbGLkZ}k#l(~|un!`v4E{+ESUCpXP{ZJRB$S7AUlY(QIQL0> z5c2+uSsfZc>bNkPzx0t+pwUHgzxxyl*iC^jssR&A8-W~79yHVUOlQ)ZLO9aE$6b8h ziHp>D1o#{N`Wj^AGx+ijy`+YSoGj);&2We!n|8tcpILfnBM?gkNF#2jmbBwweg=QEmxhYk2KKwAd<^Mei4zEv zLoQW$f~TeH4r+z6HirRaz@D{oQoeXElI;w&gXkW()_xP}nY@w%RlcKfFygbJRnTZp z?pE3V;3&T4OvRX0X!KO}1o8P9I{rBw@&m+M3Fdr3Iqx+KkR9MA6zE8eDI z8DNlI4KnUQcY)Lan{FXN1Wix|$Bk>juuf@CEOD(QX-+{K*cuQ9q zkvNcbiYOTfj(&jC23OeNYy!CFzRIj)^a}De8@vsGl z2hG|^>WEjA#m5P2_dqVkS(aN8Ru?CC@lPG#aKL8pMK*&Eemeh_&TwD?yJmVxZB#Js z{*6KcR#GwWv$yS%6HMb!rDKjTHRGk6WNX=bn}f*We;tI+rGd9poj|dmE-bGubc9ei zcHL{)*#5ZN((emlg`_uplVej5?9qJm3kpFUkC&eNZs5WfZ5Vi41-~ztR#{VG_(M?o zq|?``6M@fevj%&rvtQhFm?(97O3gR0Dn7RSdSp01m5G%5z3UVM8OqwleENysT~nMU zgTqX3fW`n4?MgRdZr)s-LQyURe)_eN8#VIh>`IN~$KL(%&A-_HBN6U$n@rDRx@!rw zp%jg8DAkAGPN;&9Yd|NWxs`@7V9M&tO1X6{zSy!sH-|rbHkmE`N;YI!lG5r_`l)EU zTqZ^nj;f7E>Te{;*i5{hEn-fbrcexTFLwv7*`K}l_>O_&i3 z(XxUeqy)T`vxY|kggB^<ME*uil0IZyyV>Vp%WVBT57q4VKR5~zOZLyro>Q!s-iT@9yEJhI zPy9#>zr|Me0Z-f(#JG;xPnJV)zkGmT+;?s)u#pRC*S*cS3#}RaINCOW%>KM!nph|B z)rT9#=IEve?}N)FJ=`yGE*4{97BZQ-Nuo)2y!R*Qm|QgB&Nb5|;1a@Avbpws80Y$G z#TEAU644!Q%Uj1>bMge?yU^7&QZ7@oQ>{fIR zrczO>kUXX8C{t(+YTOc*lM!Ki;&HUrQRYnrP!s}u6>ya|1^h@&{UGUzzWyy<`K6}V z{4rNituqAez}vV)JxvkUZedM>0U<`sG-1$Y2L|5*suSFOc+GQ3(wmQ`wBmb?)7?e8 z6-I)To1~zA>M^~F$d);1XE(k$H?x}eVr?n1d)DoD8$N6|{s2=CfXDJMfVedvTP-Ci zU^tL?C~?a)-AnP>hF1IL^;w5 z)MD$_B;^+dT(>-{tfJmu6>pX1Sv2!=kfoP>v-ceN>6<)7UOH-NKRI?0Fey&=f)-G# z?-@{Q;JeFM*6@s3pDEky>C2cEuE%#FKBYST-9L{d{(>lsgJ z!W~%+a1;*>Xz-3Z#}j=hif>Fi1GGL3^ho1mom1UX!jC?lKy{(AX6q^fnl~_DP-r3; zdDdxJopQw&V))VfvH-_#W}vjHcr*gSyG)7Ag7aVTW%<@TKYsjnR$F9!cMyp{rBS%^ zH%HG*Jl%i-{+pRXrCej{qS4x%M<0WD(5)^pNf~hbDc;Bn7Z{4zW5Mkh9e=+5KY7hh z!(>|UNzW|_gL#JA_-`XiNN6Q-g2eQwebq7&&&N$e?@mDK;KSkeXbFK2#l|Ke>z-0G zZ3#l45w8>J8{lyXSM$YLrKpooGsFnDsr|%HAgK2=0=RbIv)E?C0F5Sees)|!=#Yxj zCoYqu{14_!?|)ZVD3R3PATY6F6kxc2m;uh7za1`zEM!h%&RN9 z>GtbW`SE{<*o$lo@DeQsS<6)6sAA9quV{j-`{9NUb8jDfae6bEL*UZ%2)l~T$&K=M z99gmr2oD3=$1M~c2?ObL{3Ds5AJE*jg#Sw2&UT%C60gx z+o)Ci5!&7dBofii9;OG7qhP!YNsN0V_sk_}&C`X|wwdj3uf9o&jKQ4mFaU~J|PoO5{Nj(xRD05E1CX*wQb}nJ#P?KY7jRkaJ8jo-?`-UAS?CI0vy@8_#{9bw_t9N*(*bU^2X-2@nhL3@iW5s-tm4T+D&N;j8 zeMl}8N!v+Pv0#G{#65#5*_uU>a*vo$%)f}VNrq9Z7>0JBAq}iUboJmknM7c3F^2m3WxXGZRuBLZtzA1e2V?MyC4YcdL{8Omh+h?Xs@z>p5l7R4i;$68xd2 zrC(&gcmhvbt>NC%b6xdB2iH!toEgH1!N3cFtfjO1pIO=$H3G(+P&=1f+@v=^Lva=+u!fdp=n?z4y@m^tYHW={wr`$Km%vBNETo6`QWX?l9^km;il=j(Kqh4_A!vd_}mjX(CmBm!I~(27*J>QH+db15Ijj zAQ+*~05+e-akF=7<0(55e_lW!D-|#b0m)J@DGnC3G!u~8IvX@2pMG|LTgfQd8T{PV z6LuBk{=@?1tzWyK;4gxD3r~wl^b#1F4;)+dTo+5_v{{orasd~)CRu(~4#}t#S1+t% z-W`;C1G*C{LRt&4!Ejp|1TSE~(xPV*eVGaYr>O!wZ3Pc^5aH97kzYO)t4o6XZaOS<71Kx)|yk$4I;(+uA^mSON@Aa)(v>IG`ui@a| zub9ZYv9O3;)K)8VeiV z2YLDj?=&sb$Jpw5{KOWtM}u)xmz~PxDf^ul%gJMf^``#VdF_$l_tYml5z8@SY4wW! zn0fdub#R$j53Mu}2bWO;cVd^b#%k+5{fYBUBf;g=ke%@5sImBZF@MCtGfXd~2JFNv zM=rN77c8fZb&VA*zgiwx{v(9pm#CJr#mC3N{bZuYsY@B?vHm7=}~uT4kj>UX}65DlT)HK82El?bgpj5 zyM*M|ot@L5wG+6!qd6DwXX72ot2;TTP^&vIXXo>r>zwO9*M)$gzR~0b*Ll|^*G1Qr z`MLRjV`B}4weS5sJ%d-8#_5f0fjrxy3tFQ=xE+_3%JHd2*+A3noCU3}t(r7$!r<`Wz~J~`@8A%=0WyUg zz&K2SgXvT%&!*Tv)Nkk$Fa*7@Grfaqx{3XV>WAuqF&Kiq=_IP+CgvahH&h3VfFd2g z4F-V5AXEcv!4@n;SEG7v5ts3OP%XF#=r9|dhbp#(T80Rq8rXmhn4iu?kENT?6{%U& z>vRQr8Qq<}L>HlFGdHkpbG{ZnuktW(qO*A@%$u3ScAC>(_>=O(fQcW?ip+R!n(8XG zxj*ba^B|iC=cw=}m4`tSznaIwf|z&ML^(BuA1kjuo;aYk>N7Fayb;FF%*7nbY{IO_ zmdR$$tiW8x?9RNzEW(@}-oUoQIl#3nQYtp8_6b^To@i;g93I6M&nYURsrvZI>eq?y zE!V>f*}6G%L^RbNhpc{?XluC=p2k+r37;b`PI!jnd2Wh)R(%}2+CI_MVi#V^w!%3s z@>%UMwAwP!+F}qM&xYk(5>x-iB_gP<>Ekm;?s<`$e7P|4Do?h6x`vO(9IYoJH|BC$ zwQ-W#$`dKZjS>veq}?XZuU1WxS`{OOB88$b+-f|9k#>=GQ6rHfQ5umN z27dAX1d4=)G|W*SJa2<%{c*&&3|)sy&L)b`igNk1sgR3?`)>^VhkW5dhq7L zTutv{zM8&g+_+$)R^YwO<+;XQYCexXvMq&RuqNg9=KNe$FDYM9Ur1lbAWI(;ry5_N zZ>Mi(Frq(VprNnP;TOLoprPq^``_H3%E~Ec+4ie(*@7Bces}-<`%_oB;mqHDI?h3` zLDTQfzqCqBT_v$SM65yG&;1|ePi$qDb8Wjv{Fp$4hM(s@_)mCclyiK$XuOs{koxw6 zf4hHTDkCe~D+?;qoV%QhDqmF&RDP`7u8gbvwKg^t)V|oh6E_&YB1A-mIMOB%B~9y; zL3@0hm=H=kRv~8ELIGECd7+IAkVDHP2pbxb$EolGG$%2c7JNH!}BFk z7_Sl%MEgY^TML@n=@5H~5{8uF$F%R{zO{Q(-5r>hYA@B|)MD|%o}#9W!*sXql6vbP zOh0~j#|@M)mvc9%Z!WBsNR`Jmsc$ckOL)t38Ux{lwvtHe*z(MqjZgY%r?!e`EEh{Y zS}&EW-}JruFXxZaHML6rypUVOukZ_IUN%{7FWxBGIAh`L^QvA?{(k-X{l#_OLfK!& zud~mqd4>EP{<`%-h*wS4!(=q)laiPJ-|?^X7i_#dvZ5xMIgih+`TQOFy77Xamy0)+ z*MwJ5HdEG|SAn;T*PVBXSA;hkDe=3tKq-|p4h;ZrB5DV0FcdWyExb>xU&Jl%D{4S5 zcqG=3;Fh_I8m=rXC)QJO%Zx=qh6|!zxaG4&K{^XLN%i+|%NL4*E-eTeI!G1Wm-JOc zJ17-hNvuC=K4`QsZ0Mj-v?%VIeS5{@gFnxZox%39Owi)@@nD>jn(Lp-f(wSNHwk8@ zf-apQgomNZ!qQw(hOJJ7htHISWw<&FTfGPmpDMqW<|;I7btOEERDLbPMKWv+AUq6H zwwLBgGi<#>co?Bf(-91j;ld|I649-egom-p_Oe`RhOH)qhcU{d$GQ9sTO9}wDSby}C7U3~gnNY=po{}Pv)0MR)VolLgN(Az2BnW+7%XQcwb33_!88IuAdo~T)>N)mv&Xx%eJpXJ5@*wJbs5TqhTa^m z9x`3-xVmg*|Ag7ANy8@QL59U~xa}khE%cI95nb9h6vv(PTOtm}o&5VylDd(3hvC9` zbhda=vb1kB?rQRHfh6@S<|M-fO|*k}QH-?j3*71C-+W1w2waFv5z%nLKdIixe9&+~ z9X%#qlqKyOgY!uKEs|7!#eBzbK^v_lUKAz0^&BUf{F^r^(8#>oaNz>FQM_nhlACnV z@uWbsd6#smWYN(iH<=>UBsbY2?xY22g$DFbQG&UF?RL_uK*ERk>VL8dY=%EC5gt9S z7Cx?EaGvlerCL}@p#%N%0O3(m^=nB5WHSc=!lPH!ucZ_agC{HDQDU{dq(U0{Cm-Qa zYPG$T!XWx57vWKI^{AvmE&8Vj;Za)ksFcDE`X@7CJ)v4tQXwAwlb5ibQmrYa(2f4d zK_FbT6+~a*bqzqe|S63&zvLX=lZHLiU*j(qO%No#&q6Aw5+nuC=Ktg?d^|EXk zo8jUmLg4di(c@(XhKtt-fiJ5?Wy@p@7tw^kXsNP7^r8SE@Ktq=R2d1q$Vv!ItiCB( zmWE#BBTzV8>8aJQzAYqMW{qA{Ap~YukBgV7p%)bhfmzk#5@r7AMJ+-gwpv@fj0e3a zMWCctYfF@wq8F72l-Jcw;$>X8n#5|=#DO$iO-6Nr;fM#}V^np2;>Si@Sx)tmlsgqY z!btE-s1}iQk3x?eBKW0Li%7Y5phpf6{F17(CEW|rBLW1!SJl~4?)>Nx8G>I%wZo+0 zh$3#un&6jO?I7hoh#ui0_$615NxIjfM??sIY1Ly=?mOraX2NztwU(rNJbHweu$@w^ zCFS0Y9^oJiTpSie+wr;vp@%ckLiA__Tv=*$P2xvC!oa0rbu`t3&=gfYn7G}DYs{%$ zky>IyQzZx?>D6KqO9p7_SwcusHCA$|5KR>zguJT8N-dGlR8~UBi)xI-5fYH0^eWhTH0)hNlOcr=xl0H;)=q?WqTR1U)U z#bF_I5U(qQ9?n7sMOW7*Y+Dh=^@m5$9Ug?rD4*YnagDhA9G`zuB2;t-Bf%@l=e49r zA-Y3=;PuMqwUh`6-N8!mO7*dq5*b8ya1p$ceMTikYSA4cgtZhOO(~IXbO#5a_o8~H zVaF9hud%v0E1yq70+fvlOzZM=~CGSh9op0AlfJAc=kO* zQUDL@-y;?`_}d~SzkD&i@jVKz zhrcdTlFJuOkvH^uxO0)>UB0N;_#TgZ?Z+Yob8`?->fzZ%%1HU*O4EBhsE1n?DN*H% zVvX;i^?G=Ik#etm5%c-I=VJ%#-)4PQA-)F|71vt+&x`+^2SGtZ$d~n5t@;xzZG__4 z5jj9#)(VSLp_K8v}u2= z@9{gC*?h_3W_a?9%ixno=@2P{4S{11za0hgs-=G~$y{2NJR7+G_kv(EQA7HQ1t)UG_^?w$P@!nUq?r(&| z1ZZ~^zpHnC6@}(-Joyn(BN`=Fb+(154t2H!RsUY;-OM+(?BuTdUYsey=KwpG2?qUH z{#$;{43Ov-)=?8XFA#xOA|e1`anqhdsD^kh;YV-i-34HSj}I|gh0T}k$)?}g)?C50 z-{^U=ZYGnW4vHhkEcjA6$9TiN?>i_sn#jf|%kyIaM0Syajq4Nb&=vG6kFNS#|@zFSOu0^j?meWh;GdC~lRnc}a zrF>>)FcpEkF2Ra?K-8uvk8MDVM`nOB%Kq-vVesOeM8oCcJRw`j+wX=Yt3!2Y98b7G zo;V8vSqZ=wbX$L|o0!*_iRxzkeEaCsKZkdplVHBuWhU4A%=}* zkWazSF~cI0*kRhm6RRjhQ!>i=NgNpyW^nLT9MrF%cL(i%#pr}i86=#{#eCnR)U|j! za+g2i^%{^=VL)c_Bpnq*^K6>L3$4W;D1BBD{QC8l2TL#I`!$b$W0m{r%IG>$sjh9qK)db7!PP2es5WiV{9kIW2Q;Z|3bSOhWoGiwB>%#n*k$(o>m^G0FTwWj&`I{|Y(55%yF}=>+24 z_;NKROr&M*^aQaTpW{)7C^r@Vv_orW;E{}qjK3?l$SX{gFyKm)b34`$p*KhOCZPsl z67$|4d6=JCy^mpt2Vr$EKF=UTc7Vu({z6rj%>SOMGmx?EcnM2Iw?Bigcklhm@h0zt z)BKHLeqoR*u&grQdeyS9?)>Nj%6Xp*tX&x+=FFExcM|GQY?H)}C&Hv4to0J$Mqq53 zX?-P$>md{9+l8c-iL*TbllT*2Ed>+C6;voZlYyKzP&`?o;bd`uG2UarL$4ZL^=H=Y8kr{ER3cch)a^0v#OjRRPoIf1z&^1g8Eqi?ImqDS))##}cGbg(CYIF>3? zp5T{$%YSbdkM;h@5h=57G7>9Q<;Br8N+&x}SxP5s3Al{lce3Nx;EaZjzw6xyCC`G0 zBD`LKE<1&fS{Cz#M)U>c6$Zoa8|71ae=&bRa`!CgT4YAp8%G!P&-B9hjMf@N{nb-z z&I$eE)Lb-9EolGan$5L)O@-P0>%Jr(C4&OW8*0hmZMTGnk9}V;U5b4k-)E%z7H89N ze>Uyt83!ZSCcHb(E%fO+9@*X{{@^WQO!Mt)FWJH38l1CMjfc1FVeGt>cKnC8@ z>D+cEYu(%De5&Xw!a>vX4h(On$?-)NzQ6~E1mxqc=qF+n=jo5 zVk%>sj#(AvS~kZ$7mgO!$~&ItghPLbOT>w9_=d?~h}^KRO1;Q^&s*GPjPS|Lk6YLl z&~Q1dj(SQ-@JXUbxqB>*3)58=kzb3}HK^ zlV3}Z$cLvLH@9ewC@Ad2(>pPxW3^B?KOKT>62f{eFR zrsMh(^;4vWw$Yolw%_gF&DNm?%CVZAy1R2~8I;3)D|$^|t3dIEqu9D<-62Bjnrb_@ zeq`1$ybC18QBbD^5+w(LwxVYV!uvNkZ=r0zhm6>kz}Vz76^}Z_4-?ulWV=kgme}6P z96#3kFH+rat{1q4^XS>6=95Z#7QEls(3r|IUqTv2^}mi!eJ8*4tnT&vtIRKH{ewFcM$@g1Qr*4cI7Fd2?-_&`ibf@Muo5_qqiZ;nSqtE-Z z?NyKM_HL!0@dr{D4k+1s*w$GzoJ+dqcSE)Nemcj)&XvQc?v2Ak@%xt&V)viJE!h0{ zw!Jxh%hgq2FTt5N(P~iJRyj(wxJQ#z(!M!jozZVFpmQ^PH>407vzhH>2*DYxkpZQwyJmQQxZt#LnsA@m>HX=A5yeZx+Fnr5#Pl>e=)O%SCjHi zoon3iv;ZXU5lFXpC1MSU68GsmA1Q3tzgoY)Jr0=($TPFhNK=p#*Pc`@U}*z-Lmy16 zV0TZttn%9rGoy5$A-;pzi~$@4*KAsrjf#);%j;0O@6hljaFqmOGdTPWsuBU75&Ly|7e@|&=qqM zs&RQRYmV_mGv2zo47k>_Fu`ePDrnzqaEwXMRdC;CdKY-sIR-a$GtGl&*QqkQUPf$A z`+)f(cv;E0^}*G?nNi!j8?`R{l;aUn1x@$i4|h>dqEYS+kF`8ys!=O#YDx1yqU&XF3THz@DJhTh*i zTWEbJkf%AT%yEwY*5VzHEB>D=#-lQp-J4{WZl|7AG$XBNAN?u6*(Ps5H%)%~j>bDM z`eFH1-sX#E$sQ_ke8StE-lttAx3QyZn5IzvSxDn>slf|v{equ^-JSXUM=si$hHQ;3 zs0>J(l?MDt#$*SvkW==9+;_!O6?UugE=M0bf%v)&RHKg=8Pi0|T4A_?tx{Ho-ASr-L*BApZBtOUV0cqlR&d=>~?+Ql?dq zO<#=qctd-H?70f&j8E*OFc&t1&t&Y%`HC;J7=)gsMM*J!u4F{ioAJeKj|mEL zPNm0^Buaifje__$!DX&cd$>_@&mOrR4^%tCu5vS_@%1@}tMI7cPVIZI@}pDw!R=2O z&V+6wtAg)pvOi_$nxi>xKMZzze1~fgtD0q_w!%(jH$VThrc+bp(*U?WC*gn~l2>WpSL`jf4OnUwppMw;n~hm|Y{m#Qs1*T

ZnIetJVE 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 Ue%ep_X+QA!KVfduZUCSt0P=X?Bme*a diff --git a/gpMgmt/bin/pythonSrc/ext/psutil-5.7.0.tar.gz b/gpMgmt/bin/pythonSrc/ext/psutil-5.7.0.tar.gz deleted file mode 100644 index e8b1d804420a9bedc1eba739666f0edf7b7c917e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 449628 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 czf<3|)FA>gz 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

G^Q|(K=YA-6^eO8w3*-QYhT`c zU)Sa;hjOVJbma-__Tazk zh-_pvwJH%yaa#-W8(P{@DT^qb-m8wH*TM}NYF@MH%ARFjn{;E-`!;SeAy{CS z<5W83OfsQ#3!!Ye^9g{qU}r7~4ELNbGM(o~L9yXJWz0}UMV`F~-t08k3lzyI#^)BW z-DRP2e)wIQhMO!UvA;}w1IY@1-Ew%X{J%z5ysb&j-zQzd`Un~&Uj)8-0_p+ z-S6w-cN41C1;WSTq2lPPIIL`#H7#GEpW2H;zQTY$@!lXyOC}!Px2sFs3zHv_^-Y2B z-isqQG+01KBVvcqQ2wsa45t9}#QPEGyIhZ+#uKUu@0G00YU3wthoz*{mQ2AHdCNWL z#ce2#GhD~U7SR{BhQdgqthwsV9kDh!Z%m`@^^kQQE* z&XRjuuhq-K_PnC|X);~PM^a-VawzC3HrD776=s2}B9GY~C#&fMPn(<}k}LRW`n9xd z#eIgMYr8%jeSVX1;q<@JkkFg@@qlS}j6~Hau;1_u7h?V_9;b==HD3`zXeQB+0-?Q~g}+iB)GcBf z49g^2g8)kS%tx4kVcslRkIFMB$+M~F;nt`;!*la8gc{Q0vU{A|*A@)>GRuV`hN^G} zRWth{y_o;oo7_9>mapN|dX%+D|Bc%lbira@)6pUve;84FL11R!2vRlTCx;H`Jhu~t z?XtYNk*%`9b&Q%FebqG1a@p}Z%y>r}>Q35k=T@ZEmZZ(CNyYA!m^aR0#kyS{9{27G z(I)n&7F%lV5a41)TN3NXSqC?H)GBd6(${ao7CPX=Ek`B%5|o2QYke6ip(JJXNV55 zT1Y@UDL>$?H9nA$)Va^^1uO$WHRMnlP|Ov|JY*UvY)o|(LvEC2s-w%qZ?_dIRS_d5 z-ArOUP<@F$IP55`OAa+{AqP=pTROZ(UBVnOD8vU5Zx6?ZOd#e;cN z7j(wKB&4gARDhIZg29lM^B5J9utXxLKnx9*1?yG>w#Ugcmp2DkMLOy0Hd9mrwL>2e z_;_UI`0{a`H3~k3Vib21kfG*rM1U~*5K=r$Qjtr0gFFam=Ft^&nzeJMAcCdA(K3&2 z)1VRIFjrI5ATLlkPq%eQacEO;nZT_h3JnNZS{bCuXSFlctu7|;j*ITf<;@4LW6Y46 z6of3-v(_ zL*qQ0+OGoG<5mM@J!chjrS1ww#jJcsJu1;*5v(Cj2m7~^sTkfdTXsnWif*wBX)0m| z>;2D`tdOCgG^T4T-Cm2>HLv%Ny9k>u;?-D8G>HZ|M+uw(o;Y2GP7Tu8k`Ssb$J+w8 zQdUfYk*+b6tX+hR;ZZ22>sP}XX#1+wY>rtepYMAPlM4UW?s_(&pc@ah7u&^oP@z|` zOuJDUAZejVf7Xrr`0Fg3hgZ_~_*xW7Cr;j2Oy`M&!faoXr5I#UX8PDzbG%AZ44R~x zA8`BOIY#;|hLW{AX11YKl%@(dG%6FPiT-ZCYolO@jAi{iwZF;Cx25n64Zb#+s9F0Q(TS5ZNE-G0EwimArKA?KS#^p ziR$YSfD0g?ChzKKTzqeBmx#DXSd8mQ%qgEt*{nok(C(X z^M}gCACC^fz=&>-4Z%3wf0uuQxpRRX2vEwAO(-dYf%+oE;Ev5^h?31{?HynO>5Z*pXcHii zzy#_ROX`*3F~}EK{<{da$K-(akQfR*a{F;~1%eCINcf{9dfRXDz}XBozm~Zt6A2Kf zj1T6~t$^;+hDF|q6eg7%1FT9q1sgEE1>0Vskf7KLTI-1XpCWXn^i?k8Y!#lMU9Nm7 z4HYd!O{Je#@R0dg{W{0mBsK&V8JdN&Xe2o)U2}dQa68#ji;wNG(4k|6h{IsWo!BHz zL8q}$xGTEtr)iIy3^{SJK%yQo3)^^aB@H?);j~gpH?Awx?S%L&zklElN$8yT%3Tal zG>R`Rh9@6HScCfngYNB6zSop3zc9_?rgp&z%n~mDZd;hM>+LMUeM!xyuKJO4V9mP)pS{M+JFaGb&kMlO zoqy#5m}Lky0#pOU^NeO|fp*3bqX8h44Q89Tn(cITr@yB-8bwH;x>A==xxcv^B%6`WhS zIBu?EL^bqlVWHpc%n7c4e1CNt&ut!Ax@k5F-Fv+E{$y|G_3PuFH*k4ynqke+^Z^=) z_E*JlwT@O4{XDge)2c=mq5^C?UU8F|&%Cyk1TY#+da-rpgu{Gm0nckaxXV>SBwF|K zo#&ij)3vsAqVrKVm1G|`>JJ)Wd#ZTE%`gyZ-O{EKt6Upq^k+d#CP<2+C6Z0iVr!`njn3q zoa!ikz;Z4lK%5n4o$~7THYN#?>DDBURsnc?TudPuZY2%VLDgPO->NF$BC0D;tKX!9 zPe@C$E!$|U-Et~N_B=Eyr80pi(BbnUI$WAlwzrOm+H>FF(#D9UquFgA;;k)^E{a|v zBKQ$?L3ZyM%`kbREs`vYFQ$&v5kQS#q7g1vgf!)c1SSdB6>n>(QZiT zgbz`I_e4sLCKE631Mh@)S~SV23z{nLAKg4>?InDBNelbk&aTWKSp#hAVftWyzTAUPU-n)WCPcWLr4}1nyMG=piCUt1 zSjVu(W@)}1=XOgd7&hefvGC{2Y#ECPyMeB+kjCw~?EP_@62Zst#S5zh>5OCBgbJQc z;9uBsn;gslr*B7F74llJVn|+A4K}YVzG;2rcD}4_r_>6+8NJ;<_)DRgX%x&bd}ufA zbkD+#%bkrk{f)2A|1tdM+1CI3W#jx${y$#+v%~H7^^K-=#c~@dT-&eaALfWUEgJO{ zkvPOYd-Mo&xYy$g45EDhsMMt6}Od z1PzdR?Ij{_xm1Fl3>0WO{rqto>Tp<5Xc1&}Rh^)T4;-lyh?oHT*DZiXQXc=Tf8HtqCxchG5r$2B$dMBXs6$8uxzdf@BpiWL zkPzvyZ;6m0>}x&_GZ2i>wf$a2b*4JdpyDl5sbSrU#@O%m)&%-;bWMZ3q5=w1o%>ux zD1V!81AIEdR&%T_Y4uYW1=8-*9kW${m`*AJ3+v)PzELYR90Uopq|mlgLHmU_)sIUY zM5N5eqzYtrh<6LQww+z`W#nbN1j+U6G8(hY)+K$TP%?>7sNQ;5i!ph#{x);7SIkO zBVHC{mBInRMdBqBt{7~_-SOv%KN6U)ep8XPtui1L&MGa=jyO;|;$6LedoEt^b0uhVL7dLFQ0eh zyew{;OwJVf=@1ZOMzx&CUMeVxGodU5syEIcqKTaOn@fd|8$Q zc#83dM0AN7N@0)Cfalq8^Tlx3fAPY07Uj{cG=F)MM$y~&g1nE^G$1a+bQ&;R$mTH6 z5>*utgy|Ji3|PIAq6FW+JAD2A?cTY|>IZ}LLzx)36hGI~cznlOcWw-9$|S$o-x{ z2Z?iGoq#9ZN3M|S%o#c}^u9fLy^$^NF#tIn3-e4Mf}&^mMTEiOiS`Pwnz#GAdj}_b zbPXD`TF8W;nHooFn?y^XvxaA>V0vizdMFUZV>08#vVeSLEzSNB>)7=JjD|9t@#>9m3@@VPZ4}L0SOIxR z;;68XUF#rOM$*+X&Iq~=3Z1Ob_X{OGynkZ^7Oxvom?-L1qWm^nbfJKL$sDN34_Zg} zM=;!rMHHr)@McD>ADVAL))mT_=y%?tQN6>qtWFG11*n6k`?6WmvV$#;;Awbl@G4QEfs%2e#`FF zR~05tJ-~n^@&^+)^H(rJ)Ly8O+QrXgo8BDn?ZM)7y?VQU@ct*)3ks{?dU1HPcTiFo zU&K3JaO8H!3*oD;zmgr1NeJ_Qc)fzPT1d7Cm#S`Fs&A9z!)n3Ictz?v0x>aC@H~t6 zyZgt-?@!9#o7c|e=^Oy$<%#Xc_Vp<-kbQM35tP0<5eK5LPNPMiuTE%1o3Bo+N0@Jr zvT?Z_MZP+X73#fNVvO6~ETtZb`4Wt9?LP8P6Z-X0zvVI1rMhGr9M>-6v~4A{Xg2HAez|LSE69bkSQy*WIF z2b&z1UbxonzdL#>Lw&Z!EN#o3zQ`8Sa0%2O1T=Wl!ZW}fW8yLIp0MCYMoqv8i!VoT zXs_4xLIu$-5yVNz8 zfe1PNkqfS~O-6=EH1+O`C&j+n1I^_S6mLg8AIW@IF7NB0~uu+h8=B*a3!jSTa4*Gr}AWyTQWMdz?wcq>ODx7v<6tBYc0v0&N z?5RkYhg}ZG$ZZ2Vw8DVgra5~t7gNq0C*9|Iw9Xft_f|2b-qM)qeAw3#Nx6$_cmH~G7fgG;VaQD+GOx95vyD{ znV>XrX_awHP9PwKQ#22p4~Fb9>zXs+m(Zhi06O_*uR&bgE{9xPi)?Cb`~p~|R)MC9 zYRW0A;fxo}HY>J=T-QTh*PFbqhb>!kO7Fg*cUum7cySOrZrhe=$YD|;tBmEwa$T1< z%okjLaSVj>F%-eEBC+x<0r6v&>u^Rc@k#vRX(o0Ge4#P!dHFMW7nQ$jI}7?kl$6J@ z#J06dD#d?o2mAbP%o+{?jDzE;S9mo-JcOc zBOcEP#~{aUP&-8j1o;-pBT}aKCnu6#BF&31f=`U}YsyfFA5bNQI;xdsX@tQ{;F+ZW z3-lv|d2t|lGBgH!C6$abD!n?Wg_0YwE66UX>j$gKFfb(rh`gzcuTU~J<#bFlfpWPn zKc3trWI2`{J^@^aDF2WQZcv`dx|(pKhmy*c;_yRjKfP5R4_lU_JqvMEj(WZYNmn#R zF(eciyLtpHkiJCp8Iy)!1fMpLs1U^Zc#J{O+LB|V?~Bzayu3to%X|5I5vAj34oS^| zU<<;biHY(EMEDEi0N|&#Jb*}OPfE&@rJ;uUI-!;=!juxqZx}AEolX&m8^2+^&QTU$ z&BLi(ShmX0934}sU=H{LaWUJz85DwS2V=yxOs%j#ej)k{IU(t&Dx;1=;3 zz-w5nNZqJp#3yT3Dm-aa;(`J;HY#$#p(&_LTg9PbGr)YXZwf*n2#|{E7OXHLShE&j z(ofKWtL81Z(ppeirUAvRp*GJRzqE6I+yGp#!euqGJT zHQI$HCvUML`O~aR*`B~>c#3Ee$@?G;MTCJYK^R70OB0Eh z!cTA!J+E`y@f-1$dCTf1TeEI?5ErN0o3BNtFh^D6NDl~268b=mLX~xeO<(F(EGt~r z*gBj+@#$O(aOmhP@-OUwW3$lRqH7QTza1<9wtS*L#B9{Ze!HI5cDKB1QiFbPV`f$qx2MQ@lcn+Dbo2p*iQ}jslPPjuJGFitP&n6y0Xs?!E+kwOJt`p@y z3CK)FxywW=<|2}J8k4}JCvMmn`S$^#&$hizJdc*-7f1Gs!Z9wKPCHGAk2Xj>DzT0R z2~)kgg&%RCp{8mxPW|!n3k%nEY?vm8LsCNmcUlrv)?ZM!nin@0V~k)SEWi;9HJr+gDFOn>`aKm!Uf$<|N*i!>V zoqF;7Ci#GbV1>SR@Zd6`m|XJGe(9;e1jtBaf%jw7fn*YREy={z=eNpmOE^U0*jd+B zWPG)YFS_HYejfmPE=s%Q1C6*;nICBRbK1XPKWN+9S4X=;eU;M=Q3Of06WS4`)pHRv zy}XCZC`?}`xATwaq*;XSo3ELq>UL^;8Q925t>Eic32)pusCFI>Ue|OQx5zX*G_2MR ztstS8+;ph>7q^K8=Zf%MI1t-7LH!B$Do7Pe~Z|7+LQ`~vKBTSAr zl2|vs^%lMz4C#>*do#-M1FyJsv=zMc9m!bjqY>RD^E^?EU3n)=D=xEdk&WAL{z&j-lPh#Vt7LV=FsV!w zlo503Y*f<<7uWaMN7N|UsmD_1YBkmBa&sCOr4K9~L{M0ti`9A~hZnJp>!HLCQb|i+ zq$YZ@%QX61(-vXcj~88lEkhWI@aC#Xy?JV5f6StpMZ-X_!cZzg_tT_kGlwdkC1wuX zC)`Yt3=#`YKM}#$yNvII0d8R^NIbP=ca~YZtBm|3a*nj19L{cmqify?E&0Drp$$j& zNI;7>XmXy~mPqsY#UQx z*%vZVl@`48Sg>3{VYM2kL&v^2j+X0ApOwWqd(GNRgGR%`6k>%G0s+wac&K6A-Za5= zN*B&;N6Raeq777zWu4PXE!aX~-!BQg)}e+)$NMeZKJjHt4j|!D^Qz}9hCz8k%M3ZF zA8%1-$@b2DwYIN_R$ zEA(VM61OOVM(Irq?QrRY;`vCtCYifdKSbIW$R#r&>@=mTHaT=3a|2JKDvI*0x6<&mqT#9Bg z5v?7(s+%q~JQ%!wN6ja_Wp@q?Lx3_dGMNULNwT8IRM)CGq8uy|`?p$(upJbnvv9E{ zQS#@@F6S`5tj~tIx!jyJIGO`20wi3z?hFvLiMkVFu zkVyk(KyX*pqs}iz6i5t`LFlQF2osyk%mpmA4~>FbP(>7<9b4V@TZM4~fg?;Q!p1L? zFFHM{%@3}imy2%S_d!aQD~#?41+FPl8G+Yzx(#^EkZ2)Lp8lKh9e@Gh3S1~%j$wI@N%K?Vhv}5t#hrG%V`2jh78on&M!iV7}EvW61dWCKJ^@}Aj=}c8x}(m0RK5N z6fcB&Plcec1F4&>fIJ)a{EkJOW#@CH6igwfmBqOs1J-HeXKos0Y~gknv1BDYMeScMmkEDYb}E zRu6bFUEvJH_Ki%(+KbHFNW3YzBYPVQfpWpd3c8&FB^VLV5$6xmXfX}PQMYq)x^sNG z_Zqiu$2ax{{#{?sX5=U-OOV9T>-c9I!+eq6L!Zl%4bBS3`%=epCiM_6_@aOuf9=78DO6->y zIW+BfthN7lUid{W&o(YA&fniPAL)(yksPB!rqTCa|RTTc_mgmq`8;@+*ob9TLfx-1S-<5?&vUB>#OYs%N;7VB3* zfJ(}yrtCo{*9n;;Rv%fmnT2s}@3_Dud(eW#14kI~+;$5F*k5=RVz?=jCWQ1FSVNP^!Fn*78*uUT-4|E4Mk;KE zNQ7UVX+$G24Ssc|5h8=Thb_b6l01BJi%WaP!>P3F+p=1U;Dy_c1%#P{85#@_dSb&d zrxjC?vB0BHYABAtE#R{zIkhbiHS+{m_R)jB_wHM~UAOU0Wi+ z7M?%0DgfcyJYL&Rfs{-xw^{heOXcD4%d4gZvf=UKc(kf{Ca6%S$!c@!R8}MieOy~; z-L7u~ksR{3D+C3|tthOjs%x0E`mJ@%SIe3t(|=T(cx$*CXZfB{shWyTm^eTO zBGg!ZPSD=sqvz-!6ptBJ(R_U0_SdQdnDF(=A3=_F>j>}Gts}f^n>K~Q-qU3}3Xev# z%?l?z6+XJYh52WoOi^touNIzX@!z9PMTe|n)Dp3bR{cQG8kX>E#kpaW{=;HH~*01~g)0m$&c9*|KbnpEC69M`yMiOU8Jb4w0Zzmeh-rf~_}e!T!<{2J$HK2^_8JgaSKjR7ZG%?(Pm zTP3nt&m|HgmtVYODs@d%YoQ%qvb~s4_OpqT!x`}ySi5)@mAE02MVyhVaD(J#6|m(& zoUInHqK@Am9PA%_*AW+|>@22MOM`M|%T;B_5gEmmu0`eAOgoUx>%!{v#o|2cpZhK& zU1K^ekq0rMGcK1?j|w9R_)u$s67__2OxpyCLp)wIB)K$k{$Xr+0qK=4+kq+5hOA!;q8~wm|2?(PFx~x+1~cEPUH*@9cUK0k?hgB5I_9?So!_u?-A|)#6|4K*#K7B{|#O}fBEvcW&byP zIT-xM{_j8bfA#i%dH7HB4wgaW4NE`~-~%K8dDsb9H)pCdx02xFfAzFVT}m0_4Dzf=5l%SzE@rnut{ANgppD-ZTgOUkNu82>=?874j z1uacMxGflJkL>Xt4KIiMw;iV{TiHJrgibT#MGZQq?zpcE7wJG(Z58aY>`XPripAI& z3s>0Gavf3%?@nMP9f88B9FPR`tzv zhJK72%qIpX```U#|Lxm?)k+x@+HW^fc@zGC1bE-eOOWTb1zK>Igt=hvR$by zJFEyR@vvbv%<4);)jBI{2H87-*QoIg#lFU1fii+MHRfplwbw^w1Ht4VG%8}JXI3#W zuuc?jHKZC>|raX=AcxawNg>avDe4*||~1;hbUVS(D4*sf8sf zI_vgye55>pH3p*A3dtRAu{K3Kf`9Kh*q>`jx-Uc+dt(;J-WnI0VIc9SyW0Z(C_QFR zxfOeN3$(E5iLKxBXzd$q=7ioK;n>lR$5zuLgo{;y7>x5`G*9Naq+AShpehlB7>5*&WrGwz$@!{T44^&3+)1mb=zP$?4UCanKmX8~|B3fw1Y?~gIUqdk z2JR$xjiHooV|H2BvRO}LA1P^qKv@p&yE;JsW7a$ddLsDn88f}+{%Sc2P*c4|=DsG-=> z>zr%cm#VHb%;MNQVrP!}57P*&O$HkhkSg8EGFgm53LJx{ExYo0UwFe@uSD+cXy)C( zy2s>N`c8WuXKRZ^!P3;5^v$+xYYE&r4n+e)pxnLvcgJ`dmh8e_WG%%dyWYv12$7HDpcX#q0|F}?JDXH`h8ossO*GF3N&}FeROC0aJHbwM^~B25E4RZj_>FQ zNd;#h^FXU>RiydpSWu5T8(us)wPffh2R}1BNTcEbdJ;ujgmjT@J$rTq?O9zAz=g6- zkTx8|5@yc^{V!j&>U0Cj1ESLtoZ5)sPTUD30W0u%$mC2g;hMONd^1muFQ-?v;t z#3jWEl0H#@o&Sk93qRn|mqucufTO3W%7noL!bmKasKbaUP!um&;fC)7<>zWggy~|1 z25Af$0LKzR=L^hrGR5>u-G4_zd$w_)M=ZI0K+}*Z{ivD#vn>sFVI^{ld`TAQsk8wk zyAA3wgFQ%0QxXa=9A14!#GAy zh-M9!g6rczJ&^k%THZ!N5EE?xMh;i%Kr06Fb!XvS_e>is>h-zrZFs=Tx!(9(jN@=& z@3Dxml;HUE(1DChZMK9xZC4DbDpVJIRAaR15~H6t$Mx=G8uX#CLi|R-ravy~YvqZ^ zZfFY`1J*5V7$*yPp7jk5y5NWAqt)i1h9j^GvgKCQq@Flpi`5jjXhrPlMjYroxiwkA zHF;C50X(ingou0_>+GGehuvFP?ps|FRy$a1V7YxCVfPNTy{jePCcjU;pBp%8#)8n2 zLpkg2m7bQL_D+e$A9fT}+|$Qg&uZ#9%Fdm&j-3J~jQ4crJ)L;v2aB}={03o(J9${* zj$a834~HOIWC@6M>7J6q!aw8poraN&<#X4;A+3F8h1WD?JTUxyR)ULbz)Q*>jI zkFA55g5t_h0x&{TvS&aK8F46kQwaOMP)V!Z#|0rpGz!rR8Vqa zm#pEhK)bIb){N)7;uz^dp;V6y)dM}ye%DMrX1+~h*il+;?Lomy-NCQcw(B~?paOZj@OJ}O z7_Du23EG2(E7dq|RintMNoy4S_8XVM&Cm+b9uyVA^m45=CJlpwQxWm?{tf)vLK^~rc1qkXzP~a!zZWl z5~&=L(uB&_F2CzWs+zN%|F|&^jzG z9J)fnMERgldTo+O&l^r}!}|=a_K<(u7zAsFakKk>7M~j|a>L}+CmWj;m&H4;3g%4_ z5uCBM;$)7H?Hn@UBTWgptSD&6s(bk7d{90SDF#S=QX01wFuH)z`y6YCI)vxE>iyQgsq16v zDdcrtdzV!F{r-2~S6zYYhP97}Y*F5sVtYPPxxE8;ftCJBZSxeejKLd1&T z;buYtk6@84rr{EZ)J${mke&M|Go<>9pKk|@KqA~c-i za3w-gF*^rmw#@~vmfm=pWLOT~JqJxx68ncd`Pg(QxWr4VaaY~lec{)+9F7CktAJd` z#MK15VH)p|z*S4_!uRaWxBK7KvQ3rqpD!`LmWQfXe|AZaNM+;sC59lnFWUUQiBphF zQ7;~Pl(vV92V;Y6P^_jU0_m{SdXE%Kp7uJd`y3DN4A^U=T!_Du#*>M1{)lekWR-E@ z!N32Wt;wf7Rh-Y`@BLx_`IrBxYB`Ld6r4W z&%0dB1sarANDAvAo!%plc|%s2kWI7=iVMA6Vte@?+*Pt{-ARSAqKZXPes;ME=Sa|! z^wVvzvfB~YUT8gJnKq7q@&u=H4DATfvsFz^wnDFt%zI0BVK7lMLKvfILh&rR3k`=K zE?vw38o;Ab)UCQKybf<7UL^yW6eA%Do~_q1k5tlt;gql_5B%P}7mm{exjR^#c`Lgj za)(en_|4`E&N%^y)xgsMgrfyp1?YqLaBUB-FtzJXVArFwRksb(a0nz0FJP(vh`b(y z7(|x{9s}sKD@`j(T59s6Ina%5tc3Z8H9d8}qC%#gsGF1~O>~~(n{NDNtkrASv5rVO zPf#A^z=E_8X_d?)pgbJqP|%TQs2j!g5G?N3){V-`eI5nb5Wm5Nvw(jpv7oApf%7R= z?C)c>e#}a3xJps7r%W)9^83Iym3*X>60~WXtI$JsYF0z2(}4p8FSe?y6~zUJxhU)mg0H$lH^fh@7!t}~>33nO5(LIkL=TOxz56^&f6a>b3Oj4j-30dO>n%yyD$WICId zu&_#~OOIhY8t~#8UTmETMJ%6LxLA)T#|--Bq5?D?1=ue8iWHNaw<@_*$|kwgXeoaC zIzruY2joB5I*RP-C$vyS85Q(W3ghn6@)A1RR=8ZEv# zFA0m@_m%uuNsR($PgaRb_LoY{bl%iyJpa(3ts2v}Lv_c=yd)%vHHsyBxEj2m{xZ`t zJ#6k${_4e7m4zv-DnW90JI|1Xeuk^^S%yocQ+4B@|4qVW2+OhHRZ}un?WdX7g@ZJL z&FE7^7@i6mM7(>4;_54P4`ulfYB%l@1?e_oy%ZxREy;c!I0SeW!@9!ZDJkjYbMGQv zdXwoi+d^*Up6udp;w(n5w3|4D6||TpX_WE}Q8=GF>_COSD-ygudg?*WB%{dRUEk~8 zE-(M&2d$D}?7V#5kwYd|IWn{aLnPPvLpN4&f8=CDQXtEx3h&XB(Zd3^_bk?*ph^DFtXjQipP9`ZvmIB5O4&ai}5hEiGPPg55`8soBTZqCCTcSrg zY2UA{o3I6B13txZH=5#{BYJ&N(e_TU?4dW0Zm0Ji0^Y+KWypIEGNJknONb`cmAV5S zpFMwZ3b(9?w3lSbPHvG4-)YK$2xbKrO8EdYk3&RK@$LA-7wQOBHQe#)F5MKlELy^3 z@*#g->U=rx=Dp#4B->HK8b1u)rHNqagak7)lH7pdE4JHz`oo{vZthS7#ZKKqPN6Nb z#18O=9lO&S*v%(Y{D@6tV(T<~TL4Zf05eL%wWO{FM+$Q^qPqur??c9_fe5hRitAj5 zF#yn}+;LW~sFo4RrC*X~kZ*@1E_}j`TAOUbP*GgCNN5_nMdHD(XiZe_FI`DuoKMIpPeb;yx}1JAkfoU&b!$#NzF# zI{G72K>`042&52npchxLB)XF&UE!gv_O28fT#H);nY_Wf$xf$<4+{R}3!zX#u|;bL z4Ntt&c!3eD;aDZ|8hFQa*DfGHVXfSfqAbBFxrR}9bAe$WaBdB_88hTf_j>5nm0k*Oz^0MkCTE%3p`3b-YgS zYZA{ZA}q+x)cPc;vSd5fqL5PZK&3f{+KL2h7JggJCuqlj_CO*OwofLFNE#2KWy{`M z6S_4Je!56T(A0McM-1wICn&~1QGu0h2hl89zJmaJK!m@ZKa9@n_E>4nw=RXEv)KTNmM62(3CAua<~P;}?sPEGL$zE7^qFyh|^n z&be|mt>!xTP3ekqjhlJ_ed2Y1%RpZRxCngL@>5wGu0U7%idl0cfAE^($?O$pEw4lc z-UU+S9&CznXY5^iQs&RMgK$P#V)$K_v=LE&j$Vy!N0+PlhkNH#3Vdd|Op_fZo}bPK zwXJ}GOA)dd_zJdTL3^vKG@R*%bR@A;RUQFODAqMw0KdZs5N#ih@hpn;7ObI&d^!BG z)zT&YbY@$0K#$UUujgUuKHXI4@8_iJ+TYC#|Plr6KVBK6NsmaZq+1ULyUhF1<&zyhl z#5QXKOE5qN5k80bDZX#g_w!GA8VSh>n2HG-j4pZkp@}tmHkK^FWg6bZ223d9kC`*6 zM|l$=fz~|+A41`@nXlsQ3yL#V7gX`Ug*--84?ucTq;3_jX$gmiE)Y8k0~6mM)G~0e zYTFBTgW%2kc3DO_v3UX)(NLBeDh7;fa8 zGm$XkI=gM^G*tr&0k0T{sfaZr)2ZH55>{pg zw&``4k=j1VV3VqX+J22VX4cwM)Ae!7=jsuc&()_{K3AW9`CK(!K3C@Qx%#N(bM-G- zK38)2Tp(Oe=^GVe*4(hU^>sHW$mxKzc9V)Td5O+vwEoLhn|pZ{x1@qh@EdAa zTNQkRRvvC*!Z<+8(Y=!sGmvUeHM(@R25U{p!2f-AR;tjh5+vRi;rN4OOv(3;W|;4X zN&A#J3ee4zk!|IO@g-&}4wEly-1~mBp~=U-|A=TPr5mR73P7|Y-w~zC`bI4>1+zTN z=`vidvX6z}5vAlL@``2E4b{=s+l`G%(3>ng?8m5pQ_%v8$?>yN)lG7IB* zPtPyE2H9d7FT0&ze(BU$w8|WWrGcYPJXnV6w1PEd=l#jv@$18PJNpM6VFeS-Z{jqW zH_#Hx*5;Yc^zzQviuzL7YU>8&cJdnq4N~&u?L^3nPyzjLw5jNd0kWv`KBrZp5I~B` zN`VC9Y#@S4CkQ(J!>@eS2Bil&F``&o-0L1P>r1?emI5p^N~&x#9Jp?2PZntH#)%%( ze8%1lR6U0K%Go*Hb>jTRXb20_*~W|6Xc}LUp(hZAto=1ISnMTD*Q2vg_n61&mOdxs zmk#;E8(3?hEZ}1l>tDTi*(zHz=WAHymo1`2K#>{)oVAhcHZ5iSG;VM{7K@g9!hb|! zwC3VmV_`mNsxL4pZXwv3szK4>eBSezthY#>=w1ewOT3IyTrG%_h7lI$Xp4!4n|6Ex zmnzz-7U`-QdA}+p!?tQ^Kg}6ALRi92>I6C`96+oTxf$!IU{^)spg^bK{&{1AO8baa zwfPS$LWS8w-2VZ7`u@XK-x(Cp9+VjRG-wIt-x!>KvZ<%VmCP>%C~Z4||M2isnRcmPsQiM1mN`W_2HKH89%lh?*|J^U7m;3w$T z(OIH;VggLUy~3X(037YIy2NJS=;(*NpAU}fDya-4V!4ox6?`mF+SRP;3@Ucop9;5Sy?&BNu1# z9tWNZ_$NmHiEgQBmiCByX~>3ohcViNKz;Q7uoD?gZ_zlX=gY!J0-C zoCh&YSG7lUyJeuE5fv<~>)d9+v_`l@b1htmY3FH%em-eY{qQx;F!%exLG8Kv#&PYN z$I@MMg_&FT++Hi@j&%U(;-48One?jpco}igtHX}1xt#5_;%Hs@dNG#D?~{lZ^=$%N z=5j(NSF}Ufg|4-ZvxAEm3t9}-CKtb2M{3mxVb7Df+_u~o3erMEZEK`6#$#v%8L`xO z?@|dc8jxM)qJ@%lORj2)E4czlog*{O6YdBypx%ecvxT_Y`mo62vI)Ly6{(rKVDg;L7wSy z;%qCg)6Ba{=B0=U2MLlYeJ*-dCqB+11yxCxYZ|4H^@RdnyPViunmpC?9bGEL(DV`} zZM7Adtf?oeH?Xj>Wc&erN#G-b0icg=h4C+jDt}O&L$jxW0Mj)ZQhZonw4B5>!d4b0 zTys2NZv^35s}p*e=Km2%+K%NgUfzw+-g|rJ2OBid2so7-~H)z!>{!aZ3yObSV`($9oTe$fx0m8{?*8q>BfrWSZz zZpSV#^@JU~af4)?TJ50i(o2P_i?M|j;sBMoBgBK6FZsNcm-oNbwViC9))3#&EPDoX zjD(N$E*S%=lCjn*W4CL}tlPjXM&s*vI!Q_N0qHRV`HJ;l`Y=l_#x}P;EE>mJTI`Q9 z%Pz6V?q6pwhnw?g{_CsT=d;btR>e}p?Xb}NxWyQaaH(~Rkr7GXi;RYvnTAk2WUH}7 z;;8iK5_d_N=GywT?$&3;P%w|Cin(V{pG9GZ(8~g@(!YH1aww zInYyD#HggflQ=`28KNi@#f3fS4tf)Z>?VDSexi&M9_rd4Pb(z&B=b))#|%$u;O55H z-L{#fU49RP?!_ZEXx)~EZ^_AOe68Xt^vK_#UunAHza|p_!m;)=2v< z5)oLAs-Tw_RmWqY=2Ry3s{#OWa+wsCFdq~S;!>Z{WaHvV`Fb9y&X;)9<-_QOS0N%R zc*|QfroWKX6j`0cfK@cZ9ur+1mVV%M5kHg)^3jLx7Na-;m7vF0z@AU|UGOk6@==>> zF?jIy;zpiZ(RpxJ#TY|;7ENM2i!^2wrEpA;MjeVIc^ls2BGa!e^3jHUsOp^Fvp&uU zaWM$67QBp#3<_+cv#d=tN><8bwV1}_y^4$Ak+Z$Ba=T`Y9Y8n@T1%N$< znMOs|tv8L9oy>rHMVSY@qQWI6?dtb0rYA{a{PzretR0uE+(OOx8>a- z3dq^U;9Tbo9htH=~6W*1_yDOGitqbaWb6#1N&_tlh?b2@jZ!fMk@O$ZOFK zmmj>op<$ujhUuhmfHFl7@48oezcW0Iv_?6dp&gUZ$(n8sEyR@RLI9(kCJh-j~)+GCeP znG=;++4flnm_xj^M6GnE>ZBF~a}ofJ%*dUjkhiKCvm6zNW z(9kx^X0{<(oW;_EY*NUJ#vgTTWHFbh$mZ8%LrD1*E$Qk_qt-#Gh}toSgd9d-_?U_k zU0X|N)hn&*oWr}x8tyi>rmc_j0H*jK{CLY7{IfU^1O;J;&fdl90<8wU)#5iB22*xl zFi+pcCE2bJ;KinEl|c3wh4%8%!oU{#aFq9NP z4V$H{uNZn@u9|O^^y=*#?PugmhW=)FKbGH<5Di5BO-J?Dl*|}~{X@K1{1$`hXqh#5 zChhX8uK+uu9b}BAD5-s~7zDv;KE;(oSY42vpnc&oc@+J$Ni?Jk;9S+ z8!c}gUiyk=N47c}FA`_rJiNjfUzs-=;jT&H14s~-6zFB(4Pyk%!z52<-;5z^N`|hX zcW`)k6gvkdvK6cB_f;C@F4&c{0D6CKur}@b(30Y`pAbfO+O=M+D=te(th9a&I8$?A6Aql!bvV7e4ev)v=QqeSzgD|HM01@IL#v@VzI47oSKEN3eT({C2cE+WTSe;MD(3D*N_$Z|5(v zLS214T}@!mC{ykZ8YlrDn-3BG!r8%3LHBS~b*g+8JAxu$9xbBRD7x#M7oq#{ipmTo zy=5!?wN^^soDPQ=?zm%Up;P~&s7~xM#)B3;Xw*ULUT0rqS!VryLyH^d1;;ERh(sAt zWZ??mB^*gOur%dJCYjTOSq2;-0kPDNq9UM?Fi0Y`ISj_Y&Gb}9`_b~R2U0{KPgEa( z{Fe7ZtHZBLFs!Rdtee`J%-Gcjhi~@Z?)eYN)bqM8dfp4au3@?Z*dq)?A%JVKMvYq3 zS18EI$^Lhzd&lqA!R#t+wRwGIXrC&r;Z0Q;?)#^34u_eid^(kFArcEX4=RXNaR-{s zGKg*i7@&0!d-BMyOa)c^9}!@b6y#{&Vg*Md8MC!6put|Fw$J z`x6SGx<5zRge*i5@^2hP6M~tr?%@O15b0q%@*&di5lY5oouC^wQN`ld@HbQ56X>DW zBt%Cu>e?LDOYbi?qFK@cI;-Adf4wMH`4)9Y5-#Jr$ylA)Zr;p2q!~BiRJgd5_nQ48 z(%e7yf!+{*CyG)gJ76-gXh%t^5(7UoMugd(_j#CJ0UP@H=XkAql{K+-5b>fQd)LnG z+L~P#k?eW(*E%LB82`&5epfK0ElqVE|BKpC0gv`&8$|z-&Tx6QLeh6+Dfl<|9bfD+xKbhrjdLgI$?rc1dBRAsr8G}Nxa-5(z=ABL%4y{ZZgqPp8#8ujiJLKTaKOG zk#kUaWJqNf*D`&U45q|5*Ut@lrn}Jpoz&4<19Z}du&@##Dq@s0$Owb&k=FYH@2ByA z{*#9iN3=yIntG%U?a*S_1dQ{x%EX0RC~Y~X_hhRJa^6*>k6;>OkU1}utVm3XO`H%f zpMk*LH_0Hx6Suu~@zll$SmfVE<_X$~ixFy!dcSC38 ztHJhUdn2#-fnm!q4g^OG4$%yY+`R~A9h=NH(b;M;iRN}_tasu4Ma1!fSBtBZ!l`m} zO@aRXr`E%%_U54f}cdFv!ucFL54RfsE1D>yjycHW%&1B`IO)`nBk!dj~)4A0HkF z{0@aqX@hkL9C(+Sa*PT)?&G8oy6#;b*fnEsCph4MO+~%@7%Au}@oy$O2#j#D=(dke z-khIjwsC{o%Vk=X;omk{Ayn=V-M1W`x-H(2So>VYGG+ zUzasT%l5Yfis`b>eBcZ3Owt6P~n-|zoZmA z&exvI`HAbazG;%tK|}E1_|Wri=uTX^tm&FKTD7zA?sa^LpmYa1B2l$t2>SDCt8F2p z6X^S5GBgwAF${unvbe8w9iI$9z#M+uj;Z4Q+Bx@U@2}e^PA6r%3?y`ZfwyGdO_-7< zJ45$uI#MydI+?d;#HyjYHY#7SPr$asS91*#b%Iw@%jj--n}&-3#4N-GXt&KEgiqo* z86bFngx+M!NpSs5$@|Okd^xpWW3Wu`bJABYF}Cr|**Qu&?Qyt-Wz+xX*X609qYIIG zXPW{b{)GSRZf`nr0>kTJq>AoM0+OrukHTVn_PMu<07<|PPogwMdV|4eF_yDXir^5U ztqCn#6i@Lz0%|73mHjz-x5n9Z;C=qg#UONPFuKE@_hxjmclzcve0e?EeS5g~)7~y& zX!c95&~Xd*zb?D7;YM}a6sDd>5r?%$!{wXVOnDM!Rx^6i!)3YxWO97V@d%g6HvZEv zsI3)JvkEd2lb$!z(7~j|^X)uyaI}B4*ElQ8x1D!w@Q!A|D*5a!y=(bVE-!gM1@Z%} z!UP>AbWiT0Gn=?I!pI->MXn^caI!}#zSWW}GpVuk;Dx|<_Lj-yu5rc}_jQ|)c@)-&_YOm;3KGk~^6PrR% zfw&HI>HUFh9X^OJbElfy>%@bFMGr`r%f@NE$Q64anj$|R=q)px(IX6+_zZ*F5tcymVdFl9}U6<|Se0I{^QyIgID z27+|3;~?J|CV|+9j(=Wjy~iEJui6;uV@c%JW*=$=A-%Q|E3b8ff|Xu}WreQvyyg8O z%7S+^3Fwa1rEc_y2>I4(f&A|mt{&B`XxG14UTih_nxbOG1Pm3rASM?Oqn zC%1D~)3joVu4>z-vp$!YrOPufpa4(3MlSaA|F2(>>kb`)9Cy>uW zvFYkMs15OE!K&K;>gSfLiZ-?wwhbXzCm^4#!_}7XvV>j<4=f)mhp&ZtUg~}&xXgH7 zsa_%rcSu^Ug%X@cDL3kogJ{WL7-q2=93xH&pqT8&}0=In>| zdCllP%6!!1C<-!F6X@p2<$aWxEoe5w|4zzMpwv*EBA(j`iUNg;?>A-#ueoz~sN$yA zJ5Dp?caQ+6$?nlbIpT@|`>VT?_^>gpfMIkPXm*_J5Tyf7NwZ#KQRpTN@lBLo0okD_ z-sqh5f5xVFc{!<T{BIUEjOy?i-@=kV>ttIxdtXTQPU3WZ6}`%Ia?l%%VB-{(K|`8)Z0@`q=uEG6Y= zG{5l{#5!&w*S?!9?$h|{dg*n?zBlamzv_A4$wBarlSwiSI{}3*qhuK(AVld6@{3Qr z_i)tE-4)*c6NAbMbUI>gFx(PBorY*G_y4o^?(c2e$indX_4QxDBfohhwX!V9x5RsV zx~}82ewx@mmeb3o{!!9u0)yLNFf*9T zP82^+Tx$Z-l21Oo4pS}<+^ubvLj!dHcu>8)I6J@WpR=I;TU)?uvlN-p%pH1TZ^&c< z#)H$|f=x4r;}^Fd-%@afc}TLh_;)E*V*1EOE&s$Dh$nEK_<{I>&hFx~mpl!U>Y*z> zMGv^2l5dpnAo&)D^I`HWcBeDSJ(GNAw+vg-;VC{Z7^e@i6@S3C?UqDL#9+yIResUN z)OaB0ivs9J0zCn6MWxRyQ`a@?Axoi=QpR9XXoaUXbWV1 zd;QaO!MI>U!hv9Xtw@zc#U_C>vZujl4hUCJOpSAGE-9&x3JMjy)2GugSK!w$=J(`* zck4t2Q_YMs&F_T*z+8gjv%(?&?fK2QuRA8+5^ zocFC05(1ETweeS@z6%W8E-5W`9~RTVXTQI|cz7F8sw7$)oVjRYFt@f)dcq4bZ}zxv zJ0rmMC~A0PGJRqb!WW1x71@I^GnL^VJ{)%s?zV(M&`*1E8W3J^@Qguv*;kOeooMKJ zT=I@`Ic)g1(>M0T<@s$(yzO6|eP_S^=H`?$(j?-frwhrCc;^)rWLh%wsuI2xSQpZX1UNhV*r@jo4$+^L&ua5SuXEhnM^l7k_NUJ9 z-){0rj5$%JSCzWbxwe#@*(#hp`HDyxu+Rkr;i&P{G`bx=6@&ohvu)d$>$2=IZ#WPU-;^8U=boQHuqer~`v&#X*ebeRH%C#bQ{A;4s^a z_Lh7(hejHJ1P={@ZS4%|ben(jzqPlgm*3!B?OFT%?VFvK;>H#|?GSHJ?Gw!=AkWu- z_BlRLR$IKbU&$YSc=v)DODjG9nJ(_HJGs3JU;%} zXP&({YYbCprkYK8^=A*y5v*uQ1i;cBFnlQzNK;4v1R7{jV4M4*Pyv(`C@)bDxcl+g zCF>OCz#b*Zvz-{VO!or9y!!K+vMho2qa-?`JAL1-4&f%ws^LW}vliysgZ zpQP-f^0xTUJwCX*E4?{#z)ibFbco@vaqk#M(!!dRb`H){^^Nm5MML}s{^FCItaXjO zvv$y2x^T7S6-`$h?F^-bTEP(VsK7q&=NmEL`2pnHgZ$K(Es~dQyGHTdW0fVID$M3ahJ{n#rGHeZr3Ry{?=b* zPJn&nwJ@}Tmpr>EJS6qfv4(C) zR)>G*aQ@B)iLtQINJ-eQkipr&r7JxE4ahuoSkk+{i>~}#rHRByV3)D;4aPc|EkY#g zaRD#ql91z7_;V=|Hy=bx(j+vGi!AlLpxvip7gwTk#ppB~%Gbyvnt71I!BR+(u3CdJX6D{AC?$3e7&V}B9Z{A5swuQ zp#&GQK0(iz|JRyU*#*h1k+cus+44QWoT#k7L*c(0QJaAL%IKZkhW$a8ezPKeL}7!h zM=y-$2~)R0kzZ>XP8yJwRbvqhxM_H5$H77web2h|j(ViE>QHZFi6_t`=b_Vyk^-D$ z_}w;D$r)KBrMc>e&yCIIMpG@HQaNd}rNB(76+2avmN+}XxgpM3H?1$MZl{+z@UGN7 zsdJ~3X%O))${omdlC!~A6SNBC2YZB<0(i$Zix{^SO`L(?yeVtiWXRkz=`DL980y;x zx;?;rT9|_bZv~F?yfy$7=|G{C9sizx+C|>li+8tDU;56$=;)w3+#h$24xQe()9t<- zyz1@`4_tUU9t`%64tvh%rK|T&NCRgW*ca=+tj1o;f`8qfNjXysCPK_%b%ig)vNVG@ zKUp;8f~Sg}%3B46+jH4^p(I+&4HgeFR;aov0~TXIf=TS0WL4+tL}7N)`isbdf5=Ru zYNBC=NTXsbrqO$g>3xB0%zZiKGJ9Nh_OYSt>>D;CEy|jEF;Rz&!sKs5ZUBqwcH2!~IW)Yz|1mk7dz~6<&A78I<4Vgdg?xd#?_9 zpK!uGztWV8;_FVjfb$#K=}Z-}?is_N$b7k6CUGHA+45vn`>?9Ws&UyLjZ`hkbuiKA zp~h%F^<{^xa&w;P-tXZ+TS_h-;W;9Ho{ObftZ^j_SCLYJNx@M$F$+jT0>+9__;bq4 z?mm#nUgy=z1YTC9GmsXpNO{RIsGbb5F2X}ltq+~M^{`2Tn?tC)c&H$|P>^BvK3Vak zi(s>y{EB{t|kPCZO;TQU+0aqGJ<6Lc2`UmiiOjjXY| zpxdW*PR`247ZGWhu~k$tj8Wu`Sb}C?*5$}kgdL7BsL^C>QB{D-G}V=kW&*5hoP_h5 z@l$rjIDX(akMY4_cmH6&duV<9+Ef;AA6Z#A0Xv<;eO=iLae5_?4~{^RDK0A@cMlGs z=u2H$5TQ>6ULGe;ce;kMZvbD?V!aM@qSG;yy+v756z(4G^$rYu=-;>?;Cs`w4}1HE zhO+3t+jhzFx}lAWL(41>wLK)wiuj7@NP}?1BCBEDg(jMGQa2*26_`VeCskv?O>0d< z)D^>~-!cU5NaF4+4J3kzQ5R8Do3>^F4KE@&%WbBa1-shDi2JTT;pP+o| z)lrT!vxCXVp1I)=4~BwFOJoL1N#D6n41G2*P$B|BQG+i2P<`|f&1olcq%sfnY-2RA zojOlI(_geD4qYaCI_&l;q#W17kV10QTmABN@W|FLzD>Z z_&DbhEN(Z)c@oS|_X2AR(UlLZD3HKA&aUwXz@rI)E%o)mOK8n(G!T-)iw^3_xmah( ze5RSxVnEThpcC2RDm_MH1A!Y*!x=;k$J((5O=}mrgq`e|IKsDRhb7mCW8ff{Q#e6D z;LY90#x=DW`V^sJP3d!ucw=wsBbv=w_9d3~E5KOOlV`LhPQf77&ch_ap5;vLgAfp5 zs_J_awEjG7SjwqbulD!%k9sc)*szVWY+o~4C3T|r^61q;PgnMgD6>>_|7G`OcfTxq zcl5Hm*ZZt&;~~I(^>Y7LWg8y=L5}4o2S-N-FMkItW_gyeh+SNE-iak)WH6KDO3OJe zVftzromf@Q&qTJkP-ipJou^qh(AuM`?7db7Tj|C|US#E#56(DM0>#o(=}>m9G0gA4 z8GaPxPpVHsvh^j)jX09-e9Dlrn$mD>1yWX(oK+=hRY_GG zJCP7Ejf{lA9uVvNyP+w+1inibw_NOSuoX{jLsXSe%#^Nlc4ZkV+P=)RJcc3R# zSfSq{{i(w4zn_A55Dc?>$jpfH3hyHo1NZipR5*K>`|`@| z8CUvSCmg}a=bi;&IG@F$oxOvi4fO5&-py>Hy~D!&kgu_KR9NA9I?C+4J>yEBOw zx%aA|g6{O(H?DNjeOqa0zq`DG($Icyd4-$kF&*^&-tr3ld6*)&SqQ=kGpykKB9DCk zpnw-H$_XCjy?x4gZx}r|HsZzc2|PLYwbrN5 z?BFE~ca7{OLP&FY9p*vVD_<1^JKnIG8DyL63jN;%fMyg;iW#e-ahu)Bds>)rDH!|uz-M#q8 ziSd$p%wyZa7E1PAo?pQj40@^w@#_aR z_t7w^IV0DtVqbsM>upunxbq{0bw#7NT|v+O=LY$=*&qaJf%f-gJ|9>egKqz`Z6m>d zIrk2lo7uo%>Mv{GDaIQ7MioudGIkvUbV8B&(-edVMIhQ};wQu!%&Xz9=oZuMbPuv= z3|T(6Wt^pSlq!sGhD{_#9^9`Ie_3lTKLG_Y4&A4?O&`VN*0tGW7tUNA1I>0* zf|g?Ibl5XgXQ3arl$63O%oaGve)NNd zZ*egJ?R1&{Z8pE6-qtQLyyj~nCCF&=DoI&pVT{ocpnT}IF)$RYPa~}VJo@tIw)h47 zcM!GbECt7h-d$5ZUQ-x0kJ6Y4_>>k5P;bAuL-%vcd$n4JOmz(%+JoNUfxNswlrCwVPGteCxi`*&xgWm`?lI6{ zg)M?jh~T|E8E}n)<&N-{6^?R71$F`DccF3MpK8YN9>w)i7gTB|yYnPo2SC`k#aKP9 zbjvkIOFF7iB_)DC*Cpu!#MO3ccqkzI$HKelL7-a&eHMFgr`{w7i!ZJ2lAQD@85!cT zVTe^Zkjy%(RC#%-uZusQW*21=v7pcsOatqM1-+AU%+BeG0VNMP|J{UgZvo|uTqgwH zEv!L3pqT#`j>@Mdp2pZ$Ob2{dl;2V_#q^iK-(CW}^5hIeBE=-jf5xN9h2-a* zNO;hT#B!fKL4mk!6om3oMYH2dJ6Tt6=hB#$T1m;UT1E5KO6GS7W2;`2y>;Vy!~)jx zAbcYI@id-2r`rG2lL3hZ5RP1?Ppkz@eWT81c!7@eQ;)5bL^+ymz2)ax>eVb?5n(6G z%vuT60-HHj5g3|$jco~8U?ZdU1mzk;G2krVtnuB_t>DEnFt6~hC5#6t{Ap9aZnJsx zz*40+)&Mge&qK0oR98&F?hG8U2^K;4F~XU3pJsrda_&BrPpB)6HK>;bMluAAi{!$^9&oW4stdUX^Wf+C_pUvR^rDLr-}@)g?OD?Y=d~c zX`)3o3aKc*J}-aGqlQ;x=0DG=KMX?G_DDvKT-hsGAF!F2fV>GZ^eq>Zd%NB&=LubJ zY4ppYUzn0!@_}A~$#~;{VApIBXCt6CP5g!*7~~e21|;c807;eI{o#%wZ1;F0=T2|E zgGWTKmrovXLU*$YPw}F+p`Gw1bpJVb{o(T}S|8N*L=+KC*7a!nBWF=UzCR6=L@9-} ziwrD-9l1bvMnsD9>d6WU^H(psiupcDdNz~vm=!-h$nO{u2&LU(l!)Q~F-+y|ESPx1 z=bAbF2BCRHgEKCXQWrB8X6%)eFo-=cZi<>(uBNh}*;z54nDQn#)-jjTKF5h^6bVwR zA_qT%%Id9)m+p&1PL}}DTu98nIDj+33fh~%t-7g$_4TodH;4WwHDx3@iHIRNajR+dq(s;8tN^mfhYpQ!yE0{4imlb_IRMyU+l)EfTpqJbZOL%R#vxVZO zS2Qc-E-2g$8e9SzW{)v1-b_^KgV>Z`q<`w%^p?_n>>}D@0ORtQs z=%#56^43`*vyu;3BXfnnix*&MX*8UNv=sHG5>`(Bp{lDKMa?oUW`o)Rr5deejiHNr z4XgRNdwsYpaK7Tw`2t|bK-6kkhx$P!kfGlzK*j^+h(X>gMJKBaTO)*5 zC+oNouw0(juS)1wpgf(@q^DazFjuAVpR~ihsvRyt-al!F_bPVy6QM-6bcgqU8z|A; z2&?idqC|HCT*{`-d)U@L`?W#^H~Ud)?f=OoFiqb|48d|E$gFmI$rVKI8lqR0xDJPN|Uj_yp!E^ zCZo$Ib^XB3o_q%NZXX?fXd?xF*LytF zOe9}!MBHi?Hd2W(+SH-a`}27CO&<^4YR5wbGMLgpz=5?*C;R9_vbhVUgrp4PCmVMW z`d5@ouT$fRDJ@ZLX_6P5J@SERG~04}t0%J)#`*`HRcW!5TPSuZ+(y~qrxhv*W%KRFUF^%Q5coTBI?cZ4iiCWu|w8DAkw7{jMDbTHa*6j3ynot|1YeK1+W?w z)Lt0koA%h5dXr~lCOG`lH#UsyyOL@=f`Px>2si;uZ8>#@Hh(~DLQ|KpIp2DO?yfPm zesOtzyK?K^>~Vit^V`<#)$6NcntPfm-sqvlx+44t;sT-43>McSRXPsblg}Ff^X`cVQbDCr~b{ z^&qA~E!LqHW!9>_h<^5g%3*4)8m89DG&h@taC*0AEI*q7z_VIZP-nbd9gP z=DXYXAC9fN2JDJvouLZy6YHbP6`5VSMQ7gftT#(A2@59g0NL}N&uSK#il_qhKh$Rq zo<)%zy2Ho1$p4}diluqI`O)IFbW>|?A_5t#WD~a)n*fI1^Ap$#C>OUtc`z6=pbDI> z4$deHW~Tn&J2=A1bqEU^dt`#7?a}~sA{AG;@zpV31qNy|224SLdv@lAu%CETIX}R7#N1}Lh>Qcs3PfA%Kb!5-bR(}uvr*Xh z{P}8$FBu(8aiFF2PQ{Kyc){3?(7E=jDC?p8Ke>xbP96pVV=}4(lcl5WtrwqX)?H9B%-7 z7eTC&z^rKB$f~afZ!HJwW4jVxP(jyY`$8kiuBXl=rUmH!W?&z-w1tl(cX;Yju z%(L!}Op@1VoWH3hRT*DkoKSm?5xp8LJ(~P{mX1&M=H{@i+GuR;I5kC@gZ4E36N$`L z$12y>&evAgs)5*s>BXshF7SlV4He~sPs+4s!K~5Azu=l4?fa4Ym_(LBt4$W0DU(k0 z!}0!I_SzXL(seC*wP|i?>9tj_tCUL94hjq`epHJ-<4gV#OK1fEeW$k+o*q|C(#d33 z680xQAJx7S5~Ko!gcw-4Jw?faZe>eOBVj^8#hfaH8Z!jeVu%MM_TAU;3MfqI_`{qL zCnim0P^b?()Rm_7-&m37(_w!ME`X@TXw=vQoVWrad zNvz@gt;P~eZ5lkI0I9}N{5)e;6WE0QhG765`dC5>C{2G7IT59Hpoh=u#MO!d8=*2W zJI@$d3*EZeB(}NJKl-abeAl4P?KN^ zQ9x}*0n-#Ao^U-PDKU!UH7YYE5A+S)wk zMX+2CpTh$l%dKbc>(7LUJFXBrP0BwJMTA{E5q0jh_eFmBb%LKB9UfKAd0EeNPlHJ{ z3-g$fBn1C=t%s3g_29|AbzmJ@N7hU06`s7^uGQ_;nk7RA2-4(5b`%F8oVqr%E3bme z1_QG^(UJAFdKGP%SLt?|%XamlJ)Tb{Yi;er zWNSFHLL}v5Elw|(ag`TagZXrZcZ+cV6%$}`f@~g@11meE;A^&t zQ~hmHoUTf7{-iKEGSORO|L|t_R@t}v*>+bZj-BeHt+NJ|>a0LwI@L*xk;3roYO+vN zm|ek%*#@7vA>tb$Chc95lBt!sMXR{EXTa}(INIIYrfrU@4cN&$`<<7Ey~CILy-%^_ zOXqP;I1&GG>UR9Di5n?Zc~-4D-QWD0BuJ+^UQUB#JTcj$7?BuFDFJ-5G|Td#&L^{e zw+bmss?XL10M%DvWYi91A?SCo`?TH;rp1tVZ^Lchx2<|Ka=LYS_ey{OauYbn!n23)u(S`W9Kny8RUWpwal8L+R`bD@!2OYe=UOfRZfA&L?UU*Y zZJ_uuqmYd{MkBz}DfeH_Y)7ursa~aPu42Bh%*8Rt7_w9iK_Q2sP$I+Pywwd?kVOF~ z>Y@7&w6sIj`*4VH;!$CT>s@cIAI4#05gRrVwSf)67!9Fbu^(p|kCPpHdQ=`;k=^kCkBGU~5rK5dw~-Doyb zg;>Vh4@6kXe=-Wt76_B&ktFNSrvo=cMfKVB`^W+jnkUR5?V2t|q-!|~+=!#evlThd z2n8f&76;OIE%b+(5NH-T-9mGN`~y4V!eW=5M@-39v)NA!LMYJ-=n`u#NArw6jpl}+8uA3rN z>DbssWKp84BI8ibK8!_&ah(as-6&K6#nNzYPCQ`^*5aP-hIpR^BjB|D`{cFUDS#Y)@thrtMVeVzH* zHlRj`Q;b#>Ku~KOnQGQ}?lboaF}bLtU=|gNZXE{G86GA84vW{&@~*}b zwi68XgtB(5hze#Pk%YmnYor`SIukdABy5#2m@`y1Qh)QtE>}#?iu`KWr=hzB>?>Ka zTdrgY?7Q&UF1BiT7S=Fm37`p41?wJjY1A;;6rS->4H4=WHw;t*<)u7Gd6bZ9*=)%w zay6BBjU`pJJt)bo=nfWzkMArmk7rJPLYkH8s=UxzRW(6HP1Tc=(ln>d@?9wftGI9J z^egq-gyf|bakSgR577M*QCQedcYp8j;ApS=a=+baSxiIQ6K)6Pa)DB(8yM@Mje~B< z6Htzl{<@RX{=H4lw$*O80~EOzsB`n=+@1+)I?;|7eU=#=2f=5aQ0ze!Lclf7C?03& z0H(Rt>zR$}Sgl?N;cQh?b@9+`_SBsQ;d8TMZG-A?Git--Pz(flyF}F)rd+JpT*jY! zmFmi!(F)ahc(Cf@&EHs6Ydz!jv#dI=bs6;M!-s3Yd%Mv@1KP;&z z;4d5z@iQ8VQ3y>cCe>$S&0?UE7-&^Ah~nnljQOqZ{O3H6SY=N4iMT7-Pyz$x{dk^1;kh z0D<>!StRDPPx{#0-R7s6ydfY`5~nxQ0vzMR2PeFzTk@FHR8|O7Ml_ir{cIR`c!W}DxxDv&TCjG;!Phk5Yk_-S zs*%?$xICpT(U!>=sc-?d;dFL^nlT0O>6t~PfpQKQMdjR`o5^y!W^#?%=~-tN$bsj> za#%cYpz=C-TQafPA0$;p1^H|#+7!wchC3}I?8qHP6L%b^EbY|~=QsB4#k+I+{pH(> zcNe$kud4`$TI{uZnkWQljSJJ_41!138o+L!ag5$gu`EgN%#%6`7D0kTJOygJWqyPm z?8IOEhBm-@NoQ(;T`AmKa=Z{hAhWST{@i7&?6N9&kA|cxQf@@{-wE~Z{7Jnl*%eVhIuYr$=N50z>5>(kp#sU4OcDqnr| z)t|>o>ikx2U#+sC`~aXuEXbQi=cm=$VTB~N1635+%<-V1$lwwPMWF|qvW{+|k_zwM zjjc;10A5C8#{v_3fuEOXic!w>-SGYyhPbHZ@79cnZt{p*+L`4Yq9emKbf`+Fs$q%I zO_dqpG{4EGm}l8(#;)$Coc_&64TNmgD5h zmu7cF#`ToMHJQaHT=Ri%kdNRj&TRmbQoiD|qmaZgZ5(-)^l3Tzh?^#3^(viPk5gDN z6eRrMf2VJvXkSBOMOaO{W06lPH4Tf277XZ&6-Ey7{xyzHg{i?%CWd*Te-NqOj0 zyaIU7pUva4`J?xW(nsfEPo1Z-koT)W9)@1&P9JDN{}GZ>3x5hC(g;i<60{qNLonP= zf4d3LiDr0%GH$T*Am)*&CU&dn(tF~z;pv4~BKqYG> zS*-VRM!x1s58nMl%i6C{0}&YWcektqs#Qd|P<=3UCZB?Ib!e8?+evw-RbZASDbUmB zSp_O9Cb$eKtOi+6zc)fpa7l5)u_av=r$f8XzMy^fh5dy&ZpVka{ERGx%3`H#4md|@ z@z?$Zn1~{<%j$OOYcveRDfDKHw64>Mt^~*C7;C1TRiWXoy4%vv`S0aODmrA$p+=HD z@v9#mzs9+7u+F)$4mQaRH@EUVx@#I;NovSz!A%%#q4@NbD$$(U0g^}A~$|N%TkfZ8M}5k zC7+Jl^ZxCdOODyG>x8d^1uh{~%upugZNYS-o<9z9aKj<_gXCOiRf?2)CvWM)F<_Q3 z826%Pin)Mw+tI{zXN_zsO=!(}VTn;CJ;NnK#C#6tegpcM4b7D1Q-nitW)B~{$q4W$ zErv>Cn__n~CeCy)a*ol0f8s@GzTc>~DV1COMO5eUFmWg8dZMvQr_Q0pv1HDk4zMjn ztb+w0oAum6NJX4kB$vVOjr%Z|&)iWqXkMALqX4EoM=uEU*ZlC*o`v2colagDKU-f~ z>60N&AVn{F!trCncg!f}BcB~Re{-Y+or zyo;Ol@$0;MYZPgUT0LFaYkk>0UD^JF6S^atHo8=4zo6`E#B!Dc#jC9&BJ8vK^QTYp|%RUB2%qi2}}r zg3w*<`n`MiK35V8YZve>(TrTLyV@1}e)?wO+(Vzkk>x&Bj|{QYIjY1#vn;CHlWtzC0u8u;!x179+w}KCs}|Kk*A%Hv$oF76X@>*fvl) zWxSXLPS5p&`Tav%?{a});LxA@!fOHVaPeW*yMhQd-J)ZpA6F;T0an{o7K>$lCzdYP zz4z$OXSRbP2eA$;{3J|qPi3(v{s#*D8qOUKJm#Y1!@{RsZW!*QK$IclK%w*zF|?dP zBr}%BOFX9YVQv&LP#(>Hr{gq3%_o3l22XO#ghmZNqFc)(2tM*$DU7wp-qf@Ks8jZo zjf^p+U4yyzJ0){nK8iMU6zJmyMEcKh=tjg-Rpfs_lQdP6udFj8qbT+xK|S zo#UY+kEzFiUNdsVjLx7L3|cmE(WYiJM;(wQ(=Z8w`{WMiNgiiSUMnlWDiHMPTD$B@ZMZwf%vAW^_^Q0tEz;cvPl0oI(z;udq8PVEE)`1J(oYBE}ZbZv63?LE$hSG@|>vV z9Xm4Y*S@E--^Uz^@V!x-=%6jiG*J(!m7;iepdG7-4yo zL3-wpfU#$)1pyP=9X#^g!E0qF zE08+f9oHv;hXOm0OvDSM!RqHzdl*02cz-i|aCNc7wu>jMRMfQXf@m(80{ElLj-V-4 zYU;8hY-Ruz)6U@(DZXpe6-HI#rtG~cNz05W=P@?a&rhAszzOk>9OYomg!847%`db0 zZu4oQ^NK~&0{Z2I^}BM4iPD4r-Aw>qp5Ik5cozr=()!SiHin1Y?$JgN(Sku)e>@bV zVOxI;%$s^o?#PbZnFEYn5Nh0#D&U<|i`3Icuhjf;2M4`ZFZU1jH$)|S|Bh5rT_z!v zQ0zaO%hs!MJ>`TPWd`cI55N`g;-+Zu)|>TaIj^8(LE9kh<22L~V6|pN2*brF2O+}} zvJhfM8cJrtdErxB9;dP=S7|gDz@{n#f%NGI)+F%n-H<1!!XT@ZZV@Gih08QFO^kZk z2!X1r-mW8xf!AzXNyM|P1e*kS#~9))L$d@T7?Ua$C9uo>^@d$z>&eY!>_i{y>c!>S zUaWr@mr^B@UW&rWim!fq1CW`DKn=BuQ3qgzYSM3%Wb>wE5~WkiLX3H+10Drql4*DGiWyX6v9@&SpH zu7cuBGfj<-)PdfyCZEhDAT_3xA@b~E|Nml5z59ol;tJ#ZkC?6zkdfgYpxQ1>ssUYWfNb3WwpsCE@gw8DWyu|!70Z9c)kXa(rN_5^;{9Eg)l~ldRN~+jfa~0DH z>Suo0P)~dr#BYMR&-7B71y_ywO7QZ=D4sVI?2UqWN>`LwyM=J#O}*G==wH$=nbkp_ zmd1t0fB&a`i!-oO=UEo-P}lF{<%)=CtnReq6}9^Z-Mzz?y`w$j8CKJVc&Cr{jE$hS z;%P>MT@^QGZR8uuA&hQ2Q=@?SI@I9{!>cg_urIIPT)aIm#}?*jGBngqIk*``Dpt){ zmsDX)k{EO@fz@JUK)t2QDM_2Pjc_Hup>-s2^f$R+l+Bi|?q^Pja$ehuh z_}Sa5v+wNNi?i?g=^2kqGtBh|)yTC|YbCr?Ci-@*F?8Z4zTYOHKz;eQv?6oSS6_D} zxH-Ubqxa#=_!5>h@-nWz^7}Y`Hou$Q7c@IYlRx9zsppR;vGMhA$@{7EkK*c@_r3J} zJZH^c+mk0d_jX@`t*LwMEF2-y521;~fr{h>T@C!9S zKnwU)tyndRYO*G zeK@EL!V4CT7q_gVN;TQk0==j8(XlS`sE~On<9}1nB%7$O?SS*%8y)`~cRQU9{qEB5 z9{t|S75+vP-lyLO^!t#0ALR}D@l*bn@I@_VXV!v=^;#(<;IY$weF73i%3!1HAgd!;}m+Ic|C zL$$`-8!=0#xi?xmA}oV)&xCR&cFL4y(vSD(Qk8C*Dv|Suie*H@tP=w7>wSs7-Yb3G zFH>6W>p__+XAi#Z zYkhWJ=^S{u8&9fBrj)>#Xi^e6+*YIt!yBIg%3tL2jP_2A|g#MR5&Kb0%2g{_^a`AM#VEl_k-osxIojZ z6Z#{v)NE;7bol$^W=uCCg2blFDB!k#w^qKRY_{_|KFQ$T4Du*C7H1j>K6{t?q z6&749p8y@}QL%BP97^k=JpKJZzuP$QM!iu-Kd|mGdls^X&3f}rUpGy4WTDl_PQBC! zQ_fpEM&hiijqv&!n3;0ZEBJP8)A9jZtp|cZD!In$L9Xo!9pcqG@m`$;Q97Q_;4P+4 zrVC@Xax7(0^F#M||E^i8(~PSy^!C1bZ@>AZy}j4;_OCz=fLRQDd+d0Vc_@TeqaAX^ z5t;bW@=*l7aU&vWKe1T z)bs5Y@Ci>gG@->EBu-UD^>jLvk*PeM)HG1eX0vEgGR)!zr)cRd$IK1wL|#Mx}wb(V5{rP>126m!T*kKjZcy^kUd2IOrlGrx_vk zPxz`1JRc|=x1-37bwy}oj*IcZmq6RnJC|fd@RY|-^tJRf9}qsa2H6}uIoQqv*-9B@b~a!J_}~gAz3sw zhD{8f_o`)mBPPMR2}Z%hskg1u$;6^!m=FYr+#{x~+qT||gyd*&7|g>VPbdao?}JD5 zaUG$px?_Faf4vjM&l4B;t)c5j+}a!@b!*@PAfX2$#n9V}v-8XTIZr~ig$kgXIm;o- zTr=C&Ew+gNfRp`5jT~?NUp_8tM?V2fyEhAtxNZ{e@Tzd1ED?|*iv2YwtnLzvh# zs6g@lKkV*z`Tp-69Uk`Jd2g@VJ^XY3|GEE{@BcG_py~d15e9ytT|9Z_dg;^a3oCL^ zLL+EyIE|o(Ta1}T3*hG&8m&TOP%;vku_;w{d#jJ`_%t4bj)9>@a}YU)Wat`K?=N z>K?zjIX^eNBAG__;@#=lRbThw^8D5S>+1Ua()6mYZRGl@uOCSN{iVM3A1*FmU;UuG zBLBJ>`Yf>`X!yOAV}-?AepMf##R;4V#&WJdpPJvIAkAVo*nr+-@ntNF2DfL|?`>Fx z|0ym7Q)^#b*=JYpFK^Fp`o)Er31@McKJ1^Xo4)<#^s-;B+_q_+xIu;1vR{g zq>vG5_RPhkutMfS{qHWW?fy^wv#X*$G7-uAUWni365pS`y?AY3-&~#9%r2y8fD0$| z#ZF}JH>JPe+KU|3*${L9^UnE*t`1?6)O9>@kz_8A(vE^58Y4}~I9sBO)FG&>5<*GK zaf&a1{sO)7;|NQaPL zuCRI5G%UmAIkr!@)GS}`=601@U$4{_E|^rWV1@wMN5LZ6*c>66mB%YqhoMN-TCgRm zR{8$?=BI2m-P~{oh)Qz;ZF*=Y$w&-xc=>}LBU7GOjb6(-Y*~AU1$}NOURO2lWCDGr zCYJ0MIO*++%QqL7uvaS7xwy4Y`_;;yUEQ2lta1ImT7}oAx2M%=yy;*3tzxgxF0kUz z-<`k1TGc8s2bzj?@L;P}<)&Y8Fu>s`LsMKjm`=6~LwzppwCAl+4*gB;Zx0|*f@gXDtsyRom|HAQEY31tMY~L}-h~G6e{6$tqifi}3Sc@Z ztRkC(+=Pf>7V@EN%)ow<=!_ruq~S*{g6FJ%bP1G}t(Ve;Twiq{6Skp5S14OcWt5R? z8<`Z5rgUZK96&j7AV2%b;%K(BFwHEtpI!ga3-kF+myASW062hhBheug$T*42Q^wG! zeAloxE+Hvr%2)+$2y_yQaAoiUg0TrW+<+>q-T?Q+Y)N`BVTS^&3?M?zFe;CYt z7;tVi#0g(8h@@_KsXaY%xMOw6W$HgpNDvA7$rgCrb)aS`$T1Dq%mcg;pP zkR`{P$^5B&TQZbYNtdo?=*_ZLrvN~?{z&vwOK{}41Xa;ds$1HQB8!_`^Njst>S>8W zGQ5@1b)$+r#s<=T1KlZXN{=V!4-}l{EjCc(FL1_f@?Bvj&8|6uu?Q{`x)`#7U3xIH z`giQsM8s#p$S5uaOtF~P00#t(k~R@jT(H|!5O^^-Bmt=sAhN?Fm3~Tlev!zmbmlXx z#IViwNvUlIW85AQ_XI%OL!3+dWIPER_;T<5;)VgU0+O@|%w|eak2ict>OiZ0ig@A2 z1@U_?NXrTbmCsvkW+Ps)<_n{Ie?u1?A=^DZ$#QuT!h8+QL?k;Ke99#^#mv|!_gStK zFrx4!J6lWI@?%|(5fr-1nfolwpVSdi&%=Z7(V3iJkYu3zw4Tj1;B?w}1KdqP8D_ae z&zH@%VGzyDz@mY4wbri0FI1j#RtqM^OP10Ykw#pQEsIHG5;!saaN07Jp!kM3LB|?D z5$Zhl0f}g%CRGx_7_nxp>eMnAf>ty*u^`iByq3&O?#PQi7BO?%)@yO|EH0kYE9bWL zo$JmhVwL~AaGu-BR{Yqq9;MBgYYEmLpRrBZ_5frq*N=XM0dN$D&9dA0F`11e(~!6u zZE_Y6a&{J^hDr?>E47(Ip?K)oI#Zl$5!A0jy>WyyR;^Ajiz8k`ztiMkoLe?A4SVLFvOs-uTo_i&r5MY8RMUpRaY3H zx`sr58pc5^yPZWMm3aVxusZLcpj7dE$hJ$%xWXdc^%^t5`idQtX}6lzyvpbcC^s23 zd(5~wDvQQgSfoj>K=-Ixk|H5ePV`bN==(^*Rt(Vg1zw^3PfcD_sKWqrp zFa(}@h!H)OU{rb?lte??3yM?p zOaY9Cz`(+ktWQxT8=95hsM7U~i=L7cl_U+9P3E7Q*S@}Sp{dh}xF9T6z*4FQ7VDNJ ztV8W9s!_44=yZZn@zXA&{RPk@bOdC9+9(kmw_7Jeb|}Mw#aO(3RNdAiD=}neL0>W< zQbbB&)VP!6lf!HGX*ijW+!1?AHc)Xx4YXMY!a3rB?JyQZGzad-AK^!!p!2DVpE%CN z^yQ;Bp^_M&D--3q?nEHv4`X}{@;6Yh^izZ%MPxAi%&!EHeX`xBEF{3F=pm3BxKq5C zQ_~hT+_Adz)CoZOp;2d-Zjxk*^G6X#?{eo1?rhB7p(>%5=O(Dxy1c0(cciX1wxss9 zWPR#=n}RHl=nP8-#=E`f}TRnP^D=)`AjS7QzQWv?ol@)F~1ccH%4krBx^Y2D=U)^F5{g=!AX)x}hC| zKt3h*eiCL=&ZWUZSBGJV1hh~}8-!X`8H9`v((il>TP$21k|5P^Hqye2%?Rh3p)yO` z`rz_p9O78c2aYZrK{h6~LED8fHK4fhJ%WPS*G>Mp7@B5IG2zh9KCWv0q;7p-9d+>I z&zU@}tmv13U~f(@-X61k_#%R3g(083hzOzhK(yzA&_f(nVFHp*8Xgs$_kgt|(mfzVvnv=~GYd<(-7cG?}x%*4(kOvcxO z!>d`SdZlbCp=M(sF_Vrue)p}V7ex06&`dHfhVF^k&N=~VTD>8mK z6OgEQctZzcgYK{tH5ezS#U}unBIKyAFJ4<63l0`JAvAESLl5>fMJ#M*@93qOmRJU! zIFAjSjSfmIz4WA#*s%;RQqIArZbkFd82;GC{IbVApg1VMgN`_aDouGTc2uRs3y zBTW|WRW$u!PQe9~1$xKYVz>ieu>lF6MI^w=_^hbhO=d1sQZ{s%t=yh+TV1)`B%oyF zb`^!sHctBK1qPq`FAOsewC=xalKx;6V1!E|ktB;{w>VVQ2Iaynk`g^Bc=<|Q&X~~T z*yd%kmf?3!sU++W4X;cnncW=1`j50JayUv9gLI+bHF;H>Oa=x+oJ#C=4;^IGarHv@9{{OGF3nvP?kUt z&QTA5gO$KQCB)Lb4lv-sC>T69|6;K#ln_&DWmL-dl_u$4J4u{0Ftb>3W;3hV^7e%H z*%?LU?}mt;jz&pQayJHCQxzBmne+JyPRtC+k=yZEF->3rX=1W>wCn7VF{!%BBLI~* z9A$!ACy*f9?R3kpK8M>;hM9O)=tn3Nvt{~?9HbYJ7NhiCJJum8Sb;7m?R3i5;q7!X zj4|TM56tztWt~0WFFZBl%eJj>QmjM~=7znj6gqg{m7C;h(_1vH zV*l`Ik-4W#(B@CbEOzBvz;&9;OMiONPrK7gPAFjOs5GL+bmK_uLxno*Zc|@NAwhB3 z%Wj1TF;-Dl(kn*j>kvo30%7!XOzU#v`Si@by?T9h%;QWkV^=mUkvc5d-g{l1nomKe z-Ld}bgfu|#r`sXjkIKwTenIPP8z9)i?FYF8(tGERiA+l2vZO#Y*XD-e2)|oKCDCaX zoySrn=X@KA6@qlnxHkGR4!k@H@-xJEHk)QLfA*v*n9^cbd*(VH?M1}(fNlKLtX6sE z+`A)t76cOpBK=+wkRSM2SjwXn`h}X2v{(2ozv$!nWU~Is$3g5&QbXrQFT|?^?hl9Q z*73de?ihP#GqRyBn}``Ml(5vXybku$U{womqE7f-0E+>hV;K{#z^gvLX6Hj{)E}pG zmp^i1N2l}Kwyu2ZExE~)c8x;orP_>!+rDpG_4~lt896Y6KCs^lOgf_h^!>X&i~BhY z-H|t#JX>hW#PX=44FwD?5*cuoUX)9-@)o+HObM-Eep>j8rmFic=5X@}i+m@3m`5`E zL#bpCYd6M5e)8wwAhG zi)vt0aaZy4Ja~0b(n>|A$!C2*OTFT7-Jbe7kI_CGy4JMZ`H*XNfP=dbPl`K|t%C8v94(>wA)z$RcL@WKYB*u`a? z29GX@UsD(6J(qDf+1F{O|MSF>lbY+hpz5{F`tQV;!HL^_`=bB);--O?;jxXhD$itn z3K2*ZfHL9_AUC(NT&+#!xS~i?O8kd4&*D`3i0guv_A**yLKeVZqv*1ZxLbIh`&a^7 zS4^U%Xe=APea7({9f2y)fJ{*y04gn;MaLvQg?>D#1AEzdjmht@2H=RVpj(VXf z4i_fKQp%7ZF$0q@sCZ?JocAh?o7^~86F|$WHxyP*j`#B`v2#oAGb*Uj$aq6bX@mzPZ~$)u2Vm4||^8%=F^3A#hu zSnvpW5rrw-pINVdh5RpU%GS^Rv@HKix7Y3Lv-~f6dk1^HJ@cx1I$e>U;tR>JId60-f}JK?|*UJe$Ly zT~rCQ$gZ;qCCGLvF=gIO?92)9+3n5SFVCP<=22Xv`9wj+qX7S7kBUh6%<~jMO=DkS9Dzaw4=NmUd#}>o;r?_+( zn((be?;`T4u&8%jw{k%bCBr@T8n_h{^tLi7HL^)urZBm@!~CiAH>H`+7WZ|;bp zSwqD-Ikv7XEh=YJKv<@)sGFILcoI)ZW=Cu76WkFXiH=|w+zNmHXdUtFw2P0MkGq8riLRk~4Mf3a??G0EnciLy14 zqVkLaJ;*YCpdNiHJ8;n$Ei!5@1&TB(rD9IYL888%-WrRXs@34UGpO z-}br43jH`B8)nu3=lg+wU_5~**aC}r6p%T!RQo&kc@Q|^=mKpk!}%=E1cKmjPcjEs zJJ+SGQ?yijpbeav{S?wUuW0=+NUln&Y;?GnGZXWId;+09A>}(5Ir!EyamG8w(Ok14~Gn6me*i z2OxB!@zexiJJqJZdsO73QU#Cw=2i)13dmC2;pRzEk}^Nsrnq+1g3{FBD(s2te2iqp z476JN;oI}`x8Gj9@1NW6uisvszCORP;mZxO5jE3#XXoH49d7cN>l3A6HH_M%S`a-U z-Nq|!`at;*YR#tVm>o~$7P8(Q?RH!2fAYne19}m6g3A+edl66gRzyQQDb*28(brSa z25?u=sj7286v0D+;(sRC!#!N_;oHCgexf~rKln9z1MJ`>a&+;OtCLjyTqgT@f=c4S zz=>Sq2ub;l__eix&M;tGGWkMa*?nUpGix($QqTvQZN}t=?xPpXqsg-@%Or}EQhO}O zUCZZLT8a8AolWk=DJy)w9vVHw^=yiG5xHbc>FgU#Hs!oaX`p2_V8%LAZJy`Id35>g zavB^8-Zr`NqEma}M4TlA)NW|zLkdu>nZGhKwaCwuWQ|O{VBCTArTDIQ*^N0yqw6~A z9#yJWZOh~@oW|`%h#16LVNUCU+@q#0A@nT^IFgvpuEPH-XP!{;q2li(%kMn8;Q%df zo=*}Ptf`>3VWZ&6Nv$(pM?H)f9K{+T;XJrf4TnP&IN9Ja6>p*YTf7VYy5 zb#SIdHJatFKn9kVn>9a=oO_oDJkwldQ+&foK8vHf8e=d}d4k9w6e;a13ZrmM&l?2m zgnqYxSB100qt_?3P)Rb*W7sihNIC3)$~9^`JBS-x!&5WmQE-L~YJ}Xb9fM3&Yl%n- z44q9iAKc08q(%xQ>=HJn=$d%XSma+G&4qW9{@C~|-5CveA7Q1o^q_>E{g03!{ST=B zx7lBt__p@LM)d!O`}+p{f2XtG>5=}wyLWKZ=^m2)|LEvX{r|7=v-`!C^~GAceyF}7 zWj{bF(Dqwj>;ggZg{s(|c_W)!Vc^FY0|_+$vh^5vBT_U%D}VOoAz-A<-PWQttmt*X6MyK-a92Y8OVn+7zqo}j?Zt!Z+sI5m zVg@UHSr*2?@J^0hr!T?-iRfRFq#!Js^+o;`Ob4EuZ(`;ox2bOc$1j8U4dOq^UHW3z zXnjkukBSPhhTaCj$N8+F9L1vr{@#WYG!7jbgD)bBk1-QBt>C_&1Ot$1HmKcB{ZN@0 zq6AvN_?4;sG^&sL7q8zQi#;X6zF_L~R;Jv|`^#K8cy@Vl`AxQH|Lyttb*?Zy)s?=z z(iDb=*XOUZWicL2t}F{ulP&tg>BViXC_dD50TWs0%Hl)OgMV$2RcS77-e#xxQ_R~o z(yJgOi;p<4$ex7-f^#YHF9iU4uxMuST$=myh#1#2Xb-B>f1#~v&qVGxj5@c7*eTV2 zeSZ3yhX7-zpi~>v<~%wRpaFPFMgc|tp3PhkxS3NU2A~Y2VsKze)zxrB*if6d7rL-5 zpUJT!vJ^~^J6{=X5O&F;rJ!zGsMQnU%@&JA+jWOg8(8c|Cmgli(R}y+O`Y&Q*d0dQ z!|v{*H*y29ENH?YK@z7sI=J9|q+`B+MG4Z6*%QwnQSf!XG>&i=m7u^vp;C*2>)<`r z7k&_bVLiLC2)Ny{ytdoMau|<^bSeLwyK`5bSKey2J;VSJ7ZmEVNTIMw?vp#5Q{*4z zPSUZ?uHTF1xQ_!Fpt@l}+out#z8|Ro&rqY6t#Nzt?%Y;SMyilJ&sI2ld)3d4 zfF5c~>R_iYvQ^%m_HXS|`RJtz;&HC{MgR8vGFzA)>N=y~d(x9+Yfxc+-%f8YuP)Cs z74T7O>tDoFDO>pToAds~-?%*+9HYR}j~liAnJwPbnp^2DKyh)Kmp^?2gSq?;3Z)WA zn?Kyz!npj`=Qou25m&1(|c$4ggY5Gh6NL7&7T)uy2-+p@oJ55&$$h9p+5Rxk* zzhh(I^nATK)k|IP>zVf6yf)S0uEuzK^^sB*&{HJiCuBFzuFNqKX$qKQ$R=f^ZBqb}t>_Ux0wPN8HCrsX2fnDctPgbxWI-VX9vzQz6;NspCg|cv zWT5fyICR~5_Ohx@A~{v@{Pgo+4)_?d%pMLP4FQONOJtuG9)7rMrahNZ3U5X5g+6OL zE?!dS5mOK#dTUV=bc0I08L@$Q;XjpzxYXR1ga0(QX1Qsq&%^`)o*^I}+yqf8337rh zA}STNkVcw;X7CGZ3c=^=$kQ;>PeXl{&Vb1pC!LsdLPUlYTf9mh@G=EsAkSHzCxY9B z&Zh9t=FfBsr4(Srb$z-5$GZ3ldUkkkT)p2VjlFZH zeVQd>bIAfMYmLrpD#zB;`jW3Ee85!~3>U&mO3<<=B^hhVj(W84lXcvU28(XC!y0NP zv9Ll^UfU;K)f^7_i3Tr06lyICChC$H+=(=eG;Y(@v zh>l4eu_DiJ;Vo9&)NQSz3S!TR9`FrknnwnsX!3-R79m7kUz3?kJH2s22a?!^shq^j zBW>CrlsRa(@15KRuO!pTr?tMi>2lSE2-pr$}ytU~(=K z7_}f}0n&)sa87(|vFl>^_vpfA9Kkuoqngtx!moO*|FT|UERUh%qbc#dgSvD=59lwY zw8s2C6ge$Pwy|9$9$Bw<$SYk?gaQ_A=fACP3pKN2FN|W!)rOrAxa0Zv6Bi5e^@P*O zA&V1-gBpfT^k6x{N+t0*#Blk%$R(a{2smQS5|m1V4mM3d#qbwbbs79xYOMwe7Ybl1AT13a5 zPzoid?fKRc2qZs9#40mES)zrv0f0IK)aJw4&Whm*M8cGTr-l`C&pVY6s0@5YbPShp zYM*8g&yn0I^#VmQj~E4Nx;WZ>?d&vli%^0Y;F7~`x~Z3U$23o(Y|%tXH%l>bh0Ix- zUy0nim|@rY@!eZAMn`msys0;FLfnx!K6y^~&D7MP7_w1&K7bC-i8hF5z)ZSBKv8_K zzZ*?w?R`9E(G2P#o=zlSKe&|t20K6z?vOS+FgZ0;dd3s$qZ`7hjZ8{A4rV}g?w@VU zJ5^KfrSV#MQB^1QJGpI-&RD2H+~m`Dki%)>I{jAQ58nZtz^P)>oC zK|@@Zh7zbIGDqdwra1_K_Th?x7>%odhINs}4h9U%#O}*nf5eQ0T)tZBF$6`Q@EmG~ zWBA;t{nsu@^U;6TauGyXSyOTX1oGjSmHE@Vi6WC=5Oh5BTdf1Sxre2iP9M>#(sryB8gN3e7@qDj)=LJ+guUIRJ6Iql7|4pSu|l@?LIdm#f?nBU2$A zACXdHRFi91$44imzT(M8MWmC@QknRyW=2j27AMlDC( z;RS|&F9V80XC~3sVf+*=DEt%2(ZM*j#b=-v$O5!j6?rf6L2e}?V_w#l^N+CJV~&}5 z%vzF0;`&HS_+TQCq*)2se1Lh>>LhbaRTlpR@eZ%!Y4@UM4vW3yD5;B*kwLLwj>d%K zwC55zbSF5WW9K8zCO~U^)s%#O{XoS0K7X?gI;KSn+{fHfbT)`s$SsDYA0j<@n!l5wfB=$_w;*d9$0B z%~5?CZCE-dO*ZD7^jOSd=(*xvmr~p*>AFW$!%Ax~x{Hp{c;2Uy2VbH(0IZ{5(wz8E zlmYMkfb=+t2vT2DIztFE6Lj~MUhKSNi2cOhyxT(al&G_ zoj%>l-c~3xBR${zMW-8M41o=zEI`zaB=eXR8{2r%6RD;L@*BPd_@gYN@eQ*37iXNi zXn4T7x2zGa!&3{>$|4F+<9RdTGlVO0rZbIZ`=k3T5tKBsyqpRmxlVi}!OmOa))~X+8EW6+glOtwkLMtK-8L8zLwCHiwZ0EYGO(&npBd^%aH;>EZ z4bVrXm80Mf6^fn#=%ZwZk#krCd{ZewhP4^$Gpf;)Re*|(F9@(!RVtPRCrE^35tS2P z3u&=Po%TI4;#`a7`INredJ!@h;*k9dCQ}Qb@Br`uBgVgoYUVrD7ZxoM>;U-3l5&5b zSio{1*`z;rB8d0cnR=L`n8o)dA}h*#KzMf&wZmKmP17x6=q&gNo=|cbeRj0o=SwQ3 zM?C4fG3EiQAVovKTNP)@x{uKX$R;2Zk-X6~t3`X^gkaFpbT#UBp!7hXV%1h zbSG*KbZT166fv*Z8fm|9(p0phJ0sPLrctJsORvji!%-TOMy)?W9z!8OEPW9mM16``0H1maZ*vXRJgf@${NpDm+ zgv^>Y^VkH$0BW%SqY6rKghGYXFu>@ea!H)g#Iml%bnA}K5~YxRXghl=DESID)cg?? zS({~v&|N2F?h+aG!(hAlu#>!*>sPR4z2;;wRr@n?th(F9sT*sL2DJI zJnBsC41>e5AScj@PKEfPhO>>`sojY)Sle8(_zw##&GUFE17*LPT6SgWu1&JI7!P}) z(j15GKlRiI-^^Wq_?)Oma1~Kc+eQZw5U^jnL#x;6z9h|T0s)b(lX@UguIcouVep(> zs^J-g_nV|*W_X$anL6?CfkoU(x&bW`?6%xlGXwdnqGqz6XhLOmYSRBaYF1fIEypQu zWNPTR{8a)FC(&2bsHt!OOF*>0xNfax)tVo6x_9F1ZmpRMyOa*3ae+4<=PYh<${aSA zwy)iF=8ij0PpwjcBfA_>2Q< z%=vL>i;9}ngho|fhRNqGE@$nTNlP3*133?(n9=zdxaH|g%hDsW;&mkL8SbjeYy)(5Bw{Zxz!}939qx^e&?TVkMvt^J zmzZ7&>k;YZZWOqYxIV@aK`-&b&38SbX82lhW^R(lEnOiezOiurhUARfNSB4(WmAAR zV67EPg*LG5u+?nY~zNud-s>4=!5X zkXgsT9XhagwE&wI=>vorNifcUVQ%T^mTK!nJ4H`dAREb8nZ8YXqaQR!U@zi6^3udA zdoCr<%yZ6nqlX}7jxJc`gX#?Tq0W>R^}D-V&`XjGQ}J!#m5DHY8Gh!`EbW`-%vNJWXOjF$?3omk0q?6h}Y`= z$(r&>(~uNz@c`=iD+Rr7mcde#y;@k}^Gw-(VsvU`6rJIryhKYnt6pE^=1EjW{Oo8i z)jKAQ`N~~do_Q^wtuuYXv4vwBo}_6gq&ELJb$sU@UTSs@ZP#(sz-a8!O#_PL$i)o; zG|xvCEDSLGfs1$hlV^T#p<51qBzpyGoYGkZr=KxVp%Mr+kFc$LoE+uwV!2G=Tnbp^ z1j+&dy-ISXHql%yV)H@Gt!=W>6NH5ah*wG}2BNnx&1`T6?acY%5%)}FN7^&S!2?%UV z-fG*NcB)gKZf|^%NejXCP^uMWLYI<^Hc3NFVz8Zw_vmJG9UwQtmbiaS!h#f5WaLFm zd&7`z9%YSUF?jO>Uh14BVkDeofw1%q1z=QQ!txD}n-m5&vKgum#~^MG+$i`3r#cq- z7ussb3g+03taNfVu%Z4nLonDwLyRslH=H-n%?j$e+()1zQ|N?;))UFj0`7rg*Te3@ z+DwcDkuPK8m*tOh%t$(djBqFN?;&-^&nm;xEL7%+7Ep;4W(P(s@)B)A$z)P^%85Lj zCoe7mX5{JsX%~eqki`l%b8+fr;Eg=9hNU#D8Z%i)Qz{5!VW!qz0d*)d;Zv@YI>XI! zXEN_-y-vZJCTwfy7^<|hqJ0%fw8og_`moI{Dm!=}2?+xQCH{C9S|nM@ug9hV)YOYx zG6ysq)|t7>016_Ck3aGJkBu7Zz>5fbfSPsPu%n#mHy0F-aixTZj$%dn7xbKVL6jZ3 zk;(XD_z(tDZ$53`2f_WsW#J>~YD>J?jl$tBrb*cSayJ8nsRBVJ4yk}m=^(g~%5a#M z#en0mFptiLT{$o2*DEz;5AXbH~$1&<4Xy zJ?ID}=?09Ohpd^c9cvmeH3&{Wcdmj@5--3UEE-MblogP>aRw6h6;YEMDZ)g<5{Ga~ z;`zhf589b(6t#_Q1Q_J5SiOOZX77^aGmGsu0j@O4K$v)#-H&^O>eO@8 zM_!Y5?ux#IeO1m%>Ljs}y14xQ^sO;fbSmN(2!NXr-g1u7RY@ zE-UPR=RWIH2a?%D@puujw5*yC43>-+OX;*=35X@_&r#cuX&=~PVSB8$ZnA@z5tNJo z$zbFtzz6tHQu|0I%{j4fRSG(d$LgLd%aQ4xvjm<=6xJDR* z9r>}k9m|t79$iW?g^ zAjumL3e7?<2)+2Zv~qx;N3IwdMH47&B+@h@>Md!DEq!(zq*qxgl;@38n5GiW^7>bG z;EwLS_$#ZiaO>P-oouY}f;bMuC@>R*|GaRXbEldTA|L0mfxT)W=w*YF-AUJGu)LtW zu$#toF3(!2L7#K=cDmW`OXb_eNPlZcLJz+wa8(i4{QRCKZDZFkSP)6)}aF z8wOJp=Y#NA*p7UMN-;NrobhKh?KxeTsrvIpFrSP#Bf_+{I#oK}2WVoM8^i<(sg@Y@ zai4(H64}Cwl#!gjg4Jeg3e!VLoS7YA^6YV{>fiJV#6?Py@&R#7mJ7OYVL2*ZHh!3F ztRa55_|Gl{Yc-B~erzuZWK6LPuuSC`#xi_;bYcbe%E5_KBLp8Wz0+CDQw+mQZ*8rF zI$31dN-t)#C?m_cI{YnE$fU9PbvhZzlLm`WY32YU$iz}J^dkN!(|B9wOG&Evgw|pW zniX71U|2>?9(jU&lNhBtjYVRtp?ICtC~;)MCDJfscJg!q zNuuVfm|v`n>4)5Oew7R&RTb7d)X60p!fs`NL>1j>4_+Rsejt+x_iAHQn>nqavMdv#v)Rl`%iPfo z0cfvm@jX{f@OFx9NOcMd^w8UW;aQEGUZPnmC$YY;&{M7@I*=KK-VINWQIUjE94S`0 z%HD-PK!lbyamOE>D`5AW+%BiU=0g#uQ6OA5ArX`Uw$< z!?+ShHSsW%oh$TXbdQT5Tq~PCQ*y`BZu&xyQ79!SC=!uxO6pB`$XLi56 z905~vNGwA!^W~XX{+s20=47GImH@gs|MTYd_nU7-{`c+IZ#FkE|MS-Ct^eeI{!jkr zEdTSdi2h5mIP64BA_;OnA*z4jPvA5V0TL%8U>{HJfvg8ImTsKO1fAw$erPJ__&&y@ zxoNiC`pIuwXl0HG9r5oSF$4HZnD5|EWVTtIKp*H;UE@mXlV~ms)!`$J5r1e_F0ubN zFITJJ5rLI*Hv9Cd;7ySO)InuZG@nV?4=e3sEL%}CeTgl$$v%r;eXiAD22k5{AGgG0 z(>3e)`e)R3Y>~Gf6k)20)5Kom^vJUXFX%4^_7_%9yQqMnH`(lomzmXz9UHD^v+ozi z?=3ID7VP>25GPpO(9+n64&ooZhj*qfieJTUW)BN`D2j$}9IqD_y{=EcTcBQmvCmHK7 zQ)}dKRE$}DBTK9K2@C=O(~$iuH<|)wug&Ojbv(x~Cubc zsKsX9Y-{8D4LDj^%ww`56W9yS7S1w|gcy*F9cF9=8_-7C4ThdW5)>58SR0!xq0`6R z)K#+aR%3eD7mR&&GEiPV;sQJ63_R?l8{O~YW3GvYBA%)(=(8!PMv~HuC8y2>!SXB+CyW%)2 z3u>~GA)(-dJW=?wiJEA7m-c`^G#+ET8qd+kRG%=u3~IE}RVp};79~8w1qb?)xbz!p zA$FIHP~reD9HAFf7-IZg#gVYWpf!)0?0;CRXe^#zP{*{!=nWo76)kc+Yd*sOu|;CO z^Nr67`U^!L_)6mB8~IS>~wRrIAD z-1t!#pc;!^FjJ~jI9Kf4I*Ya>YU9_YwL*;7N>ibE4aHcUd^(@ht>S6)9Q{H+(WiAw zKUE*!C)5q-Di!YG-u^zu_Y+Si?bGANlRBI~qn~3IJKe$QlR8!41D>N-`yV<-2T$G# z3cK+foofHu=?_xPuw)ln%#t{|i>%$ipt$vYW?$-6aRf+>BeZX}+7zc+p4JO)@wu_( zf+8YuS;mi^8$O+rb9C9g-bEB%dx5nkJX2B30|8J7cKVPxe7IHAZ`L0YHgWs=AM1^j ztB#Y=#J{jGuZiTXUs$tyYpb=HNr6ReTR zun9gxjp%yUmhwZ>YM2U+-8dm3WfyhzHU*)Nkp+eI{u^p(5^lvN!=r`~MohQwyZoog zw<5drFW21_Mp<643;$Qf4Z{&^xn`aTL(9!PL3Yp*j8gp2qmAWS^v=#P#t8Sj-ExOT3Z%CuAMPw-*WF?^MCc{#DobyX2cXjVx5u6AB zydu9*vWpaJZNxk-Sg;ey_7?)r5Hck_w%DY*8|&)=Bek3n;)eIggVtAp^igoDRmwq1 z^~vvzg7GLxASfazlTcu4V{y>6!sv2sYYoUU^0I3g6~+`@FHA()6sM9BU2vOtqRTr) z3a*wuFa0=Y&++>j@BKcuj;ke`n1pu=3`=@Ro_&IsR-~{4d9t!+-VSK^Q<2 z?!=MM@ULFvV zWnSS%nI1+|67d|cXoZG>W($$MVy>#^>*-5IgFAi(H3lqMQ1tPPQ-U7ZM3)Ei7Dzv-UPUfGSq!Mjd|+6co^a$iSX{(stGny^`6i~Z)11` z

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 %-d;HEt6f4+o71@<|!6-G2v#SdgU7 zR&GEPFQ1m}7)YA2ieC^MQ;VPzJ+aW|=-q*-Dk%|fD-;jTO~pZ8GcZ$9cv6TL*55UC zBbaLzPGZ|7Wb**jCA4*zfk)}wSARcmPAGg01S>_c=PcG&sv6})j zv2HYcQD#=+ZqBPC2@$!i&fO>*yP3*!+F9B(ZR4b9F-#zcG^l6+u^<6QG37kVs4J$$ zq|1?a-*3-0FIHtu%o?pbK?}XBblixiux|ve(gr~B(i7mA9^r3^`M+b7x^eo@M{9X$ zi9>i%+fCQ&2G)3oGdTbhd_r0l70YO-c$u(=Y*F?H*#!Xlg|d*b#>ktsSF%?hDHbLd zj*&t?g=5AT4DCVhk{)N;{HToe~n;Q{0u{`k^45+Z*fa>sF*r`Ay+E>ATyF z74=uT(#C#nZ|Fw@tA`dxx@;3>@gKwGR%Ck~aB)LTxX zN9C00pez#;bgI&Tq4=TJc@|aeg7^_~|M_+M4Z0AF=XQ%)x zdl?a61@7m}%0UT-J&% zvpaR(#31xya#ge$oZ9*LicL9Re*4X{wpsav>_Y}=i86%V#4Hkd(!(Zf*)2j5r^RP$ zfIh~__j&|E52CuPUxo(`|+2 z4_yEuz~|jzF_L%-*829du`F-E(2tC`DRdSTYtkstjRAl7qtkJEF!&ylP{B+rs^4rlMQ%s$ zgTuPSAj*T_&@}09)5$jZ-y+jU!U8O#42UMFdq({>$cRxA1sv0$*0CkgbV@ZFPYWGJfNm_{cT7h6<)_7RV`(n!&(lba zl&;8b7rx<8yImRbLfoK^*{{zbuaaWA=1AlgsOiOUDJDQnG7e;sZtM~MHR#G3N?qP& z;u+4^568~LUg(smWI?Iq>~uRRJ}xP`oE^Qr)RpgDY(S-qN90XizP~dz5QNQz>Q}~Z zcXocU<*wM~+=(G0kNW+xMU#-xB@6EGD+`m@{!)%1{y-`PKXI*=l?C^*3EGeEWZYzw zN%0iSH?q`Jd^>eRthH&$wOGdzlJR}{!-vOb#>CLha?MWJmqR&;KPHbxSwe}1*PNMl zgiz*fN-(5cgn*nhvD>Z&`9(6YQ)Mq%@XVLHV@yMxF(ljhwFz!jHf;xNWr#}YWb{pD ztYj94CRjlJ4oL{bg_Sza7j2p3%gXEJGAT+GbEBW*EE_6V4O8qq?uNFlHW4vLM39b^ zq)RP~1Z8nNk1JV)(}5I2{U;p;Pb%i7PjwY&aR2mEJ_xCqH1iFn{!S00s*qVw?x<2l z(|OI7c_@P+hl9ik1AxI=&=P+O`DmIb-GbkJH%;wn)piu1o~9FcF*{>0A_15qT8G=+ z=cqzN(O0{YjaoLyu%IsCqnxW<=(FJnpsPFLa7MrVzSKo8Yc!=J0Xk*`+=mBvbu$d| zsJlp?G!gx&c=SoXTM0>TpQEdEn2r;)vbsmRN~U)Vs~}e$MTQV@mpW;d){~xhXwir1 zZMC{ibt44iL7qP zXH_+1;aVI%?NUmLMNFiLYq`YHNz!c0*pFLWAt+d(WnNKGu)^8AwK1-oD6%NvcB1DLRr~2 z=7l`tS|8JU{RWUimtuQuL&eqTf-h%iO+CGUr|c3e@z@ajbpab|>e2H!LL(m(=5`m~ z6)T<_@b5tqok~)eVH9N2=+&@eT~~TFLE{iGV5oy)3Uee{7#*zvZw^G0p%A|$#KI#U z1*3$8jX>B*#Lfdn9!!+Xdzz)g#eJYD52G18M956W7DV&G&~F6$Q!`Y}cZlXXP*ZuY zc~4t)E1Xj`+a9N8|Ag;!gmFGYW}w^WR%;Vinylh(hB=)cPm^JNpj0G#9O~-4R)#r; zG(af=U`quzL^)-BLnYBg76RQT73FI5uc%KNTS0Zjj|m91%#ZBuof2iv#U5F3eyeL; z>o~w0AlT6lXE?V*03{B;O|_E~-YOW{Ap1yh9Fbhu)Da49>jMh19kfHB#qFh;vEAxn zj3g66_gQK}`qvc^wCGx<%&0E;x2rT;NZaWk_H@j#MK&fdOqL-*B-g9vaD~_~5d*H6 z>O^&D%+7eQgMG?}PSKAYie^cB|EL}30?5I#gHOqRHk3lkw7uE3irio7#okQ;V*XTsl-clu3| zSqK&&CpQKa+A|NRgmdA@XfiTX!;x#uuxm6dM)4FycU{cf2jG}`RN z&-G$ePq$A51o4M>Xq|SennAmwb-dv6t3UnEtfOyFB(4sD8uO;6EK+>Zm}m+zHEptZ zRSExQ%7#V$SFsn^u80o>IlFM?QPk682xpg3SpJCzf;>ZKQzcKLQ^5N{ZdT)!Di#k4 zJbiJh`om@9V6X@zA?isZgqdWKDk*I(J=j3xrocFNb6AA5A__fMpg*>hUaGY)fmUNp z^gBU_6(|!kfiN5|O_{tNJibKHKvR{nm3NG%?ng>!uUmRLR*faP1suQn9#2^}+v6ai zY}@FGr()xMt=E9r5{g=Eova!Ap`L$NG1j>N`r@NwFRXYDuXP66gM@VPV~H=#*OJy% zBk>_dSR(Ljc;;3E{@X`-yO)j@;99vr4g4JAI zGr5TqV-gM=MX6ryP4Igq^g{s$-^whM$c({(9a7G<1*CJ3+;!EiY)2dI^=OT<1~Fyh zqnoMlV#hP&=3r(ROHIINRfAF7vil99gnCE`LySfcb(nh&g0oULI7oGp`E!+yx<*7E zus(_Q5xM}AqSS_6r_4?Q{C>(Xp?8r-m&w=`80$4eku+yBxJe|OhDDzt;3dO*l|!#R z?*XdJbbX%rsfYn2Lcqsyi^T~HERU~+!B})(TJd56hDumkJ0w9}Mja=DtsFs788u1Z zD83JQVQ1*VlE-8o6FqA`S41xg_@q6{kAEEMR>y(h2yi-UAZO0IhMQn)Wv@}erpRw! zTb`a6BT@v|$C4K9Z_3Pt!`6ak67Bj!tmL5b__;tQXAz~)Ml03c6LG@%MF{rXZ02% zOqtN%BtrIc6|)9H6*6I{B)pbHrpE7B2Bj6Kyj4k6m_8vT-3^dyoC4Q$v0QlJ&awe& z4lrs)S`&9ot)*dk(3nv3Dpt<7)hO!^G#7(;SEDBSfyVlEPB@JNe3_@?Kk1lXlEqKI z!>ps`y?I=w7#f^&Is)mp*?!sH*wC-9F!rJMdh@yay36C!WuCP++v`Gea+Gu4&}!nM zP*4&=$teIiZVKb1A-ZP3v@Q{qCLdIYY2>8$Qx#{LXkpggN+mUUIGnDqzsYk92|) zJvg{thAfBD@rD=&a0nrVE%?4LVJh%E(hE;P1hvQ(=0^HeFtNXPc2a!Z5^**VGc*7!tri-1&Kg{^g#dg@X13)x>6I)DA&Cvm!={nmRsx{5;dYY@ zPsO5^nxn~Ju=efq^`%PWRP3@pN6oxn-Il8Q_L9kNMGd~O z8sq_sw{d?mHWFZU2NRScI_;y{A4otYqJ0uIjUamONJZpBE;eqPvjuPHUW86opqUkO zsFrjH=mrjskCA_fva%gIEmGG%GmF9R=fJK7teelDJL~O(n=G^DR0OoJxPvXRc$Xq} z7tL}5*uPDIFA0lKZs<67m@jZs{c1(3IBP!fp|oT2x>34vQo4BY^9q?sp_((;$7;z6 zg;#F2_)Uz|hI+W69$JUmq6G=5a+qE#`8wcoK(r|SMefo`}uaam{ zK~gRo(S}zW=y(L$D>zkv{ce-7?a}%qI-QJ1WAZt}0G;_wDj8iU?yF8!d!bB2p#5fI zn-%e}tZ?2qA|~TL$JqYax0?^E_;MB!uQl)A+_3MBvvGD44b!WHVq!mqNoMt9<@;EE1K0B$?>^w%b zd73y~k+u<v_7B?-ui3Y5))roRWa&sGi= zjt`_sbkwqs(NZOt@AR}sCgqXIJ>)l!f$gD{d7IWq!A>mu9y)5F5c@+-cZ=p(nl%jD z-O(gjQoZ`-*)I24edVx%&VgJoCDY>Rm_9odlTn>2Qr#uLlwzRJS4=Ivwq)lb^NKqZ zx_>bdW8swdSPfO7UWrQ;aGNm=jMd(n8H);v>*;Z4X@mm5NO-VoGB@sfQ&@Skvz~Y5|xD$WzDY01US6q!5~l_?UtOZ zgpz+ng8J&TN$uz~4fa2`bl{tf7gc3f-BM1MWO+O89vZJ|EPF2)(%ScsY}-viU9){c|?Lh}{}yoW`n-tU7h8kE7!{ zXSMSJ6$%)iwM^Az^(j#SS~UV!7o+x42eNP(HFdz)k;VXt4wB;8*J!M?)%UD1LVx}X za0qq2{~nLpEobc)T2UG*wmpR zISMUNAnH)u4SGhclN3w_i+8}qy^TQH+C^WP>rk2$mKNROp}-^H&~ky@lDF_iJwoy9 z_Ve~1Tcn)XUPpS0?;L)LGN$cs*V`{zqN<@HRsDQ6{*zQ@^^E*Lr3`;1@uBs#tNM%m z2oM%mL_QvhR9D7>#Y|rhXK&hbkY?S@8N`_s_{Sp8B#60nfy_&=J&;~|5;Y1KPufuF zZgXT4RR=X z@EXZuHd+=D>Rbr6>?Rx9+qUJo+G9B(Z|zDe++lrTCP~dBqDkEw^G2IwX#**_OtdIW zvRPuD4*7;6OUw~i-!s|}ku<8UcnvJx<ArXs*VRsPSRoT-ZEGcpBQCmAkuh4E8d`KB8F>A z?yUMwZp4G@KYQ^DeL1c2!4BTS_ojSX^VSB03SJoH@p%qTmQ!Kpr#&0Sh>+T!xLKfLY25;+-ph( zZEi!+Cw2G)yY5D9T`Ri83`<-97R(a{%ne!L;^>J0Q2zv?`~VBVM)xMNgF{p>!-`-v zPHQs#P`A<7gb>;Sur=OpS~U-oCp{Y~vpLHe`{?7~*ATYJ6(_B02dGpx*r>NDWN*XS zTVYIiW@=G*U@2;&q|N2qlH!4H z)s3jjn#pdoT?NDGzN)G+&T1{3a@e+r=YFOSSRq^vNJw-f9b1Lys86;b7oxJ;Mf$y~ z?gI<)y68D4`H8R;-9MVIcX9-Qf`_>l+nIL=ro3mC385tYfM< zi;cA}S?1||@=_M6bf_woV_R3#k4#mQ0+)n{Vn@!#$}H$Y2Tqg!Am#Y7lE_&#BXho@ z5JD7c1rz*g6nkbA*geV6O-5rkHyp#m%flzEsAUCC@~mMn23+ z(q!97f}Neo$o!3Tv%1~Oq_`$8aW*5ne(6_1-@t$7T%jUQSm9@%o+ zazfODOZzRm$-d=ITboAFNr8(F0#`#7kH#c_Mo^iIak)AJeeJ)4PbQ;5|u*CE3Pc2D^j5wSzCiIz7Qe7Ou z8$$zVHrx_i)<#I87Hl4y{E2Qk11$7F1R%nA1eEU$-Verc6uomM<<`8d;Wb{<9JRL$ zV-qmMc9$K~(Q)cnosr?49MO~Q(Y@qcZHyyLtF(QpTW5$mnJ4QB}k+Mz*V|YT*f9v5DaH-l0Pkb zwy?M*uP*w1*Vv2Rh&PHUT+MFU?5CeH)TvV85fGBV&s`Rr<1`^^CRN{)R1@Sp zHHlP6L@QZgN|b^Dd!HBc?Ss4E&R%3WyH!G4C_}_&ydf>X1-Ij56!xC=JBMXV;-66cO@ zH$fmqU_-`5YLduTp92Z!EJ?yJx?Uiwx(L}Z@ACy>%!~X}s;V%zX&q}mEM`tXlcUFW zuarBk|6dro#Q2FT+<~gqOE?WC`vo);H31o8^k)XC^;p{IM~xiN7IjXV^9DwQk)L+r ziBkK9!@zZi9A}6w+ly2=q;QB&-|M6$UOuIe$>Ic|@V<{aT(|Isk_b$+?+ZoJmV9JO zn%bB3I~odOqsasb$p(Zi_5=WP8Li$gGfF011V(mMoIA^)D7PHm(`1rO*zqYok{;`GBaXrEbL$ z_qX3goj{PTvt6002q(7Xi5>#J=*pfqb%QhyW@?1`&tIVjatOx~=z zg)Kn^j%b{ZOt*ebSo54DvTD#0w-G~BV$G2mKK?Xg@Ed|REDE00kpI_|J8d1w01^(- zbxF}DY@!2T?IARWf<2RSZDG2j+Qk3TAAcM4hr>MuuW=t~Ep~eY%st}e?TuyGzJZ6x zAlMf$JXrYtg*qR|C{!+b=rGG4eii%eEOIS-bA7a1xw?i^dRpX8RySNP9}ZK#Kbs$c z(A-|m;PLX*NJ2%9C@-?A2811#eb~?BCc_+OEaDizk%Xy@`GZ5pwlGYwE%zw2%PjO6E+nb8HBOS(rHt+GU}>91F$~b`H1IBNfek6bh&>t z8O+c>f1Fd;U4{N;N>M|2J+`@;%P!*JfEg(1lHrx4OetV_Gh(vPo(Ihn5BGMXW`#f$ z8fDy%=cP7*p2OhMOiPXpp@Z!UwK?pYNP#ngpUIF_NEWsUpa|9}w%Cq3SgOK$K@%@3 zoEG0%TZ$+XD<+1s_RgE`-eKpg<^6tX$DUHrjQIkG68n3HKedE_HO}}+bg;9lM&8zn zcK*GkoL6AiZ*aNfxn&Px^iaAo?8{A3eB9!z@nW1OeYiwRbyb!leN|f4fxy?5qbTcWHPj-f#sw z3gC$oBH+@)cF)~)Qgl=CZUPu@ix7}<$zfo>=CfAxJhsf%xU}Wo!RB%dNs6Q=Fb|OQ z`o!7=+nA@N31?_~klbAKljv?Mx_iIzf#PQ2J5&r=(_?KpV6cH;hBjb?WHKm8dWbE? z+J6ua3lVUwi0L(itd`l67J`jX>R8jyhw9I^Hs=I%K^bTGJn{a#p)oh%RWSRcaar36 zS$w|RJA8fgj@fEzeH&=PumvY~Zm+hS*MJo$wA>8aOG=$a>=-Bce}P_bXgJBb92#s4 z44af;5PnrDp^QzyA|`xZ;ra2-?oXYwc1<(ykO*ES^7vZ8J7?ukj{R=sz50}PB+r;7-DujxJPn$*Ib#DTvp=63|ZL2!Mg$1 zdW|Sl;HK!gC7YlD2cSV&$OK*TP;}-6k6JjK(>H&7>E$IR?QM?yVPmU-E5O+Ri2-k{ zy17s#COV9{&2fKq^*H)2dQk-+EQ)5-ji<%>I=XG@3O3vO9*_A4Wz%XHU_i)Fzd7Uh z$4*oxLL%q`;8Gej4kxw*i_HV3&=*Wwh)L;}p)V}rfPF%zies~40(YjJ=Est^VR|~G zNb`YKU6S9*oljK2V7jl*kM}#jbl;rs@3-s+Z+G_J1gHwD#QEV*hez)YwNcC{MdKbJ zdHAPmC~=csCD8@O1#BMt5Wgai;gVAwdEK~)k2nzY@*sy>8dkMjHknNf*S)TSHNhSH^2%=l|;RCT%x>F zH^^g(nwd5&OgOGoVw^g#Fl)Z^F$eM^KfsjKCl%Wh5rYGCE?KT5m)X^XlP*|UpLUQ- zvt}d_$t{rTK_}S+&f$>EwpPq)t(Y4}+i;--I_yV9K5Llm3COHrT*;F%oSw2kMYd-T zsUe2=`8HaMUSPtDXPbQGsc|vZA1-+=T(fDldQor?ZmcjxhRPFT^jTt8zJs`Mb+&`# zA|14}M_zQDU0t_GL`EhM+e!(52@%)hXO!hbEE;Z4O-O14y@K4EI@pZ9zOQd_&zsYCB#xJS0l0O8hdf@w znCbzj?h@{UAd15m%^)hnH+-i(BK~qw3g4I&Tyk=J5H%@M0Xcx81Jl^eA652USGj-4yrUIw;dyI~~w8bUZpC#raQ#DF4zX8bD)9D43um zQ$~TM*wD~9*a~DgN+Xs}M|tmB`@TOBaT2hE2vwXot9Q-bY*ywb<(_r%U*wIGJE1zXh;dML$*H7mYYs@%WFFcH@38zUkT0ZG#rv> zYQUw+@}8VIi*(Y@SMirGP*e3=l-6i?ubBqqE4UH-#{GpV6WXuTChfoCe%ws1v=Bsr zk+B8|BE^csh6e5BR|6EY*b~{VM?X%=#1NV%1M5dTKt@t#T@e5WUFl1*t%mN1n#}hy z*i)`=a{f`IT`RtaKPhvY%#H7=;|$N?Dh0|LfXSW4j}%tK8wLtXSFr4g8N~^O$a1m{ zvq^-mM37lbM7@AnQH!#8&@}W=9}$QcmjLD|VIw)?TXJ=iY~c)gsDxvAFPhD?g?v%UgO8pgU$hd z{(SoH_;GT2iXVr2yPZZWL}N5g&vwqvsStcSIm0hVSK#OF!R!6K!%ibMa(bNzRp&?c zlXP3jiRPyX+HXvYd!#BZF9#P(!;imI9O^6Dj{FV}ww|7bH#rKW zH*AxHjq0N1QJ~{Eo;rR#5SW2}gV2h(W2H3%ym(c+Qx%umF|n*9jGjY(quZZkeYgQD zp;#oJQCM5!fQ)neu(Wu#E&YK?PDew+dpJCDr@X=wA}tLAmf^q8dJ}PuCIq;FgOu@ zoXOn07rg)B{nm>Q_5js$Jqg`}bf9m73aGx{+F1Y43a&NYWZo;>LH7y3qWb`V#eIP5 z>pl@PyDFkXkJv}k5s`KrTb@3$&fKb?K{QAjxy0X%G}FI~)~-X$M@r082ZfF{X; z$G}U$(=G~$^FETMzDgb1j=qbYZ3&e}rr53Mj>y<<7dI2_9)XzXcF{Dq+ih$Kk%6?& z(m(z0-`~j}YfV>Qw7+SuD-~*&KfAX~vA27l*~dEky?p*0KR3R4v2K6Dw-*~PpTGR4 zjb|@6H^2F2{n-XQ-`x1-`T9Ra>wk>}m>@SBMgOD~$u;F>yKR*M zDIE8Tx|)?}H99Q+ZIX`fPf0+uXQaE%TkE;-yUyz)5^||WrxWzt?Ry1JQlMT_^Kflx zX>BcflidNM-y2}wN|iAOrjB+$n{8ISsFk>0dcr0zNCiII?Cy7V4!b*tue%5E1$bjI z-iyBDw8!o1@2zLL5&PkBk&H5U6h$x+i-u~(E%oyz8KL~f)Ilr4WZH>|*H&bLkQ1 zD#8o*0+_$ODvB1-H73h5{wg|6Dh$cgeVSy(WvYR;0bjI4kd`6j7`sHdxG2 z4wrF`V%M<2Xxv|4lAK%XUt>7H`nSWhoH}imGfgW3a5(M#?M;Snannd9L^wkQkHL`j z7z3Vs{d&={9Fu6}j1#VR?nW33=v8fjoeNkVpsJw=bU}DvT88kJipPZcxZA4edNuPl zv~!xKsD$rL*!&_Xx3tmH#pJ4JkN6Db<102)diHGN<;y2G#nrQo=P#da(D|JV#iSOf zza@b+B>z+xLyRgMT_*4ph_!S)j-%f=gOyb;8cMv-^;b+W!%7}xLoyH%L+2Y(5-D8w zjWV5V{+O0KG+$Zoe7s9O{D0Vv4$t@ZRc}Q9N+&f{nmhaZT{)>oC*2=Uj?Rxy<5xBx z(rgZOxY9WK>Z_<}O^gDO#&(CK6S@cPwtJeEZ^rqJ3?H5}*R7V>_4;@1d}K8t3))X% zKbnoYk;fbnRtE=*8ezFYgIz?R8H4DXal;ylTBD}DJ@N7B`Ptrn_w?7(v(7>bnQ5)hWd=sVcIez+JC<0#k;gK~jUN0Hxv0j$n^1z9kSZCrBkr zxkk+{DF17m!Kaou7m+mX>Nscb(PF!^f`B0Q_q>|s-B1wW ziFgU)sOE#`=0CV4?s61PsSnU-$by`{3Qc zf8Z*vtlu7tU09ZHhYcLeqP3*scy=>zymo=dIB80aS8_`zY)FB}c7fd*0|N?hnfKVJ z0nI*O#!D(po}NTe5hgV2TtS`gN2ovN;d%?4+kPif>eE*~K73UCrxyt!ZaZ496x*SYm#@=d zmiC*CWK!nH?6Uh2nuE%wM(YiA7Pa1YJ30awlV44tBD-gulY_m(owH6Wdb6{C+F^%g zGZIt1O05cUyPp&#CtxDwSm)#fXw$vJpLh26UgN}f4m!|_Pe}n_766wEcpz*(U#dE& zDZ0~|TeSLp-5??flF+DEYBeY}vZFG$NicTPvR*n}SBbR%!MqsF9fXnJZLm9IDR!wy zZoOx%=ydN#++c@{g@xzU+1Vusc-=YN>%1mAXwGk<58I)UO=VY(PT|Kee+Qidafs)j+3?rH-@eLf+N3po><;oGeM>CAUQC1C zPC94jCx_j`qr;AklimRr%_?nKH+0}sLlGZDb{zpc1=Lqba=dx474hevjjcM+b z&XWt#kA}bIJ8LjRgzpGB=7EEEFbb|dKz()ke(3zTci7$8-#>cSJ$rl7*?E1cD21QN zq#e)Un|ypqL2vntSQt?Oqdv`@!`EJGYFI4u)A_OTz78qVRGmR@J9}r{H#@+yI*4i} zk_wE{##2);P|bxO2JZb?Ge+1rwbW50Y;_8|LNpZSWIYJzR1`Y5; z&aV9eoz{MJyTJB@4dru~IDr$;{MG&k|VB-K1y`|+8wa@T5cJLmdH z46GOBc+x}HGu4PV@8?7G@WP@mpRZm3-euqJirii+(^UP9_4UQI z`Q{&=H-A2D|M5lKPKwc;YU3Hj9+B~zRM^jNt@8Uv-Lp82L4LQdDF24q z8TNmYHsrGUDB&hO#`!NtbDCU7YD}8Z)>Dy7@3(nqY{Pd)fBB2%!k<^~O;5A+{)1+> z&1%o7w6QCMIDYS{2sYWMZEtmB+MO?Zh6-eB>-FBp(LYBU(H5%tZ5g;xN+@WhC6~tj zs>dZAe#*xA@Zp*}`*3^_>GeZFs=zb#_X$;1I8ocgW2^-azU|0y7BjcBqj&lEW1(Em ztdxG^^eP$m2ORxtiSA4ZsMoGFjpIZ@Ii{#UZzqZ$U84WQfCH(vjE*0!?qbsGr77Ib zDQZ*D-q}*IC~mPyQG)Z5To_60Mj?Z-A<`(P{dg`QzDpklz=vn-U!?WVgw20Gf`M@U zv{%NoK%Sgte?|rV`W=u;{8p?)6kWgP5c6uvdwpEVz;yv*{}Rl|0y0q8;GWUoS%OcV zFiiFUMOwSvfA5?eHO(r-Hs8UI17{NH>%;s&Qa%|4tzMJ%vHFErlo`CZNlV^6K0Ar^ zX1TTYZj!6?5R;?rr^BoAnvJQZl{?@FJi2)E{PgY7$ysb>G`;>0YB>~Wxb_8g$HrLo z@T+6Hc`0M==&zjK&2#iA$S<2yVa*U`%qv=;phmeJF~C!`?tbU+$FsNHgS}H|VE3)3 z*EwNBw0<<;6+@HZG9OFcaC8uOrz0R@F-Ac^nroYUWq1Y7X2ROyJG$Vm&bzbI zcJ~20Z0&MIhj)0^Jv}G>Tp5|zTN~aZLKwC8qK8KU9C+PA*{pc#XAPGQh5rU@Oru2x zTm{6QtKDfD%~^Y2)v*BRza`aWp>g8#wr#-yD4WUqAh}U*+GuJ5pM=b2m!%HST)ncO=SH3L(WIRYlp+*YWJg!-n_$yeInLs8; z3W~;YtpvSBj`lFk%~avpTHP+IC|)Q&WA_OXot^Ied#8J*(q{~#m(MR$j5TO0qfny8 z5}1_MEG0*|9F%{yNf876f@m__R;@I;@AeK~K5t+t)irF*ZMux2Jh9zNxNCJ(h>#wQ zDfB*&!>TDA(HFA`vl+z-oBL6+5Ne`L`U2^w$$iJOg;7zX`SB<9X9=b7Y_yL7WxT=g zYGj|c7((2ALset9CKFATk%1a zptr+(_@KHEsE6gzs(0SvvKEU}8IuPpl@9BS>VRiY{mlfPxxfdH(ENa-O3z<%0bp^f zELePA0C8$9RAc52+e-Vw0AgO zq?IUhL7wv{YfJ|>LaN63z;PN#P6x|r{oB0cbXGDbT9~RCc12I2rJJI=org#D`ddUy zJEyjImot^Unv;{Q0FTewx`%$s`HjN^eVZmD42an@q(44FKiu_JR5^e_grw0d%Ee~j zJJ2$-WkSX$S{mSQYt6vx0ptA z9QE_mik`P-!gZT*wzXF(z^b~>wBbtj0fuxz4Ygs0cyr7&0|c4y8R&Y=q>i0jSA{18es!$bdnE&Ge-_UqZ%y~gDLT7@g z^9%N9Fu43c+Zv^c5=7(Hie0(hAiq#Vf)E#X&99`bg=KLycrd&_&3*cdr7~3K}^qFhE=!yzdgHn@7q;|>_7P!fSDIT<RR}o!}YOa)J%8FP223ipmuJ*^Yi&|NYe>7N6suA5o-y zJ-NBL4>=c9$8$PNM)d&@*sm+eAxE#76zSz;;OLoA2zV`-@2g^^8D5=rlllFTZWC)A78O5Lhcx?& zsYIr5L5>Zv&+=Ttwc+F9Ixm}NZ=Y@M0zN$4IpzZbw7iWD?N+uUc%n0j!?ur%tI&@^@NpVt%88mzC;s0%6+n7Sp+dOQax z)7a-ZLYa0x!y(Ev^7)QYrmfF+kTPw3zN3_BYe9!8OZZlUJZel2wA$@szaJ1tR8D)f z$iw}v7IVM~b-1u6)|@U`fm8kmwU+VRM|5TgDQ<862JK){T=$iW1sr~Xx2zhWP^rt+ zeR`PQg)iq<0Vc#0dq^NEHRw4)QK>tm5{asQjy{<+Pu1#7OgO9Q>{Jdr+C}Nr=V`e{ zN=1RAvN@=vCtSGVv|pbe3%NKgKuSHo^F>5O_ULCw40u9bv@xslY%zhuyIB$+Yb&TH zr{RDcJ@h^R$F;IRmFI+S&&KPcgPpy@wKYu6bGUQRX)GWHR82h|3^~N06e#nL=`is6 z`0VJX&S4h^u9BIUm%f`0KYh3RcISk1SvjTUc|XSt35Wh$ZVM}!miU>eVBVYpV}uKd z1EWfCJ%n9D$CYt7CAjf<1qJ_O$HUmPFKW=d@DZZvS#g)n5Hj3mS`kA9^^cc<0iMMe zHou!Wc(z%mGz{sARm0S4DhnV2Q9ER#rX9`X8g!I;atLlH5@WrA5Elz`H`9%TLRb6m zu4or|0$eUzUvKRJY!Ci8r%Z>O@379!EX>GQvoetKTZM9|kBfDB{^rfz?jErG-5=m< zH8PeC7&)nOOw*V-KmXQ4IVx}U7GtXd#$!Mze5?gi`*^&P40Tm(yQHOXMLzh%Vgi8B zi1-aeVmgs#6;NFiIU9%tCkhbjHdmCyhER3vfizcoe2{i71R0Vyq3Hv&8~8#eZa>dI zPDVRDlG~hS{deRj!l!HXd*V$_5i@f}^RLv3&OB^p=upd@v@`>4fAK>|c^_Ye-2qx;|LXg zdZ;a@Ij93ysqNye$M<#Y16>G}I1ck$yTYKdI=uQ~YBqQksfD#uC zZ+~2o%q#+=yim}?X&s0_BqG z;^-d^NBTZr)g*I9yb|!26YZ;BHY;>U=%FwwwAfyJ5c(06nO8A&(9GyTRzx*(Zp=i& zW_Gn`*n;;(VY~SJi+&2M2kq$o7Vz<79F)&O#>)n{PsNSSjKa~=X!{1K7+-jVTk+RKf%)8B@}(wB?5VdiQ_-Zf9- z|9R4(#>T%I38M06rqMo0lm5{t9TOC@qyJp>-oY_VA5sxJJR2v&0w8|T{vJ^82vf#B zWSmsd>2O-SKFrIPTwZ2FO`%<61D)0VWu4ZpMWR`MF`PTn;jaY z@v+i|SKW&(Z_{n|F<2Dxi!Z>Gd>&2a9uzqt)vZ{BYWvAhZM2@TwH=GJ^D)p4?aN#N ze*YTuAeKL!b>{w7&evQt8~TP&d{YyERa@|)abq^5lr=!Zt%(N-hQ@~jFjwrftmx`m z4?72J)u3`V`r!wwkxWAoSH4K#-#<9n8)>o_%SAecxSU^Rn zc20iooQOr4W5dJK>sAbc_K$(@J`pJGCjGwq`WRb31uzHbCPkKD1NQ9@SvNKJA4e~qRK$1&dz*pL$2W0mN z^)rX*kB?RuLIN3IL(4nWQ$j-%I<3fn$hqHzGB@5)H>{5%5IQ?W=Y26Zu!_gQhUlQo z-w+nJ?Rx7@qxH@?ic3z`7zQ*`0nd<$?QDSthlQ0DG05nhfe^inEgU#nMUdir?m((v zSu??l28R-kGBgi})s45Yu=xkC$#>h)rn@`F{J~yQfxd^YXx)PD4zhGu?r`&Suj*G8 z2z;?coo`L`S93s{0Yn{JBX-wJ>aBh+i|{77$p%`RNvpr}2C#PL%#HLs8fU}uvRgDQ zgkQISES<|Q?Xq!Q;l|TRTm4rn$?-@1e*MGTMK|Uzx;cN*XCM4%S~k)Q1X{M&BJBAf zCFXNgm>TrU9}DKb3_=m?_8`APAH~cDHuVtbfCc1sp#ZFXrAduiQ?S`*w|+quJiK!mF*%rAY?SAi<%`hIk{|7*C)xVFx_6M%u5O1HsU zRAcw(xTdSyUa(f@m(K2aT~Bw@s?acN>WybsoHD<=nhC1vGbVcH%(S0gVj%Ny(SL3z zs0;|uR8BTQRLeS9#!WIB0ZgdL{(jbQI@Gd05a3 z3%O&i9GJpvPBKqIdS7ZN8{ako3y?p)#i=i-g ztCyHmiND6%GyQz%hUw z(l&I0f{9NNdSoCm`~Jbh3eMj@%qC0Q^e`swyq53PG-Hi4FVV<1^(P9Yo17R;f#E$_ zWEObP`c{7}1Lw#AWRY{!@hfJ6g|SAkKV>X1L&A8jy(pTD^KdBOaOYl{Vmg=^CNQEq z@_9@w@xvsF6PMSl$jgL%%<*sCQ&$-EPgToikOO%-(CEgGnGtyX36!~?#nK{?y0iRT zK@jv5=>%GD?d}~0q2K4G=y(vjx%AOm)!E&{2%H0^E%t{moc2x_HJ#4Roew3~pFP`| zg;!y86RKAo+;D$1_AXwi&pS|~>1@IZybLZbn;;0?G@U^lP&7`p;7?ElwJ#Tek`N35 ztmB(75<{wW;uU*#0IfD{FAjr|f8xiOFogAS%Dxnpr5IZ5P>PPJxCtiyAQ8R+in$^U zsW`<`AaDvp=}{`cAWY}XHW2hEZvfP(IMV>B4+~!C2{B z$RvubIjaRfnFm^s78ZgZC6?7&n55Bg-ybcV5GmRB_#WUF)RTzR6V)dJK#kc_3H>Wh!ys?(aayLN6pA#uu{*j960p+*DEJ`QFj@RLyhFo;Ec!3Yz6*5x6t- zQqOGQ);EFQ`sIMV^wJ19s^ptDz+VO9u>l_+*&FyZprEE1SU9S}BpwA!M}%)K0?ZCTo`NLg!2qFSR(6RG@!$iN)xRx&w$ZFE+oCtUhciUb#5<-k?~ovEH1v$U>0P}XeoP9+CeIj zzjQKM5!ZZ18}dST-pI&%W*DBLo^W$vbDp!Ol?F)|9OrU13x-6~(r6aVl8rX;k-b5* zYNZ7vn}j{dk0(KhRu_j;bwNXexXn z^Yk3Z3}Ln=H1~Ve71L}&vD-J>P+pZ1QFs<$0xDx;mg^mtJW$o}EHIE!?#K;Xls9uZ zS(OWW`__gxT=u;U-^|%i=U%m8o2s1XjZWQZ)P^T-?c+6d)$`Qq*Uy$6eC zmShr)zMHGfGas?l*dKcsZaF8Z1{$Le${D=M!a-htW^Z)gXIqFb(w}F7Csq;(0fY!5-XcYmsfNsf)}f2`d2kHP z5XikMC$>J#c@<GypyQ^<&r4fcCgbBX~l!G?cm6WKE)H(pejnX5N&7F?!_|sDON4>p7 zm}~nc_5gu2wK=%-bUs|B=GB>i0Z=}=A2e7s|ImTqlTuhHSYn}>9}ZN>5+zO8WxSzx zeIX{asfyz5*oyL2Yz_CIc;JnL|MS^i;ZJ5vwm=Y$ckRch0|fp#z~@n{AO&(dZ>Ini zyrAYK=5JE6;gjQj@5Aaixbig|l!guMdq!j9MJcI;(tm=Pq6P_5{_DLHO4qCbS91YJ(*n5BvYZ%0VOB`X>u@%zn4ohtEr&x5=g# zvjI6Q(+tf&KWBo#FIYdbm<-Oz@9x{(|2aN&-*->Z57>FR<7_PbF!V=w>UiCyz+K(? zq~X--7Vs;LlRK8>1{0T)M>v!f;Tf!8p0Jt?al>Iln*EVcGfFTOP$(v(995hSZW<%o zP1O4)5WTO1BuMd~#6H1;C>YYsQ)aH=zVG#WXLSYb)t5v!{VKLi*FD7u4930}tF0?7 zusiF8THu5d1mE{ZoM>o0wj)8yx9%Iv9M(JPow3cyPNb?f%KE zT|j*6OCn4LfK5g|R}fzcnXTUZE-gX7j`#7Md+_dP54wq)zU%6M*$vi`G5bu2OElsn zV_2*6Nym-cEwgiljA_}8bn(p8mmLE@b{TxVFuR!g6FG)jkQr-D7dy?W*K4jhocj1= zF=xcZyZ~exc1ZfDraqEg&8GDRT4J@W6^!yI?6?<{sXJMq8gj+NhfVB!c2QQ1j|fKB zl?#VD#aB&|@>N9Cq8Ri3P4{--)0USbS&O2y*90#ms${q+!1583G6N0`0ZTWt+=dbn zo~jV<-lJLCy`7RZxE1BhqQS&nuWjoD&X*&?Q7Yfpa2$n zIc_r|;3wjJ_565SKW(gcI`!+F>qO6xSA?b{zQlL;)$x1u#yNevd+45=_Kr_`XTQUK zwA=4PA4=X@=w05@tM1|PZ-p(Dyj{4ZH@(+y@-0}NE)2Pc28TJwmZu9tE~3lhP~^0` zdx#k#^Y9DaDAP65gFJY~4hCCWf7@t3yU#>@+k54n?VXU7Sr?Ez?sxYAf7|1Q$&&}t zJ9=#e4$mI}de{AJw|8d8o?bn$jl*95tb3G$&mKPzb{GD<%7Lb*4}{$R{m4Z_;~a4D z;t}AV?!Di)!p9d6gn!UGqQUFr8jx=usfG2z7S~{~l2yQRG46;`Xx534Qz2hSmJ1>(U zSOzZUeGUuus7GD0JiRAm;hsXNM4L|j;XUCBqVFGf`@jy)-0lb1&t(ht*Y|7-gu(Z{ z!!G&hpSf?khZ%|TuNH3OH=suMG-Gh=`+dOdAOF@z_1xL61}%GhZ=lcf0H5C**iU(2 zKiwag+p&OiJNE|IY3Jc}C|F^+I*V)M7(6AW@poVBhp~^ERc{R* z+(sLIwl+8MZ|C{5w)z)-HaE65+TV3Hw$?Y=>z(zDXWzk}jpxt4bK2j1g`XK-wm8mr z7lAjKdeJy4C^zpt>r7kz{Wtkx&L?}(^ezrAE>ovIXgKTb_TQS$YtdonG#W-@Z@J~{ zq5&2bOVBhLV~7pWE5&)2aQna@agt~j(}mm6N8`YY=o+)ilZ~F|yz1|-Ch6VScg7%U zg$bJXc&Rh+Lg(B^NTX;L4u#d#Au!*gewXZ|u^lWRu8*OisXqut!GIEm0%CL}4DC*) z;{aV*reiNfn+)!z1uHKcjAww=&&)ohb@@_x=3@Xc{ZWz*;goGWyGzzEVJY@8|0cbg z`ib#4xPaX{Uo?pZSALp*9z=uGC?5LhS}?+A!joP2$h-ysUaasHJU&mbzS zHt~mnSM;{9Lo~n@ao3Tsf`b7s1eT4Xm<(bUfE6{t)lw6lYI~Rd;0iVP81bFiNw$QS zg8=LLU>U)nF6VdN*|21ZZu;VKrP3xGN|8S{ls8(Bx^U*| zh?`=F8F6jEbJS%gx}(Sm{R?J?o8j67&H(4T)eg1+jK>3Z!9q_bK3zIHY|RQNX%wlU z)%}EHDeO0*5aukjl{z=b%Wiz~q-$kYFu~CIS-o$`t{z1by9rwEIkgF(v+j^<6CvC# zM3Jm02~EIHfbp-D zoE@St;i3D()5{&pP<2=tBX%cNp>2bb5cf~_-k1Sq@lFb#(*;-LB(uS#Ah|8#Q@b!= zsNU2`_w=o;DSYnG)$bVHy@nVxhgodJ{&JEz|Bx%EAKsY&csQgqYT2;sR19Z|^La3c zVm41BeO7}=nFQys|Fd<^*ac=OFhSJ2biQk{UNr@MsV^`UeVn1mWi%TPVU1%b_X|HY zVPM&o(;Hz~n5Sbu1uC4AwK0evL5fQR)jTj=W45S*BuA5wq1q~rK1#7ifrE8#2QEb- zjm(&_oPw*Jd<6Z>0r(y8H*`{&p&2xD6pRwGmB!VYpsPJhAGY2EM9-P{9@@i?W@CiG zsG9N>jAB)anS#(}4%uTw-H|+&L7aG3J~CU7#z>e0W`q;92@sZn?a_*dnin%3579Xe zop(pQ4^5nvY*I32jWq;fgaW#a)CEPTY8R$UQ*0gjhJcm5g#7Kei8yxK8F?W5f%NDP zyjembBC#-lo}NzY=IhiK?HzN;K?Ucgk?mSPN`@1YHYxuPf+E@#AY1AnyKp}KSrVyl_*SnJGb z@7R@LUFwK*gT=qdcEd_lMJ3IYMVW#ovK4vXg2|56Ie;t5V|xQGlJLS`I1e(7ee(EY zujWDilBtRd=7P*DoXnpI8lko1TJu2UD{FHj%Tv7Cx$o>KPHJ=}H!RP=^9)7*bY-sKfF2apMA<^5Uj533xXJnq$+442s2RsCg0MX z6yG;6Iy=JSDIv1CAs=W2i38m-0RJ@=|~ZBj6g(HCT-EgoqJ5N?@wsuiDRA@)OChTr__?Q!I+CW-sYqP zp=f11=6P!BwzmyE9|)V`tjg-kWQ_4xC1;@UXuuH=mdYg>YWWP_=ldzpWM4T<&(%5& zMEO8UmGUL_IvjTrG80u8|Q@Zj8nZBdMK2T5j8Y-XC>1(C)6U{NeHxmKi6@Y$0|=Dk+v~S4U|}FFK8Bw}5OO0h9<=s! z$Jwwgzm?ThhRpIG?PXhci;~S#`-L-v+PiKynp-xnRK5i z*hx_qh07^%aA1+n+uc1Oe^_M;DO#u=j#4~badh!?#ZkpmAqFw^yR*VRH0eVoP_PNd zg@G>q~adyF01JV@2?6%6! zdLlqVF!AC$DPs>joc-sh_vN7!hR*-aV0eEOM|g|?Q?xy;`<>}&0J!z=MWdw zAzt)27%{Hr41=K}47JScIkH1CWzsx?L%oya=lTmR(6ugz>D0mM<(PQyqybiH5@{O@lIC8#@ ztx1^*VU|QBzjxj$<(*C%{hdh|BWAE9OL_QTkQbe|XYcT$n?j%t_$@d0)3~|0X$7mv zAojgUD~d1BKLZ87i`Y9~D_1dbIdGEBDk>@2$u0~Aw6-$2505#{j=W`(*WtxRBV3+@ zlVI%sgZ`+RLMd(HOa6`-3CvY|k`Vtypx7wO!^^Q|$H6*RZZw_#@!qfQ{_E4-xB49| zE3T^^wSBX+x8Y!VSI2&~@E7AvjzCi?ee?p2Y<{4$h4wjw1>o2_-h16UfN24p#qte< zeAFBQD``x9U9lNIQR^4Zmf$3_hl?&>K4vHFV3KIXW|Wx`)jD74kj>RFaR`*dqtD|hsD&2OG;P=3=TTd-YAH z{n|Y|g-U-=6DZ$jk8utt)$@5EpucaTi4U)xPOI(IJ8#d|EQyS**FbWF>;VInoFa$d#D1zd2on8@M3T5SBJ7^LfJzoooDUna^k=| z&G8Vb1@i%!$oD1#KItB57L^KZ#3ke=S!1xcODvhg(easc45wk@>Z>mu83jhRhIVzj z-SeDY;d~YBgNvo|-NA=Bl@CfPpUrDHt6DyP+S?Y&zIOYk+Qz1^X4~Vv51WExJDhEs zMa~*}AFzqCJ`f7_?jsuIRS%1+0;=V8u`flH&wlG2?S3e)&&tdJ;bLOkDsZS^F|aux zDo=v;w$g$&cI(d=pHQ3T&x#utm8vw4Wku`EF7?h?Z#{ecDgfC(osCAVR?D`I(IA`d zr|>e8*#n^AYmzH#O+{O5psedfm5h}t1oF zL4uJYX&2g@0GHf<^|x{;?N#92zR#f z+)W_bZs%B;Xd7M`gUxHq?|!>o+W&T25Fo#xv)1QRM>JDN9@Y@irxFJ!6LP=$N>f~~ z1aS`b_j~#EhEE^5-2TK4=K9m?cDp~d*E^j@;~^5Fd+?_7LI^-C!Y-VZD9pbD$E0ae z1;&1#!`P=xHBO&F@(Uo?eJo0GTra|Ly*iHTb{yB|;kdqC4gNDb{AcsvKdT78Q$*zX zRPI!4V!en)^NF;+{nyxyt7MvQ7h1`X%E$4}BTVAPf`ns;=U4r)%I@ZMuwC|~amBDn7Y|a`dCrkG3PZGfW z36X~a>+0sZ83h{|4r7J`ylEjXFT_GEF#i^%yWiVwI`sh=1*Q##l2s?H8gNpVcGP9Z zdY3)38mozVb|t68oNrV5?Q`zE^Dn-me;_NSTy<@EOZ3*a^QIU@px-P8x>I79ohQ#y zxlUTsc7F_lPiS;VK$?t#!RrQlqMtTw>>VR5@@ ziGsS3NX~j>XvT`GN64NNC0h$rOA}Es9m>L8Ijgyl;#NlFW~v+?YCyR-FO zdmY|)zQup~8b3c&i~Y2eFV}ev%La}Qq4T@v#Q~JChKKs$v7$r$P!=3&saC7O!k3Xs zOw$B-y|e_+qBvy<5u<3FhzA%?Uwn?_)7TfElG(Y4+996YB}-^)038{Rc}6RTzr!QQ zkjxmDSecf1!$awqPp1j7+x%l<#jq058)X2}YC#FAEy}nmEZ(4~uuJhh_WdyMhxQT} znA%MvH)Qx*%isY9$uUY?Oax~ygh`Fic@=#a*#QF6HrdO9IOFcWJ2~ura1U^oo>%D2 z?%~1QLhp`#Jv#pFsGyu0Y zy0#ZPL3@@2gWQ)DVhtTe(ba5PR_^x=koQ~{CPVDGt~VaLF6{IlYv|v7(05OE&)(EN zp-2eZ*(3Y_98Ar_lTthy)TO02yM6cU%_&HaeZc?HOT09V>p00_>(m7U_ss1b zyL-p)j$lu=)G-qfvT8_{@_MxDj`M(cY}+QvJ|e(#zUT0! z&w`&H_WEzS`xzLD+N`{38kIy)bEAfMY%7j2$}PoDyL<1=;vycn+c7H0P~?R*)(dK^ zn>A!SZKHyGZdPE?`Hj-_&|1<4J9}YP5dq4L3gU6DIK{#@3)4dzGBBkqnCKJI4A*T` zz(+KjWb$N8FO2@Y!GMQn#XQ10+;cxpk{v!s*OO#NP@fJ=lw);ggFOmC{Mgy#pJx-n zXLg=7};`bX?hpNJI@=B&QVE_;LfLy$X0*gYKN8xm&7w+Qz(SS(iFY|1v4q8 zzKoBSo6g5&ARzo*2I4J$Y7_z*&BkL14Zkpm2qj-frniN{34CFhYxVZ!b3y`>pduD5 z{2qP^hGU=pMmJuNYN#nmfdMsa<2v6zdPcA*n=OL!uDxLFoin&x3c!yToD2V=qYF0l z*kjJ{e8kbl1Exs?b_qm%Z93G`CVB2)!1cyYFAsWhy!lP@O-6wt(^dYxqh zUS&WVP0>b-@{ha2FC+M2n5bUYvEYC>0t~AL??rOsO^q&qRNsfEMkY=2-4=jxz(nto zAjGJJv$P>{6T_)MA%#&&^j|d0J5TZ1b{x@FtW-)AhCvx61W!w_B^%Mr z)>oih9`=L9JEeP>Zsv2qq`^rr2?hvA;#_aQasAS}4x%`B zqZx&Mu8Si1y6EFzg6pd`PKN%qv${7BR}fLmI)WQ~b|i0|L{mSkLnT-lm;QLXgH9Fj zIUT|}*-;DjPP!!_e4v6K$7Y2F-|-Pxlb6BG3{x>pW+8>xtV?|(oV{Ksu}O?dA8%Vj zA5|Y1Ry1`29S7++2+bKjh5^ayH85U@G4lMz&YaZO zUK~VlqQEuBZ4V5dAgA*ny>*$zkDoM|9YQ>tVt8N7l;vsp+Da=Bre|U2~b|`Oxws z<|=WqQ7}$fcvj+ZBIxV65C1SZw==+S)G$4gh}4A~LXbLmc}KBsV}FE7I%jz}TE+=A z!8p9|R|KOKlYqxY`N&pPhL}berGpI_`9nU$MVgg(q1;ih)W;K~=`;#(Gan@w@4V?m zFmI5hh-#_@0IP@h4$BzMbXm9G5pSL4WwjE65w@Kx?}1`MtN8v$K0Ry!j)4n-m(&JH8IPTB4K+9bt5WI$l!i3(rT-13=# zy9JD}$E7MX>%eG6EhD4=^(>or^^BU07S+t#ONlrj@y5mP*$;RHAl7HR|-7I&^~5??LL7ur86`97k1mQvY_akAR<> z&114P&?6ZEVKW|M@)u<}Wj0W9`Mmbi%uvLs2gz(|7*heGOJ@za>vHoGHp~B6JD82f zwHM~)jIEcoH{N)p7sV?YW(l@W@5(+K;b5axyR#%ht8f;hoy;t5uqy* z`Y8Qc8qa`Ltd0=!C>oEWo0bA>97R`&gOR(LjW1N8JuY-+;V>G|dIv1xMT<^Mr3a(Rha=ko>2VK96%IFPtS`T4x7sLbyl5{s=5O@~r-`>CO$Q+`gKgwWlPPI8W0$iN z>wfld+y1>b$Ftp!~r_cNsrtV6adPwG%<*aGxo3jvEt7Rg5+<$ zGa;Ln8zRH!$W3cp{W}B3WN}?aN{+~3_Y9Y!D(Isx{NxhiD zv}f)=E6kT>W##II{C~2=q$#`=dIGS5x|u5j>vBD3ztgms;WSJ|3nPkC4|&QbRCHk9 zhvY^U#di%9L=$!{q$sB(zBO7V9LgOf!SH3&AT0|@vRQq+p049$G$6=aU}$O=64$|m zL0LjBgPAGw7Ae%qCa*@ve9j$Nyh#C!Tg(whtBJ>(B3PO!l@*rwJk|IaA1A|p${2NO zL7jIc$nq(|rx+|7nDszEfmuYx)7hH&jg@m)DUWXV^zF)KhlrJ3HyKB1!cDUP7ZlYA z5&AF{Pn5+?-v{2{(ns?xu^L>LEX-X#rS%aL9Yvu$80wE*zR8egUVk%XRcvoEbXXDv zo%>{HVOG3L5N7a@!? ziZkwIuvzx7z#>u(qk)i#wJIgrimKCD8Ip&igx#Hsj4X5yG)RX5Q_*Y$SW-59Er&Eh zp@vuHumWp2!ExfjXKt=43Smv^L{fiCl}`hgvH1^&W10Lsk+^aalltnkOScH|a9OX5!vDJW`gnz27- znL1&k^v;uLJWCl(Z2Ob|7bH-$4$v&S)DKvAa5F?}PM$_;NJ;H5%gT)8!|@EHu~nw% znZTf&BdMbB;`=fq8(TVb5=)BF)4va4XL&|fWI zWgyh@OZkOW&Su1NoyVI|vdyHqdAy4ed@fM6Tot&Ak!1mF>$Y5PeAG-kKQ1ePmOp)( zx2{-rIs19fTqy7oq&v{JGgs2;kGzf%^_0Yy?ZrcGVeJMY#VRIw%M7U&OW~j=o zFaMaV{g^D{9b--&YD&SZ(Xhz`Qjb*55|pb%c6Py=$DL)&z`m@nRJ7MEzBJA+j(bco z1@_WoPq9auUXL@i%BNK}rA+y3v8iJ>k%s zEEj2MBZ;LEQEyILc-k&Fq_T5(#Z3xJjypZIft=?2kr1%`!9@x<)bD zW&d>K=oFY6O1YO1d^^B-B)YJm<_awAAioxBnUSx7pM0V1=z8(O<8l$AndPtqG!H=* zEZZBK_@(I`8rW8zUgYPZ&M&kEqjWrEP3CNEuAT=e+N8OZb8=%{`A%A6%x8(_1;~<^ ztyLbGdcDp+W0pDeq&|Qj?o{1wI4@tqslMU-%TbGAkwznb-9PbCIBmpO3{HD%@ON#R zCTlCq^o%#EojtH9a87h)Y~inZjcTo|tgV=54tA;~E(b*#@X4i?c6K=6La|?MR5Oe& zpJ+EZE}?7Va?_|x6VC6qp$8~h!9n7xUL#(;2JMh3@Io6t-86G8$@1EAPD7hhq`$Ck z7Yv26=1El`cOkq`*tcO+fu5?{Q+^LAUKd#@%BO}G;>JorH>ppboE4|jUeChlUQY^& zlRH(exHuxB<4KH{q)?16b<@uZz$%@Y(`{z0lw($83Q?66Fc>;7z(lqn2`vAz?2P@3 zApOOuGhGWMkey}5cf4Z(rAxf=?(z}JRIgYvOhD|K2wGL~!U4mjb(~kWk@>JNf=?}}2CMLlI0@Eg+7FfrF9-pzMrE5E*)&<@ zgf(_mC#Uu|^Bj&u&A9NYkrf3MY>gujnClJO4bLL?QQ0gY6CWI6I0w|@8d>tZaQbfV z;I#X?wem-@(ptf~FY2w8#vh@@pvQU&$DX3qpwMN>1`WLxbzuBA+Rrw>#sB*nKP=pFr5Jz|;@ukK51v0# zkUxM_66FsAqb~ix4ZoeAPwwDkAGR)EE-i_;rYmYpUG=^wE1*Y>UvbFtbNjzl+?l)n zN$_P1VDLrO|N66yO*8)IM(6qSZ|nct`p>O@o|}T--C}qac~Ls`t+d)yj2 zQRJU8fY%yOfD5C}q;Q1X{wP7U57PSv8 zw1BMGN=*b_e*(Z{5cY=iGyc+Z4^_;;VNC~;Pxk_S!5aW?JdOr+XxqpkL9cn-YAYT` z(OVu>YoTT^EOH_h*S|M*0gWe+8TRL!srW6BzB}Z2L_3usACz7sM?s4h*L?NsOT_G%j zfi>l(R@$O!J0q{?r=19vVb${T@E(@rDbLl|l2zs`FS=Lr6KyI`MsS!;O+I;mlMuM# z`>_g>2fJ=v+j0UXl)0Veajt)DJyT76;!g&XY27-j6@X2r6!)Tm1+ACY82N8@p^up^=4ATv}bC|-bMxN;j@G@X?Q{^(ucBI8ODaZZ6nV7ap2brVcO zZXF~j6qTy;&NZ;WQv|m95`MY*_KZL3E9a$=6N>}PS6R4GB<1``B=26PY6G0^4M{te z91Y7nNvF^TMnIcpuM)IKcmj{Gd6yAbO+q4Dcv82u(IANFG}l&1X-oShr8AVW6dzgY zG+?}ui;-TCAHXbJeR(yaD(vCE{*{l?0Civ@xtzC})rQf;gMFl=A{=7UXb_EaRmF>j z)w6tCN8Q$_eY2CP>5BNVmDS3$b2PN@%N;X5{Um$9n4Nv1{mkasM#l>MiA3LX$?v_< zFy@T4G@Q10ms@6CYo^wWc8^Vrkx7iv;}B!&`|&+#A*)s-#b;A?c@S;3if78!f8kWw zDxND_|CW7AR| zBc0qG!Uy-rzmWp0R#JHTWS!Gq(*iAi9hblMMlKKaSXhLjsm&`S&MRd=PKN|Us@CwK12?rFd4p7i#e+VL^wY(m-6u)1fvh zpqH&ptD;cBN0!WEw17&g01Y}j1Vkn$0Pc<~$O)c4)wGVln)t36vp;yYQur@%n{hDx z2yEmN6yl$Z0%Q@0?z8UO-4CC(HSj?QBbz<4vIPDj&kXnroeju0z!Omjr&0YFeA>1O zs%-76CzftOsc;D3cTsrZ;;7(3Ja=q!$pDliElY=|=Kw~*k;m@3UTMcuDiJK2}abvda`I8#1J*1?Ok!IUw z*H_P<8libg*4;ll?e4y{A;8&F#+nRm3IB_3lBSMaZ5ly*Z*F--y+OTO18S_kOkIP! zSfo6KROgte*`cM6mo>WT16rqQWf)n0A;>a8t5AV5uzD$O|I3_A*%u_TE>>XDM=c zy;e_x1{^++H?W!4ux~!!3lMhxZ;GU5bvA8`~D@XRF z#9gV_zDmySaFGA8wUQJpEfP`dfamH<_(iv5tMbAbN!Nhy;?_)*BDjr4!2-}qZ7-Fx z;CEqwhHUOWc|9KV_x+JK8>e+%*}7<)>Kynn7}Ig`Z^D>rush(IV~n0fOwpE^wU&A0 z`j6&axk6*b03^@gJ}de{GN2-bOCwXhiDRQ~z>xI@W}u&W!$Hd*?D*+#RHXDbvHnJR z!P?7d{Bmd2TsKs0oV~QQkK)$hn~&FH*?(Vt5&Q3Ud$axA^#53IZ+)}>{;S!4|Jyi! z6y7O*^Zs~%|JQxpKj!&=Y;10BnEoH_XY1eA|2O}SIsPAN8sQ@U59f^1I3*Oj7M<}& zl+|#B%2Egzoby3?r=tA=3tXn@GA;9))})b}sunKBD=-XxFhure(I^K~6r9>r(HFtcR_AiNZPOSTnzXX%Y7UM(#t zR?yREI>Rg)ykcFNyP7^JbQz{KqB(qE+#xyu8<;Q)V*Bm2&FMqLNl}duZZ5HhhNH(7 ztmhUs0p~fbMd9bsCMOR{YiByrFarUQ0e+N=yWye|9@0)Y9 z!%%-nJOg=VDEkm+nH*A?DF?IfZ97k%=rmh>c?-vC%y{~J(KzNt?;wgNUdpWw)YQ&R zr>0F!f;$NkvQMkc8EbvA0+|ryH9Jn)QL7{D{MAJvW;rH_z$Y$xZ;>cbXLkMg(X=yX zRc}X`b(ZFrbvw$gN5!Cp%!~q6WyWfAo<4=S`1I-R$ee_?Bcl4yOFbNJ!o)V5x1&;X zHZnq^oVo+pGT_@IZW#*qxbQGatBbsh93{voxM{WeGU=&Xzxz4scWyj?8yJTD+|uk8 zt*{reU(0(0R5#UEP4T(y037+5Q5|dsB40^niYNIbIho;C_JYkXX{nDi!zfpG*;mwH zZ7+RUlQ@PW#cZN*hH0cuLkiB@J2^Q$K09{L_D=MeKUsI}UUfS2;Wi?Qfr0-19QfVU zw!P_h`xTm=4XZT0|N69~Wo}5oycIJ7@_~bAKXv}LF4;Y9PtItEB+8-XmIgVfoI*ruWpC-g72Pz-WXKB@`NpqGdnfNVb8#7jc{MkmH7$&Vf<-#S8Qy@cgn2+S!=+*a#!^Tl z4N|N?GEDO_#wm?7ih8;=ucupc5Zuc9v$c|~d-irK?+um#EA8;of|h3YvoI^MEVC`3 zGE1`iS&-$}R8@sj_&@vQI(}!AUYq7H^niUJ%RoDOl(f1C!yQij^ zg7B}=W65M{sxN2kU~jU`6h(Pu4kmkERGBjq%A6Tf=FALb&WtN_X47i=6ZJizQKDhd zzAvC`DYSPhbWmDcDZ^u*SJt{HdXiGr2bsBHTz21^6sSK`vej70+I-zhrY)(^{_rBM z);txgJ+l7g%PU|Cbs0sf_UdYkZ^{~CHZ9(ttDcDjY;Kf&&*RZjB{OEx7Cusf#0V?pg$$A(*&5k2MOKA7zN=NXK+Y_W z^%P=-LsTf}3ZvqjRk0$_s`u==V9Sl)n}%;?Uclv&k718*6?EAcsl~>*)X-#HoO8X2 z&0?ndp*dgvZER=oR5|!h6n+)y)R+c^7RFyhG*%if6@aC|-O~NyGv}gyw<>R)lkAaPd?8Pa_LcZP#szwHfv`2IG2R+%t zL{Pvm6i`{MI#aF4xKm9FLIeeOptZHU1v_SUrBqYy^zyEP{dx|-Fi5Vnlvs;{K*|gz zm>blmXd@1ZLKbU#VC`92+r`_Fd2zkbCL z-{1?$f6q6bwYNn6ug?0$vv2a>H~FuMAJ7|r4D8Su%|agiQ%qINGRae;j;1_3(D6 zq9+k<&&Jc>BJ>Qfqd{nE>3T9jKYentSzB{L9|Y|oDZ8&HX_R{7ya&+Gzb0#TUWJ@^ zV2j6W<<_(^Ov9!o^x-!C$)y)VV^A`|pc_2uBVgoB8%+mfH3L`J>k{$@dZa`(Kd>EN zC=buxukRnfdv(~Yrww);k~UiDHEh-c=c&WL%<$Wq(_#Fe)oz$jUY)JK?RWR;=KutL zwXpmOl}8};`V5X1TbnMt?Z`ZdP=KCqtmE@Pq`m~}k794&ynN|wtT&tn`v89>23h<2 z-M!wg-NX02BX`~1>mKg)-u1C3_0(B))}L>5SS=KFLOe{lbUVA>eUBOu2}OJA)Yf3I z*TUI&T$7QI&?92!5q}WgJMOF}SN)?mqPb`(N4g4!xlBuW5RAtOa5<$2uf*LDLpjd@ zVoTnfPlEH0o1e7H_U!HwU$#FvJI>zOq5Et1^eB7W!N>TBk}+q`*R|(pqLRJaz;_fB zSvDs<$?^wbB^U$aMRhV?SZM&LrnAX1BsZNWSYN+6)qTLUt4|7;8b-eb>17{)Vh;8i zhpr*ru(&R*b~L>Z@mJL&_^`}p_RYyQ5*?IaDfUV#wk>TYFEcD%zUjOme zwz9MzruZ>0Byh3Q zIRgX5%ywAc(Os zp6g!+(JXNgrIuonl=(AX$UDUnTcNpb%(-5ugXLXds5TlhL@M-ecqht6MOp@Zfk9D+ z!IBBj+9ze=W*P0Wway%PaY3xj+trO-iH=tvK74S($U)67j4epB!)@e4Q0v?~hoPT% zS8(ui5_Wcr#6}jRbmn@c(7)62G81c~}5eyn><0USWIM;;en%qGCd z65@D%cpb!1h!4!G6LBag>|5xHam4*8WF`+k1;7yX=N$voNoEce7xr0xjJX0o zyJqL*HA9s}4+4m{ZNIV+o4;bBG;xoFlbQ2Gl+(oAV2qP5Jw9J`>jI9xBDFI)2muOa zg%@QYG{6vZ-wP%Wl5X9S_(r{6lZ-%@{AB%f9Vjv_y+b{ZDz3lg0K;ssoft#!pX7=epQru9wE76gT5T$oIXMFfEJ6X8c= zylBC%eBfz^|Dz3qkBTxl7$(lSpWgU>s6Y~1%n-I1Z*VE*jo|c_I!7(%ZOi%1OOq&+v8Z0Gt&MKu z)fXE4)9%q3i6#YkxYVob^88yy zN-gQhK}R?v-3&hpO2aUVOcM*2QBCQ!V0I>!n5j`FC_I7+4f=Mp`?gzAk0xj$vgaZh zvZICEPI;-^cB&mNBFpiD*pC0g7I{YASc!YRAW3F^vi7(3b4x^~9r9Oz`C&35PQ+q1 zRI3&HUs^%^QSJ{>O)1ESp^~_`${Zn~XM^coJ)1;wL^!{kJA}$C{al=-&t@A^HA`Qnm*NoU zM5$!zV;eX>Bmzr-V^nO--e)oGnr=TTr!cHn^*aEldNnOSl4vB?WUXF~@=)7Djh z6y@Y7r~G}W&SNCfA)|og3`r7@rSg)Dy`|cQU5$}6L@*pA0A4OSXzj)1YIdNnn8m|1To7nE{gONTk*`D;fBz7Bwz^vGo-Mr*ETP~ujhfK zJ6Xx|A#~#rk}i}TPjN}w&!)Myvx8|~!YHscuPWJjq4VMGp-`HT;{E0_7+k{Mune+? zOzy$dB|;1oK(NUG7OS&&^3EC1#eJY%mMSp@(r5~&nTtD{LaapdMc3X-R;Ou-xui!BUzr8Bnmt&!-)PYo9&G7%1ozB z9)e5-sXTOGfWm3_?A@sd6_r!1aJz4ZSxgIs7d|Q=B}D-Fw-1R3k^*W6^3@#lT7wheo)S# z+jEqp-oI@+@87y_yJy`~eoM|US28hO_`JyrKNa8Vjl#Hc&hz$qr`^e5u`AO=jUk38 zDUY)luQGB7zH;@h@~4f$WqNtjLPi0jh1s`>2>BVUALZHUtCD=cTUpLpS#H!CIY~gn z=z7v3hk+J+xOUk{GcJl4ijjXfin@!lj&Cszi{dZlYSx2n_F5Uo7wm_Q%c4EOwU+gQ zue`503>g9@>h}21g<875J+IVZ;wo8>1(PZ1GAoj8memN0Tq|n^zkOZ0X6;v)5~HMr zQBm*?6|v>~CHv$)HtSGZRPnQDgs&$hH{jQk{Eh1Oc|GL<7}nWl00(5T8#IcvgW7KY zEB{fB4|RPHBs~_}2q&AMJ5L?@662SK(hyVilO6mL55i^_=W|YURRwurnvZf6Ej*Z>FmB8E92Ggs4!^F3 zF^|Sb-P8T!qr=~uPE8ai3m|`3Qx99iV)X|s!af~;?D2>s z5)IONphi}QKTq6803f1?fdE{ZjI>RsLoDKFokL*x!8l6bAUL#HTofZ)cwDcUINYZ% z240o+9o8UnaWP}&TAV!k-osjMEH5UC@R==8r%7(d{R^WGEia1uHCv5{yI7ZBpX?lo zd*RLr&p-ZY*c+r@DnEBg&6X(fv$6HtS1|3^X1HSwbd|+v6$6&CM6)0Z^m>gs;s9g# z?N6<%{#a3!kaQy z=qeZ$Uf2fHsYOwjkK;*~XiaAjrVlp;DTz;%zu`soyLrc(Q+rGtIZEnCi0nd^;TiC1RL)VpAm>Gc$Rr3#25;EET0LUl{;Q|r`}i!0QGSajdQyhJvZ*_*LVjr#lFP81scaEQ z+3kcfbc>{LHf|xLgXkCGbY=vUg}5DZoQ&NR@xF4#_H~U>Y^*A8`1V)fRTk+ZH)Be) z5vkjSin(G4uS+9jXSN=S9mqY+KA(aqr|^|7`cH+y7*tn09%Im6N>j%A4N|)0H>Bxkmt%-@Yh`I_o%rO4NY(+7^WR ze&!DxjVdw&-pKm#Dl|_!p=D|ax|Pq3!IZ5%Qc3d~kLMgdf1no-i)byIa*?*|%F;m8 zhxlU#%B>Hh+4FP|h_}QlG zSTxU8&Dubjva*0pFip;ocUySQ0(5#J-3E2XTK>ABGDj88!|dni$n$@G9H~H?P9X|8 zqJu<+AM3)j1)&sj;j#$(Cct~pH)jBsb!qh_?6e5i#+LJw(Fn57adQT8$^xoOgL?ijtuqg4BcqnRYamk>e#SIR^3x#gI>av>M;>rdkX(15jLQ76z%y zB#(w3yj`V4=@y08c!x0U3}i$L5d{^*SUMl~yYEp1a?wEYQ84F-o!!b+bf^n!JB-W!mov1Q`;44%U1Q;*m~-R`i`aCycwaG2bH>rveqgh7J0muc*UiN}K{nY*!^Q&sn4+BiU9 z>!tpLE2XnNq3I|~M1#KI9-URpo5HEfb>dIlX&M`v2x}2V6{5ViS!`lY%C>(KIa2_@ z`UM+;U2{^1PnqCQ7(ceM9jD;}LL3^7K5^zR!Y_vryma+g7Ty=x_3(_x=(_aK+ZK*J zq&P?ap3w1cy~%X!w~BNxFf=#85S37-{#UYa%;WJ9gPMI(eGmP3l1SeU9`wKyaEg6~ zv^Ur22n-#Zr{I?5K)_(H1=>(&-C2>Q9xR2+_QENxG)?%|NM`Ugbn1_wQKyK1kFTa; zU@Le8R8gs0N0;3t`F349O=!|0EdSA7R?PZoPFr3iTmWJD{c1n{u=2mRtMnVr+hQs< zS)@QX8oOx&+FpHmg`vYzFHZB~MtLPTY^ljTeV0{!krf3HSXUKZMxXf&6jSe`=Pss4c%65NZVPt zw`$f3D&BLBC~B@dSrj9P+LDe@>N!G?E^*MH`i1on#ko)IV;F`0ru_gJLrIG#a z!S1`mvpMbX?7k0c>iyC2{=5#+o&3X^>HoHSGN%>1(|st}-uL#pbE$^shle$E^5*yc zoMzA@`k}qq-JjbRZ}`A*c|C7bE*{pvyQ5!^j($J*%GcY|ef6;tqNC%kVj#diT61x8zN` zSF)7stcT&=#Ayya?gW%pb{HJ_u^$e6(@URu85qi?!44VfW~@`?s|u9!M8` z7JFNS;4XBOejB zu=~Dy=>GPmxA&%rB>r`v8uS?*Y-qow<@NNNe^ z-7znIgKVCDu*d!GS-(D8k*4<+h>=%2-Gh!0(!?c-g4V6hWY>)1Sh9~9z> zL#`O+>hnYHjHsQ*xHBqGd^A`8)BnrxgdqEv`2TRFQH91YB$J?|J$`Dpm?(YokNibe zC3fM|j%$o%;BVPZX~Ze5(UZHr|Bo4x(mn8!w4T9$W4wPm1vF7phP|g!4uu${SU9RL z!uJ`_64u2@m~Ym7-92-0)z%d_na#t%8xJU@B@YamT+tg`&42Hn9@n3UZg1N!a`?!Z z93dNr0OQ5jv4Ye2TLmk|0MJV8EVx};gG1)j-1|dHLr4$E+#(<)0P5{oJ~{pHCxTJqrj&djFxLJC#Ivwp#opj z_c#X3a|b>os-ub)iG$}jG?J-Uqi+|vTYq;to?Tq{ z!xApZL6rub@CMVM#j$LSgAsX?^NJNis#JrGxAtU2%e(U^z`X%p#}djaO%{M%V1$jj zI7gBp!&z&lp>N#x2vpi>Ki^y`ic&hqC+;Xpdw9`|H?{sy*ewABPI0k1HL2FwZmV zFKcczqsN)e#OnI<4UAVsR|V0?8F}LX5N*xv74`#r)}ryK+A%6z(k*(QU7w4u_Iz*u z%hDZ`u5(085K~q#r18gEnCiOW6aULCQcQ%4M^A0LqMQKP3Z>B8y9qws_Xo~;yYrJ1 zh2uL~y=_c{ep0=GqI!7>%4-gVXypP+T>!`AU31iI8)1bAzUjx3ob_yl@r0Zr8Xk*xDwl zk`ULmxhoAzeHq4K%Wz^NWaD9-gL*xc!%%9PX5NP|k+~3Bm59Qz(`jR;i?v&paGhnm zBvE-u5uLsWZ<&SI5(`o54YTF|&;Q=uTHktx zz~2|}H_Q6XF8mr)6#ll71h46uLK_Apmqf-w;X(+lV^eS-Nj!Hr zn@Tr0@y5km%NTKYCGk3qrGIJ;h_ZI#t?S2#|I6i>HUSE8)LU1a?=pxid0sTAcbdun z@v;+tf>}_YN)wRDo-;oh(NnA6rbb=fMLhUrD126%KrTteMC%=#cK^Tr-*dB#AuA3n)OWT5>$?YT@2Gp$bo$48zqWWdXv2!S%FDjv9IhGQbS_5|>!T;!M0jWd}IE`@^)Kor@aWg^Rd?|AR^Veeq? z_~?M8j^sT?(qe<5JMt#M7~_vaFWw#XPr5v1hEiheT_}kIu|LG9pjS=V!qL087<&N9 zH|BH|@bAw;(s=An(R7n?ua1K&pVT5#kEL0sTZa+mvt${oFMU#tvNNrGnaFrKG38Xm zLoKizp01C&oaFn=AU@r3Hcj#uQ9~ABwh<<%m7=*~8C%JOG@y+#;^OdOc;(Sx9&us) zDOpNo1Aq)aw$ghn^;Bz~SLZnf@%_(O7L`PbJwvSURk3y(2u*Q`WlJr`JQU_@(25sP zy(SPy#;tNbG0JO?Vl4n9*l2*2#j7t7FTqvy%nyW_@bwYv3Sn)tH5H>H8|-;}x=7>a zsfi8M(Shg3Y8}3h7*6oWBr^%yOPBR5q6-I>;Dy1im?QXqA(ROwkmXH5uk| zf*VRXjS1Rqnk~@z-ub=m0cfp|Bd#y^Z(a7|8w)+$2ToxzuWm=Rz{ zVU^mm^EmQ`>?vXW#h$*Wv%DaNUchcX4oWnZkjw;UHIUIx_AMd`0=$rY&q}PZ8gQjWnLmoHvnHRP!SxmM6{mss=vRQq<3Q< zL5+ifA0|Evu{-cWG^`lGseCAM!X5VZx<~!4gKOw1v3G;H;gk9_p~w)a!vbtEof3~J5=Vnk!o5GanrVgmO%_9iMN}PV z4k|Kc0g|P`VVdj&u#LStt|C~WFA^zPn{jM3Be2k+`uZPysrA3Uv9+}+?*BUL8_#I{ zKU@E{{=cpNdFvl59n3-&%*w%>hruWqkj|86XKnHMTW<({A*9d#+3CBzvv;T6eM$}M zbW{Vw{4*F8Qs=y%WDSG}`7Y7e%Uy(*VPb49e5hr6e* zyI5jt)9oL>JKgKbh{l!fj2P3f+!>{wAvcc(A-juGE|KK6UR%m&0wn1jy>|QE-P64{ z?yGkP#R%rxnsq>(eB=$J$PmRgYMLb0yBW%Q<7?Wp#eq}gB-BMbk$ zg!hRq?<0$EQnY{oJ^-sOmy2$T-w3D7_){Y!+T21&3bh;YyB1BlKH? zvB~BFOMb=pfbS%z;Kj{}#)uE^2#4P`LHK(P7FYpVZBfE5{wN3~7Z8O}ALWTwZ|If* z@k!Cp8pd)qPL0wm4W-A7_yA3ue@9vBPf4yWQjy55PB-oSM`T8OWSHP9u^(V1|eS`XwwwSGf#A zCtLmUfP>K7WiX98KCB~ZNb#o}R8zFr6hkE57%@TOYIn@jOe-CN-O|Y+iH0wRnE3Tr^f3 z!?S71O2bBptdHv01MyR{Fh4)qH#IF#AY%@Br*N2o{#AV>XLQr)ce}r$6EB70suM1a zk`U(i@{A>ye3Zedm$H{?}9j&M?$czTca&&&X$7c zM9j5(2OZ0Qj+sMw?%IW!o#Q|UpBh$YXF`|6NNZ#xB(laKsOSqNWi!Q21#__0s1h?i=non}&X9hStb-33Ya|_L>e=u-tN02w{N$K0iJ}R-DHaN9+*v1dv5W6RIy0c4IRJ8`n7_xN zGcbZehUF*>Ymcv@gfU_SRE4+ZBwaFBK-)FoeyY4$#A_88teZht%&DhoY>Fh)h+1qp z$LM*oi5&MQvXEd|-YAxUh5@r;$b=IPAi;(Sg8~jODJSTp(0$0od2g5v41qb488Lij zbx+MOP|S=2uxP3N3p8<@5kIpb42DTUQ$v%6gfd0lITDxpP#_!eJwTAr(1q~Dz`+_k zUx^ya#z_nQ%Hh%*H<#OmK6@~41gvT)x{zl9a=CL`fy2&ugnvqL5 zR}4P!omLlP^c@SRqR)X}a(hypLac7AqmHj31_q$NC@8tLX_m}I3;kZAST0wKE+c#9 z;O@uZOSF+<6AIKgQ>-n0f3P87?hkvI#X;zU#$!L03Wfm%lTKrAK+%h)@QN`*#^8mv zm4s@#$6|h&l220nZBMXAGFRh}>5Wv^HnQscB&(j`I2W*P36jZX2f$#oSU0q$qykwY z)Wq$e%{&cng2XotlN5{_&y+!eAb^bR?;g6n!;_75HPnvizl^7o^TQP6XS?2D5XD0zBaTL{x3$y&+lA@LY}${Q1TbpKwdaMY0IHxbN9G_0cUr1bV!_=Aib3PswV0T169f) zUET2ybG)2<-1(*+wTw@EZ$nUaUAQB{#^bb=zAzww0_^TPS(X4CoUbE81d z5=P-F9XDlr6%~339j9DT&As*q&~r9c_M>QCn9!VT2_sW;qMbTLZV@5NWJ*I!;F7?5 zsQ*u=-L(C4KHpcU&`zwy=hfoPm>)2C7ma-|chZ!^G4`W5DxUnAbdGw5mHU1tHyTC$ zpt-Hon#M*Xo^x<*P$c8{cx z+9!^WCnqVu=j42l=mnQTZsf%m*K(DLJqTmH!vV{3;Q5lASmhwvH2{}57=NpFC!n8> z)NTLTivw~HHZ;Z=-%-vs3f98gno-np$YBBF;A_?bYLmk#bIBZ0`$PY%844OSbceC@la$nXJK5zm()NU&=38n@_hMjEQCDz3@>hc+FxsY;8K{ zK^E1LBtp;GSXZA`$%)RoR2Mrnt&Jy79Oe69(f*h$h@&`+`~0u(`_+rLp9C4UvN6}o6>euU2283K(O$_1SdyK1{5Kequ{*6u0&B7OYt#YS*lP( z_S#`FZ2uNbeSuN~Zhx1KT|<)m{CxZYF+b?#pTVMyUe(&dDPa4-gJnMWJuQ&&$Y zw1)Vs*c~U43MmQF84JP#(~XLvc>+!^>@tgV0v`s^WWr-9|74)2$ckHw7TsTYfCmV`JBVoUU z6HD3lq|6OlZN0Nqw$^ean^}X6{BBsf8Dh|(JZn?82CmHyEeueydfF^=3$AHyW{yoL zMK+3@g0W(8Gho}C24dq8?Q^TJDISwKgC-{M0E0eg#eey8?f=F23!};hH~`GC|6lL4J2d_s zoC42r{MWa>`G5Td?SBv9xD?+xuVQ}|j0=r_@%iHRzc%AvI%v(c|F_ueqRA{8*;?{` z%8%PDOolaGrLgtP*C$C4xUlwy3!{y+Fa`~S1e^^J|({=fNc|NplC&)xsAz{%K4F@*D~ zbpM$|!`T?sW*`p?SsrtATY;uZWQOb+yL8o`Q6Sp+k>lW5kSmrCIwu`+syX`LA=u*Q zL!o-}&u4(W-CHRClvKI!n2e5*PVW!;?uywE?89mqu`e6Nt|vfnYFd`Oo}^Lgjky@5 zmJcpM&%pianmUQ;F68zJHD{xd9s*!^t~PPhLvNWk$NjUaA@v5A{!oRmck-@(wtLp? zJ5S&<_Fj01{n|Y}>K@91`;-ROqz+9*Y=ygZu}VfE+>%9`T+qWuw8g43FP?g97*Y_+ z@>cPy8>W$0Z|L(;DRbk+VZ8zP!(%9>xOuf&Yw%Bqh)jEmK3_#8rcn~yYLNv``sgd_ z{(5q@zJL7g)nT`uHk^9u{P2V0CjP*A>afo<{IceB82f9r8#s~%khAwH4EWVbuQ?F@ zB@YD!Q)lN9e-Pd~=xdPPNo`Z|=#9u&ilmEz84XM?bzzRXI7X`KS*BlMU*RoNiIJA)cM=G^c~}_WBgsysnsK3#N67Mw75SeFW~=1t?9@nIB+E*Pa4C&I(rU4 zPGrJcXXu9k8bahl{Ok@;DZEeb1p-PeZ7bkoitUeZ@sfb@>Za+vz#AIz1B%{Xw_UDg zb$Lw0rF$LrvP_8w0mh*7)FQmnxrZ7^=$+7`1H_g+*XblU|5%z|BZr63>0-?`+70cU z9TK0}mXAC57$1=@YxaCydyZM*vUeN!PUc_4C!3!*7TKd`_^6XzsbT@zcdLXLUWQZfp>C!m;;p#Z|}vhWC}IO-;ulAkV+2Vv^uux*viW9fXAtG41?jkc># zVswkPO=5DWe)W6RX>2Yg#H3-&?RFN+67R+2>;dWZ1|`uOev_PCcJMHDSsIDDSOjd| zKf$oNat)Y%IEznu^{P!YT)!G=jz^6~77wwCEqnoJNflh&4Fn9EaUmsh`7|UUu1537 zKvx=9BQ1&dLkPnntPbe*Z4u--D4d<2zl^N0d(!JazIdVRW)IUNW}M|zZ~=!BLgVc) zobHgv$UAo2;b?_00}{tM!vkI%%`gzQfFn#M$Yg=RLMAhvp`{3UpGt%{f07q_WM06a zgqdqmh*k`VthmRVik#o0895mN=bwT+h1cdJ4O0j!?k|a1>kvi4qK+00HGExT5>lVK z0iV5ze-p)54Vm)z7>*t@l0%xzqL~Ydl2x|VqCS&1tOe##&7!o0-fkZhR5&>N-4}06uam`>YO~JJ85ny+p%oc8RTV(OOWw9Wox396Z2O979~ag0ns4%34GsYx(>irY4%H zDS26|c_hDpDXz$Xh?@bW6;iF9u^2NVxEd`RWQvv)FPLbIJxr`0IMJChZ`z?D$a0p~ zr9)2I58|ww-s7;l%TRa}d5L5Sf2L^~+Bvgb)!nT1XJi5u561!(P7;k!u7G7yoWoxZ zp4{Y8AlNEpgPmZ&UE(N}habNv>>D-2`P#At*-bKr0qX{V{K*)B*fddZ!Em(F0=7B?C!#3*WCIk8G-^d!l=$ojthVq zzxsh|T%tvZzsfpM2n)t! zvzW4K9kq{^0rN1%jB{1uIArI`bc)-F9H;OaVud7z<$MR}mkinP%$mz32*MwPBC~j+ zYr92EQ@nhYmjLgC5gsj(*)P9U6ffSiY(Zi>7PNe1G;>QEkVzlkNhZo*+D2wS9*l}k zQvpK~G-}rhRpX>&CXR1UXFf{l9bi4+#eI?d8oVS>3UU;eM^mqvAi~d@@y5+7wGzI#c{zG~+3Y&D9WAV(|G|PYo!g zy!pF3n+AXX-H+EpI3_($$$3NlqsV+HTIdFI?=|Cg6BaQFf;qZX5+BQCb8}{GjR(Fp zk8Wi~Ip9UD^^teIel;Z%af&a_kxgUm6zsv1XvSIf8rsh3T;uk}4~e)S%lux2OOTNE zP}jSuZrFyBbIdiFwXv1k&{4*Sq`3(!9oR0%t&@HmWoVdD8SyY5{R|vw;@&3$bUl~} zt=c9wG{@)rD%6?Kls{7V0vMn5FX?yxr{0+}`01qG+V3kbKCp+3u}EVsF~$xS6xmj> zBh)d5`q_UkF?2>&tgyE7@vVrB@6IJx?E*fzFscB_mn@{3(0es*FaJEF&d>n0=Ym5sBi91x~7crz$a3(YP;; z&3r_rt&n$ilsbl}UAugP%HhE(=Y-TTTt4n}V9AXa99gs{Mp-1u@4o1CyMy6YYA{W4 zDoEk$gqOE5)J;!@#r4$t9ICgJk4H5N?&PN*kJ_J(zocc)hol$P3Ln4?2DQ`g+uim_ zXOI1Ox7XVHsg3GesXp&qt^d8sWSJlD7c8+DaJvW3>WCe$0&%%gyzO_#R}UK^%-FV+O%@asE`L7 z@xJ)~*)WJABvE+FLs> ze=*jVuSOjZu^bh*v%!k8=&EsXS+@D>bLV;*Uq;r8^g%=qNHz`^6yB$ucNmtnL*@vT zglwXEv{h>CJMIBBdj~wFT!--u+_tz)N)|FV09ZD%ys zkAT+HH9?oAyW`LaMxWl=kD!1|shK=PJly*@fzV5h&5ZpZQ-b`cn**Xeu+P!AY!Pxr zO|pu7@@W~<;4c|QAIliId>R7sxUt7Gnyp&>vjeByZ2|wQv+rqFFW#tiXXlfv*jlsX zXK+D?J&k3SAb;`3%CwNfuaaVxt?6z7Wv?C{9(Fo*r9k8=_5a-3Z+~>&Vc^w*3RS7b zS~>xC$?EBhl`D_vk2vL%o*2Ici#c=ns+QWK|V1;?Yo-02L6-VfM z$y~Bt!gNP8S$IKR>{HN_+V7b28jsc{#ff<-IglOpT$ zO9&YgGyiDFO%Q(HL)z8qHVDo#D>TraM0Wp>f_Az8s#r z>*xM#Jwzj8*ckQUcZZE18m4Vy*b1Q>DIbI6AGJPV4E)1(SG6s|mrQ}k4jy{&$h&Ci zCMvUq=m2-89=l6gCVkxA8Izh>UotE_)}-473q`QXhb{5$&)z(?K~b_H^W^{BU!SXT zVvh_!)-eDB{o`;`^dV_>#|ii1YIZ=WwY6&- zRJ8&sEY_qBP;8lW$sSqH!<5uThZF=$8mA_*!K>Yg5< z30n^#w{amAJZev2XE_d5Qgq(;Vc*G;{EjA&KEATllTT%|(Kh8w!mZ91L4 zgBkwNQsl#7Z?AQT3Fuc>(|`%p1vEErG%3RAs@h&XW}j&Pr*HbSWIO~C=AaZ*IX7Vq zFXL+2_9Yz2hv7}$yRF|+c2Htt;q*XkrVtf|6!v_rlu1vyl}kC2JN~c}5>OMHAxp+8 z{*2;6S5&J5tS<+BAe)6G0%_{3$YMHkJyIHN25~}mX|&M{OnB5-gGnGg&fQ4HEYD9rkS;V098ag6o z{IuKo#M8O+m@s*VX?ZWrd@jg0*goa)LuyRvY@sWEEGw<&!;ovgO6aKXq8`hM?si?a(vtO z{;{CAKNRPV+qER z+OnZ3hzeb>fR5}ck0y9cQy)d@Bf=)!!s-!gy|6ZaQ!Dy2m<>67jC!sUnlyJ;3>r4o zD#(aZ{6%EWmkziO4_9g8;Fhi_`~30R+c8IhH{21e-`o3ufn8Ox0bV4-5YUKikXTm< zCP)S(BbZ${$TZ@YYL$d$)KeVrV!93vr-!Phn=$}O56_jYTT45#3)E)jJ}|*J>nCH- zWY&g~29r~V;z41dyA4S~wVGwBpAN{_dg;OFYuGuy-nQtY$dAh{!!oOy-Nl?Vn@oI4u!=4$8l>Rea6*Xwqj zZm-+cri(+5NS}q9$OE*&_(1~1pM?%RwzIHA=Hg>s+|)1UPgu~i8m(O6>=~BppT^-! zRAh+)Ke2EGe!oa0XS!3VVAZU2im>m6o!?sC9Lh#w)QFwiM4ozGHLWbj5LCDhO=D4U z6=c*rGvI{jX7BBs0VcWo_`#CiDA{kD68Ke$EmAGxb#k@1=iF_5mLZaP74Jm<3dUqt?9#ZqWH3d8C~t1Y@XYu9 zZZ{X#7{@zu#-oDwDLNIFL3X89NJ?vkb6U%1P7E_Erjglg-FX`CZK<}b;X;eG?0&-_ z38^5ZuD|>A>CVeOyBT_jvw;zQI@7`;{B-7Y_l{3@rL?4+Z^HS=@x(_HKzyBX#(!M<8O7>J zEb%W%T&3T3b4=oKA$2JqUgW)K4PL1h6FFfcvY{jPjt8Bi_NMxpv^V~);-rwypa9u6 zI^ZSdo}yURoYI(7mx3}?n8N@bT^L;gwWal8h^=f^GNPnACE?9+N0dd4>E zxum;HG#N%@(zFhjH}!Oi$TIqV5mwAZK3S{6AS(#~Nt#lzR8qVeIRqKK%<78dv9X%j z!IaDMnlr(|dOtJ6mH`Y31B6!*N*5&0^P^3%@sv#FJabfPTepzLqY=JN;t6=P2pz>v z^m&Xb4jy=g#u(=ozEKO`ME=~%FCCrV&e0{5@j#S9x~TXKy{6LCuvXkaj+03!OOS~g zz#4Vt-jwS~Q%tWZ&@gi>rIS0->a=1u1+VOAqL6O{q=t|5R%*PvGC?fXR z$k4@9eyP*c-F(E1{zPSbiN2W+Oj4`TVSf@9F0SkG&3t&t{U7F^t@y^Dqsy3F1m-5< z_(O?oqD44I`|nSmJ_!lRMvYn8sMavozROa(Djf#nId2WWN=+)In7^wi$bV^_$`$63 z8}ichRencCg#0D@uDlJRt5^hCy^2#`jHlq--!lHU>wjKE|MGG>UH``B7VMMFMsuU_6#xC(#eZ+StXVBM0%z9Gt{eG(j!ZA>&!1WE zM4VmfgQX`%Ygz8tfEU-e9=p?Xw;n_nw3C5#UZ*E(b8mP#^Wh|0#|Zap2i|$KaHHGx zjpo+I%OC2O^XX*enHnG76usRP_ho=57lnKuUv$~^Pw`79fm+z*C#hzg&^HD+Crlt2BXb5TwC&UmK4Ztc z0)^a2VFC z=iX5D`0~fYU^d1N?Q!J&1E((19`inj@J&c!Fe>kG5k=%AyKXEVYQ@9IyY_=cEXp$% z3ck-e2Pf^n_5U~H+dwec=~ZOxPWfGfW$9PO4Rvk(OkSz8)y}kFHgS}q&fRI2AMojdhiYr8=0I6BQ z8W44I+?d;|Z0&3{%1j0#Sh70&=R{;1SydNK#y;L$I$Wh@QIImZ8zu-7+bVB7VlXg< z;j#h1hD5;G?zAPKco=zljfGyQ-QHZHA$}F#{D`ISf+z_OBI9g`ZO_W6ms2Q(C>SxE zhwg~fCQl{ACFFFcG!fEUq{U1tyt|@^F{o@}356D)>XW9fkKlNf!EuF}YFI%O}2O;_$xf6W{ zn>R@^B6{$6E3)4opnINaMRM%S@<;gYWZ%$Mk%gvdua{jz^I9hD6s_eSWRdsK(cN=o zG>>9BmG@P1!phB7%}`EXdwu~>^a2GmZHY3mGwSwNj_oAXuARK7~< zQD%f08>>K4g{n_N#wGF}bo@k<1#jXomLR@Y7T{&_pO;(Pn*3+GvH2wbd6NI=@*naw zW*ZXQ=X!|dwsr2$$;6cTA>+G6ya2BD7VStwvcRD@(_5QZ6g%TC$aU+?`<`-0xFbxQ zFi$&3Z($-Y44?yMiI6>}DaCypU?B9F=dlz+998fc={uP{EEBbiSZW;(awQB%{SsGb zDt|(kYs_fDlG;ae9~cCx=Tm1qLx$YJBK9cb58R+AqXk8(d2U@ozg|R>7uQ&q82ZX0 z&n=|ju?Q{8Y?Gjx9|@?q9R~uy#z#)t7+`3`TZtAkyp@jXJe%T}GT%AP?RTAl7p}6mR}q>;HlVXOq{DEUtz{V z@&m>Z$MPfGt?c*0K}Syf&%qZwS|;g(CFvl|3zs-vq7xE)GJEOWtOE?DdzyKXKP056 zv8X0orkco_(pCg`nN|qxxb-!u==NC8FPVp4Wg5O@f;QCV5h!L0Ix#y)D{I!(c+Lsu6siPhe!ZEnw;0 zoE9#Dj7->-U0%3!MPkqGakYtt z7DTc9$>G+#*{bZmW*PzPk#sTS`4H&(&+KT>-wI_KHT;5d&fVosQUX+d(BS?GFt&#U zy?h@VCkI+?x%2ocf;A@IjAJ80sv ztM2U(j(L1#O$&&?xf!~_P9T>+QEauAxKFJw4^V7*6_QW`B#hkmWvycR-@d`UYNDx*z#vfrSjnSx;^7$;JrxM;zffGhIw zHoj|yf<%-Cay-TyGs#>A6!S)i?q_oziXb%83+brp9IxZqhaq!0U57@HdT?OHscs-1 zv3KDR_1MjMml6~~z~(t;3=uFoTLj}TWo%XfS}4>k)A2%EdIOnJm)+RH^$ac?yXl0F zF+o!>^eGiCF~2On&bk!r1NZ{k$y7T-*~h?9Thy#Z+l~F>=y%h~>QRX<9&C01m=c4D zym2fwCNhN}55Q{!e{hA7ZqfIos3lx%sJ<)k8LA;CE;?D>0Pa@_lykbDiA@aSN=GBD z_|&-^Ma}IM!xo%gvJI$BHi_w3L|=rDohv5%?+{9MEm&?DU~v2or_@sDuN&~sTl{8P$* z(Fq%;>JjWe3-G_O^Rh|!zxlGcy~FJPb{d;c`2U3eIrz_g(OaEQfNn=ey{<+9%0tu-csCLxt7*M=FT zWI1wqeDGmZ6U>BKfq3YV7Y`#poTu^@?3%~a&G1xe1A=oDhFN5sLvdCz6*)Hu>_0Ga z9y*)}UP|>1v@@JLJiGvgpK7|q0Ipm*_-VVAUPHtiO+Wd*Of$yGrKJ|cD*22ec;&0cJ(3{;nwTxzxrMHzj5@-ZvJ z|3A?EXBqw9-rCvG>Hl_f>xuq9(SMEq&tBopEPbJ`PDR{mEB9fTSCsMzuPC_YT;}%< z-1B`H=ezLC)<28bWig`jNHWEr#GZH6+^*sJ&JWH@o&i%oX2}O{F1=Y| zcBJhUCBd)>z|@@b%bo8x$<;=4(Vxb@?}{u3q>ZH1!oon^)Jb~tN!<#R0(K_dfm%N` z_UMKz;)NpDH(arVLk!W0?~~`>%R6^gvMt*2P$9@`$Tw)>3K~j0l~}$Dt_))?XXM~k zWixG86IsG@Rp`K1efhldKq^zk`|Vj$@7^i+@LyUA1uPB~JWhJpmEC11T!~1Q4OAkm zCDM|bm63JuZ9$1lRzp)dX>C%NiSHW?D0z%CvQ0L?ET#quynO>B)6LQI*QMG;=O7Ib z)!t(HGQq~6brOz9NsXG7E}a_A#I%IVm$EP@Sk~CPTQpy3(J*&l*%85H;VeH-R^C?Q zouGzoG}2<J2#?M;Hvi_mO4rY#M(fe2+j?qUsVGNBLDUb9BNJAsYPij9zN)Q7JxTr`$r`Jz}n zN-PSEtcTG!gaU%MA|qWxJ1EzXiiunv`5mS%7w!QyQO|-m5l1Hs3XIP_R%+MEr|ApcVP=?R` z;3Uo1OQoV^r8EoC#Y|2GyqNi)owOs&2#k5#SW4XukvBIj8Wj~47myQ@?BSJ_^}UEZ z`F4@P^>HYXxinG9*hu8`YcyTw#&z!LLh%{uJcZk{{1k4YF>&lBs%8ii)9~sr5r6l6Wy@HJhOe^*s(l*ZUTt5)+Gq1;c?<(cu zq?b74EdiN~Q$Wd+iG}aE=Xh>hcIvP$xfS6wc8-rvdV`)b*gMW7bbM}g`1J~1UM(oX zM_c1klX;v!!)X@6ur9nLGQ0}#5Z1GtNsud+$jOxMzj-oEbK8)!L!5B)dL}R6m!d#7 znXopwr{AgoT~FJY>^wO`^=Y?%+}`UPblUsXq~@6Ck}}BRqNUxA4c*Eq28jh`c?Odz zhI~_BayD&o$d8h{3ljqeR;NqT)aw3>*slPbo9j)?(XvVUDswc+Z(^cn za}-(ML!8wbo4i`e=cw7u@QH0}(U>AJPkIn@L-Q=DRLUSF%|~+c2AZO0_VRrnGnV0h zJ|!+g4i~#vj;F~XuMBg-7`_y;Fw zjUqDP5{7yzWl-+{%T_R%P`Q$Arr*moB{@Su@sVjLd8;qi({{j0?f}AjLw%>2jqWqE z(PPeRJ{gGPlmy6JsR2|8_q7e94>NP4Hnf%!0Y&&A-F?28BIDoDcZAQ}J@Zm!^Nw@L z#;zoGw9qVKS5CGv3zur+v+7#-Dv8o`J+5jq5MdVWcJGQ4iUeq2??Xct7Gq!kE4Z&pR4{+iWu zPWF4;hFt9wWh&;jhwjryt&}>jp7`^l`2trtb zC|F!vN*(cQ2qiR8jR#P3`xZ?!X5rcza1B~s6S6xA*WQMHx{Fe>CQUvI0fzUN%wt>{ zHDqEYaXf7e>V;oMfQ?1wR(sa}-`>%?ytdS z_j7=?GD&l&3K=%g=?uVA`NepI8DGX>cIwCBlKh~G^qC~jV(ZqB=8nUh7?f!f_X$0j zX$3DIJ%dQ`(Nb)d37S|c)#jHHi8Wa?zYlUWziLX3B+1k$FR=|`%)=9K7A4aJ%B|R= zXfV_2B-GFh_(`aeJ{ptodly`;(lNM*5*JgT;e1|=3p^n zH!c8V;_`roV{bmZM9XS%E5I!rP06BAz)64zV-ncz)-)I`0G_EgzYIn(w>ny4d*cG} zjx_f!4_S8g(ZrwnXp8bzB)YOX-2tj8RWqLRAebz-?SW^$);@|?T|@E^mJdyb<(!O- z?rK}3mI#B`|Ev~J$OUt+z^Oi=vkG+=bOnRmfl(h}{iVA?z?K=noqN-|Wesruz=Z;B zgeU|hxBHHng($XzQ7OX(>^~p%?Cc78C|+V-g+GPGk8V-q1p_76wSiC>_HSqy95DCBy%qHl91Qm6UZ5qQc-jr-oW>IhPe6_lZ6 z(@OO?5%6Qt0Q{JFh)OQBeeMn2Ma)9wGPnp*H0hwgvoPDSm~PPk&AJ-qiD4Kn5vF!E z6hMGQeU=0E(!IvmjovJ&EQYu)J4L{LUR$I4fpiz+$w4-ZiN={{j*W;&3CDT<-!i$z z6^Ri^hM3H#&k{FQE4&K@hwU7JzR?7YaGTqMp{+lCzI|(L*$ju#xF7LY9T-(&c4s=s zghwJHFcmb2JtSny-bphpXbqs!$tYpx!`LjTsVeG6GbE6}HLg&epvE-wWwuC&BJEN; z1gI|zf{qZiYjzEto05fK9Uz_zz4E0`58Za=3CNRC85T%72`uI8vy%fzDJqCR?S&+J zbz0H15tC{^<|w<_TpSRSX;!Jh;eFiMj~QcopGi9v_Xs~Qy&?8y)Af24LpZ)1#3LMkLVv1gGG@HmTC0w1(pg>WmRh798_Gnk; zLVhvwAgz=4z%3itj?_k#wPj1@%UZtgRaU}?F&mkLaWZIk+UN{ayOK$LkxU_*Qv?yE z)fD29qJp~C@4@ukPjwlz*@3f=Cen``R;UVfnOa4&W|c7DD$E*llZQc4q)KAS)vM6f z^OU7<%V{&N!unN6HR~bC$Wsxy_1`e2*J7Y6l7i_P@t<)!c;LKVimMH#X|s1W`dW^*&?tohm6sRc@^t^cTa+V+OAv zmhuUhVb$*7z@M|C9Es6!LQM28Y??XYz>Mnw3|@6f6&rx)G0_z{XXxsTEm*pA{OqCU ziB%YJF?uOx1sPzVbuMz2wPDNF+fi_r&C+dfnXw&>saT$s<+qhHwjFi(Dmog{Zsa95C=o2Zi|o zdx?5ESszB6Ia#*eSPC82Y$GXCGXu{lnJEH>YUFvM|bv7qB4BI9jAU zBX1aaL}tI^IHzV0$XnLL@f&Nbt?iomUeo@+lL{~$i~2mP0Zh<4U%QtDLMZJ_ERr|7 z_M>1%b0c#~EDv=Kuf!|enO9oM8!^TI^}V?!sOyk0&B!*H7^6R$DPntj8qRN@n4l*n z=!pq>L?%e^5#DESxL`(k=+}8C1}QCveP2f62(Hn2T1&>aW~JPdiAy3h`PaWJ1LIUk z3jQ*T&|`5Z`NwPu$vHApfIP}!b?rtztueVEF?VV~{pDjkHAbX!B~3kTT1v%=2Fqt< zt9K@He5Ujjz=_Jtp4<^5#BpXTB5S^MJ0`@>EY0QsU_hV03!XgVh$e>pB3;`gHUna<}#nH*{BaFSzS>A9?h@!#+KoN3bv7nze_E;X4hgF6vh*oP9!j|AI3mx7aH`OuaFcc zm!rj{xG&c#BjEkmTultD3Lk}sepYz-{3_HL+3nxVQohpciN=|viV0vV(|215*CJ>h zaguZZAbd<$$vGKYzRD}n5)_SsXlWMQ@U)sW&S+$C}APf#gej?aV{>iprD=dfN+Uxjf~8IX>o;Ona~a=1@QWJFA8ebrHgmY zm<2u*Y}=)ac0s_jC;DRwH;I#}=~;~IlT@@)1f)R@Po^m?>n1|5kfA4YBeJ1@mB*E< zG7}DAzOsQvDniFx#d+n~X4A>OK&7)g!R5V04YZxH(@@%%c0a|1n7G%dmRZ0LjH8KU zww72@_^gnuO69z$5Ybb}1|sQtFSVp?YLXh06q&@>Voj#o0zRpldTe5n0h?YXKJ#;5 z_52b31i1Sg;D)ek)@?|--?h_6F%hLZFe>Mtk;>Yj-xrhJ9%dMR!|BpY#`U@U_1!KBbE}&)kAGfy~ z+WEh|`IP_h>HL34Itadf&1oL-v_ijZa@mZl`)9qAeRg90)avdZwk>hb{P#b>mg4`& zkFOq>0cMH+SMz0q<$r155%3b}|K`R{;|c%2E&l(tkv@GmN6CFjXD2DiWb5Rl^)vdj zrxBEsM^)EOQaQTzy7-2{S8b75N`xupn)HUwz+2HO@nLH z`Iu{;c0Y7`XI*pM#q4Sp+|0~1yFKTm*Bdzdos+!UHNLf_@)c*qSvD=I(@qv?xhuCLdg^NRH@i+h@%_ zu(Gp=-3zZ|oSApM-XQ{a?M@hAr-!YR_id-s9kk!KPb{a#V5t!xiV+BaD`{2pLZd7& zGztaoRn>FOyY~A|7Y+Y=XU^cKlXh#rFAD(yAnT3w-ka~kkPe{lJ{ldgKc7{rhsS$o z{lSTitwQ4f;wp!66@iq5iO@~EyPwkuX>i!OIJ(q2n2G7$M7Jh)5(kND3gfSbaFLy0 zTwi8@6I%hsgBP`dc+D)XJwwW29slecwf?7f;(TnM^gF#SN>n!`3-Y~*=SEfTG6RSg zGM6J^ZxO<*qQ6-xoiCd4_>pJ4`W5C`5W|dKXoVL{Rbc`$v(d7opg3bx9-b&+aW-m} z6gOHirpO60g}x|!+t>fLa7Qr3bGHAJpZ0DRe-jKH`9tPmimMWn9RMM9XT7KR8#70? zDJnRgQ=}Rny-XLg8Lo8&tAt)Ow$^Sd79K@J4baS>5c&OpMHcp=vZ1DswmHY`lY`#L zQLDSxCSZ@DX9RRM@`57 zTfGdPfFtj^yO>IGs$@X?U^tH^DKLVLna#&&MNp-^4__#H*7D$4T9_!-gs$hz1T_Qv zZH0iZfVLAdpNTx6=`*Arx1`thFHlc}$$~F~8(91qJocv^S}KtX;YwRby4Ban}3hG@)&4_wY6D8iw0mCV251-YlgLvDs47vno-Zho8x9l z>`54p!+mMIOu?(g3MVpach< z!?x4^sda+fKx^Onm;B`Hq%&wQiFn8Kti9uQ*J*$1^aq{pdumv6G#2|Nfd-?berz3f z_8o>Y4*WQ6FAsIJZm||R!5)j_TeX?(!n3p=&1*Elid5;WVY37zH+jkU1o~)Q-pF_& zLX$c?nYp?YbKU8o%3UWdiJlsc5Dl*Eyr+Y~(l`CYH_Kr3jNm;}P6*Y8hGw((;aR34 z9CwFqJSTN_m9*#WlM^_oJKg^2!9i!Q)9wzOcks1+V)E`|Zd=hU)BL;Exqop1XvLkM zt1p=QI$;Zdh~Wk7x-ndnkC@Zg*xb$y(UdOjb6_6KVV1JN%$CJgN?a$4CxdO@gVXNb z0N9tDnV{oLsPo|*1VZ@HyA7h(rozI4XXw|V#x<5BGoCOCkRWHxdC0tM-P9EQHMW}D z>wgc<*WGv+j{MD+jq{D>-zVOdsYZ)YNm!Yw=gwl`?C!bb*3YasF!+G?Il#LbZdFq= zcp_f}Rxr!1sW_6o^TkEAqT!9T_BLl`cdbe>{i*mDvjAXKsiAM8h6?|cCU(B(9_Yfw ztABcY+&dYx_j5Kt>w;p)MS%z)Puuzzcpwfv%$C&ylw04RR6JnEdrZn6bx;?kK#ob1~H4} z6Xg=#6$74@0syU2BNIRmqY4VDP|r8IPOlnC7}g@M7|Cfr z%j<9sSYdfeY*C4uQtvMcG?i+nb9ngS16*j7=i1?0NB3>gA{Q4si(prlDEICbHZQhW zq8PS0_hvPH(cmnD)u0>qG|okn5(c1+jmD-@T{U82mP{GcubQT40GxVy2ej7V#AbiB zN9ceiH@63kxqOy{BwV`tn5=+qKCpc|b8pH6e5V(inw8m&IYA#y9l-wEJ8ZX3aV zNHx<{+rtouKar|X@WrZkp<)kBi5Dd*8~%uu~5y2DC>?T-}31uA0q8w!NpuT zfEB;-1CtIkDaKk=Ce~$_teU0%Vxg%k6}#v{pY~PuK2H~9xZpYGh+opBoAu5`R=;fS z?8rCr=Q3=V@kK5ym79hRP+8-p9$rzhF~eovolMdnIBvx@QOib!PlL(GnWC~Fx!_P2 zK{yAvS!56j%CT19957 z>cua{@+d*Ni^5TtNY8`E8(HlDUS9h#Fbov=368KB#lY5i@R@Q@Q}CkzW7y%LcM+h( zAqp^j8Mo8*yt@$9&E_`Ml$HsI3vrD{@Uz-)A2|oD&fy;1sXKeELpu5UvKvl*H0>S< zFlnCceCJyXLiHw@Sf>*YA~^kcwIujLuFx~V4<_?G3@(xbmyyS~y1BEhVr)usveM3E zTvEet3gUO?unM z(5=vxAj25UCb!5r-@qj@67nq;#B8(%Qx+>n8m+$}=nh#eGa%onDkn5yHeM05;*y@J zY!#+jDqWf>l#FQ-%3e9flOPOl={S1L{L%cmJfAKPfCx9H(PD`6Xkf5nf8<5vo)u4m z8`zK9P1Z1%iSiF!9LMH+> zx+0|fwh9cBLP?5SWdp0s94pI%uCa5WhV4?b9Ep^+_%qwqBh=50`xRE=%(JGXWk)|% z@>%v%hgMfCb&3>doT;~w-lI}S4ix@YHybedBgO@xzY}>OR5USEB0mlROmtO)y)*JD z1{4$M;C>=S7;|DsB-OI_EIO_rcoynin1=~&o$B|AM)-TJTihw`94_A^-@?NAw4yIgiKK2ezkJ_d@WW|t0L8Vk!xn<4VR7_FD z6kr*Mn2~I+cXWKx?)TgKcL%rzr#UQc443DM>jZ|~9@UXh%V#W|!~F^|6ryXczG zjJds!M(emwS=wvu%09$qV(twK=#1KY91<4?!2Np00wv15*h?mWi+K95Y{#vWe%m?j zb-IJTiH0C22!!DP4%Y*OfsuzJ?Cco(sv0SlN*ox2o8HHB!t_&D&vIn@IYL~1jB^GR zOXZ5Jm?8;LalC+&j?Wix*G%HU5RHMH+Xn6lU<%?YXUwH-!JpVh1}CpA+FwO&v8mIy zS5AI}0N!9l;U8X;W43@EqvJcdD) zJS|PkV2=oWv7-@=B%CSscG^WT+7QyS1 z;|{pu88G?q&0_q%HSw=JtMV(8-~IX%aL9NeVrbX+wX#AS3-1N_(_s*?FzzE#EJ%l_ zRrTr@b*r*R*A!q=J7YB4pbUq|M>7jl5d(C_B7$)9ulkBne0Sr|wls{C7cUI%(Rtw??&UGP)c*fw>Oa8sx19e^V_Wn8X}sKc^8fj! z_Wyq&pWlpok3aM0&LnV0?)8N*lC0)=t@3i!|4?VurTC9Yfa8ZzfTj4qsr&zJZfOS^_{mQ{n(S$c!Ov#<+ zeyA>*`3K@VaxP>4;xSr6Z{$V%7%fpA?uRu*Hn|UNA_$+Dxj!)e%L8%%7t{Zpt*uQK z|6%jx%gwFEOQ8Q-&Bhb|_r(8wrTo7l`7bu&q@)G6yEzAN`A{==$)~HQ%gw&Qs<9TA z;;hqcZYOc>x`Y0pH8|~C)$X8m+_9cJPIpecqGT#1g4tAMTU!2*Sw`0+lUV*js=qgJ z;Sgjxo{znbsYr1Hhm_uwx4;T9D{J-w2(|DN=Qh~yeKa6(nf4c5HD;6@jnB*XF;B%% z%edJthL>2M;_9-k#DeXTbF0ris(EA%L;75t^vJsakR9}@tZLzaYN)TF8Hl4{%|a_M zXMm@Z6qNO-ebhVo*?HIMclMl4mpmfT#r7RTBZ2$~^u^&|Iof~_t(I{eUQ8vmh zGDC8tLY!Y*8;qGa;-mS{>FzswNBf7JE_cdhPtNwGU+wP4&PlIZTlun^ZW3=U1yDvR zktBm)iElmYg7#79k0_fgkGG7OrFrI7Y=%>qklw*Y3K!@XL|)Tm^FLcmEZBone@4WG zX#%+!-V{y`L9QYX-Udm&XD$7+wITNl;E0sZ)H&}KE}6i9(uR*&LfT+~2~29()>=bu zf#noN&nqd7a3&xz5@D~@uE)_!fv|FoCW==S|H-d=M!LV}&uOajiy6^s{W)_xO>$$y z_kS$>IUX<5aN>QIGXh5*CGw8Z&5P%bp;Q*8trX~Ia~pqRX6BhV z0J&u+BXOd+iF=Dgj^#7w!9{`c#Y}MxpNmi=tHG(c@g|dcGO{xaxqZVXg>@*P)xm_S z96%^O^Vng!NDUr`u;BsOco~@9m`>gdSmwTYwfw$0aD{#IGQ4j?*A_4*7{*0u1U3U= z*F0(MEVzM|Qsx1QAuuAuyWka)akPM^xUnu7&%t_QtIDE7!OWine*-*En&TRGCh#i} zokZ-;nT*Aq3>UzyASp@g6)2j>7&BK(-Ht{ic7kn;eG5<1sh3i{aWI(#Hzmu_aKO%kHJGF|=yi=p zDp|wWuxr71Ey?=2o@oy#&+rPFzcIi`Ah_#|?TyCf4~-wPo!{KlN6{!aKaZ&>P~ylP z!synT+iS4!YvN+kc(n~}{LpMF*|$0INE2;qj1#klB1%}mDp}n*?T?(-uyJJ93(+30 zgbsxK^krE|pm@P6(Gq8Y{5zO^a!D$JSb zHNXQ6H@77(s~fKsc?7-m5O%RO5S}uB0Fu? zdcx2$fdyxnq?zDn4?`yhksu8>p9p9YufU{UPCyrAf(&y7rwu1FNREM`FtcfYEYmH_ zSRzQ8pkX4a4=@#H!5ME24sSG|s*63!hK5U!xBpU$x`ZuEIY0J*rar@gh>vSlC4Y1|Ls0Sq0+PUp9}DVsJD$g1bAWs$iTj^Tr1_ z2c6cTv)4QRxrT0l5An5r^>XKHc+HDB604Ok#Bu28jaF z+gR0?d1(!?Zd$$NU9lBTO8wicvwAnpIRy5k z{*KN@!(?+dp|CQOQS9af9LfXyZ2w+BFCvU6w(lb|2-_M>76tUX<)JsVa<5_VYxjMI z!g63O>5b=YWj<9YD*|Mk6X_+#FEYcdWJ0)!K6KdGBF>xl-ki^gcmlL@HDzov{+xOP zDM4P9IiI^pWYjiGo^>gZn4#{O(!25CD?Z%}$DueW<%5qOZ5bgJlnu{)!3pv+5+8c! z^235N5(_I^1?wrqeL3r$J@<)HE@#<)%?m&T8wAU7Q5G)Xp?_}n9I4FaBe+|`e-+|! ziaRxV{oQwf*)XD+*DYdz_r00#jj9#6c78v%NNZ=Y%abGyhmAtlDcBvfH!68ykqo{- zCR=4`WX4-g;i8%EMPF^X4BZth)E$QN=Uk!{l{Ke}NAVUk1pLe8ulS31ZtM?@_mPxq zLegPAgpoJGw}vy?5OHzIMdc2c746bu-a<=fD`yI9HBi|-Sz+%ycl``I^DZk#GhRRT z&LuIvY1xpt=Pw(+{R5Uwx>lCO;fG%~9(%%ZuCf;n)0}H(Wd8JP1^>(lWSYI~?du^( z^YB{*9X$G^8ZHwhxpA%TquwQQK+V5G)XKyBhuk2{1AvReUGEKv^bxg083tEq2vBGa z$LWmJF|oCX6Q1{<%Q;^pmI~MFAU2m`c^z$xyT$`~sU$F;w3Ir5@$^-nr01?75{jO= z`f({nc^P5$Of5$d3eVAp%8+2nmL8jiQ?#^{$UFbf6%73WB0!kmGKX;SnS4Ky-;==a zK>|N@GVgyZe^mjW-c|mATpHRxN}#9pdxxVql~|D>2;7h5{&2w!ir6~}xgPoYY~HX+ zm?w#~NR&^-7Gt^@7qel>hOEyK`6XIh6d49XN-|}=ur_N}LsDysQduDcL)LDx3m3iY>lA)~kBsMV<*D2bsHeP!4M;8>VWoXEw|$vQ;@f>~-JcqQY5~1|`jyc%-3; zEzOEWvTwmxXH-gld3@UK?Dh8BPJeLHfxhO`P&LhA*|Xy$e-MTo=AcSEfV4tTy}2Rh zJL{hgI)_LiKekV-AFcHFe($XBymA^wB@hq2t#eYJhtA1jhKYbEzz#+RG%Z&Nq_n8${aTd4fw?)5QT#DlCdX(A zNgJx9R*?_vSu!w|`NrwN9zQtjo#Da%tHG)#TVv4cIsK#7;bDm?xa*w5cK7|@C+DaG zwFY}XeN_XaLg7Kq^kAHAWWCUyS~9`a88f!Wz6x8W;TI>-e;i`zEEgZDj$bR1c=lUZ zkC}&2a)~L)kT4wfd31DkcvQ7B#g>^8&XU{=V+_p)71rKz^Nck9nsiWA`Qc?t?0jOx zMel5N|L}?r+d&k>YZ$YTprTR1KguxgX1FgZYT&=%{8gZ4MY23n0kf6QyOn3b?#<~L zc{e?uBZcITJdB>}%@WgWk)4wzc$C~sunA(g6E72rJqRG78wiatFM}iA9ywmi{1!4N zi`a8e0La%qt;<4TXZRw%cIk7;0=h7Jfy6|~1r{uwsb+JGd04II@$aqZB2yiqp0y~_ zoS!~H%X)`WK5)rAec)wBOf2%ZlGVN7o-wx)bJn28=UzM)3^KnqVS0n}fTB~!)*Q}p z^y5gKeo~2{<&M#rW{61wMX!AESbXXOjGa9LnuCeySUE5CGea#wyofR4BRbrK6e5rt z_EVP5gf9Ct%ZCkuBf{s48E)O*G4WX4>ddW#$D_ceVdP)?6Ym0jQh;Y;JaMiiIt+Yq zfjObk(jTbExjVeF8Sbo=Vr;_2WU}7a`r(yU=X?@e)IW!_*c(#C%iv~h9<1SZ_tx;H zu{I3O;YzZG6!OYrni9##if>dTRt*Vf`Ld^MX~xTlwz}f=Wv#Lc29uT;61ZktHC$Y% zT|-L&>rrXBd^kY8`jjj+78XI+q3kJib1w za+nB7B%q{Pc?7?}oGjZ<=IEo5X}k^Zkp?#+54R|CZ&6969(y%(Wf8fVJQsIN&%VMvRTGaAZC$}(bFK3vJDCHVT{g_b2FrDeyr zJWaF1Bo`xZ4-UF?1%B~=Q>97#gqI8Gf&S$Vbbzx!OA(&??STW=up=dmtY4ELR`Y+E zNOBSp5>Y}5Xq9@rD$cx~8tnKSedINu2-g-#1eYea{Q`JBdA#t^aUkkog^D6w>C z;3=JRZr+U2GxL#-$&~`>u1>Sg_BATAl%@zQx*_I{;T!ogb3793E3u+%6gj(=b4!W?oLql9fKF1hz( zlz2bia?yqR@tnd-1GH1?(8#)ZXNf3?gOz(3>##lh{WrXJfQu_ zBvzd<*|Ov22o|v^76awHo>3mnIkusTPT{nJ^SC2BWLjkE%shR4o|jE9M%E2_n~vRh zt^|fiW#i04j6wu(aj6i*VqzRjEXloyF{cho%N<+jx=4<-iH{?Jx|mb;l)#Ho2_^En zW1{bb!^7-F=!zOdEawK!>V~bmhVvC^)L2rJ4F+n)nOo#!Nj$m@uG|z%LcUTItsbIH zvCf>i3}QKP%l)V9@yO)67;e>fC#(d|NxkuTdt;+W-pg8+uhxmMn76{q6~NDzV^>z4 z^+gZ^4W?aHiZe~5IQ;$B5##Vs+L)g%M|Ec2<*H1Cz0M1|QKTtL$EO(sWd@!r^32Hj z44Eu4m5h?U9GiyhEnkJcV6|kx^H**8>fOiQ-H?B1nP&W%^;JY<+1-=3VahsKN~rWB z;_@aXCQbK=0pVr5WlU(Ip5PjjgU(5RAn;gS@KGSm0_7qjV&EJPPHf)J+FLjg;j$+N zMJ5IkFChLTn#S!Jh(hQ^-ifVsZZO0U^f;@)<@j9946fV$l#Y$RwUgu--Jri13W-!T zcipV&ETAKTLLViIr6^zSEjm*Jv!u$)qQm(wavIlDVIIbNpcExMmQt)mNRUVQn#Yk^ zqa2a*OFUiUs?8n^=bs&Bvg9StuozRa!6U1hNMm@7aN(e0&-jicOZ3|CRt`^^ean;( z>|od4nmFc^3%E-bS-_+_oVP^>xG(>ZXE9X(kAekW6<}c_niA#d6~+jgWS>h@m@n2W zlXldBD=1Gd*1@YB5)nH;{VHqA$YwEtQ<%60a(pYwt)Yu966)4nV8o%`c)+$HlV&6h zDf9T^OgjgwxepxZ_IBH3b5{GDS-+`@n0ox(K$;2h8 zCd;%(mGGIG2wW2jD(R%YgVFP_I#p(zmZC!C>S{C^`5)-70zW^9ze-JVAvPB6h(9W- znD!;`GX2pW(&L&rWf?}m;>UmyL2Cupy}UXUw?y%zjRaR~#TLRSSO^zXoOV^xfP{3l z5)H88Y7^2DFKvQpOO)zW*lBhiO{-<5fuFhZhVJw%aTaFR2DL}M5cvR%N{Geke_OaC z#Qhqp?gv&x^|O`FB48o%YqQEXIhC>J0U{L;_-x0bXG#a1({p}p-g8dn9@3CyU%I121TLg0#d&U8bj)P!wihU>mf744tzQ!pvl) z@LD6YfM1@%K7XzF&zD~z{_{p-r=iFH-)e5`JjH*0ivN7){2$*jw$UteIu-&0xJL6^ zMz!F+YfBYuy=6t+%^N7JUp*!pth8JC&UEj- zZR<4`BB5fz`nrk*qjDi9L)#KVsk~Z>nmDIWR<&p-SX!d;SIjq1D*xl~VSOy2|IO{K z&20Y1C;I=C|HTmW|G*UO9}5fji6eIgJS7<=bY`fC#;;7A-8$~vHK2d`FdSXd39|yM zDVKO-cHqxpFhgTe3Ko6i;p6~J)8LvUL>PY>dE>uhoN&rvOwy*9Q8~H8^zYD+C4+D4PR56tB0&N)W@2~|niIlt2NkRz+GiVJP99+WUP>Acfi*~ED zQYf0AQwa2FNO{&>bR}gv{>V!L5_3aJY^GtY`5jI=Q zDj|JgC$LaX{dqn)qwl$`a;6|?UKzztB0VqWQd z5}dDZZSOQ+HavG@{KMwXtMPVY!#m&Dd3pZB&>O*j?U+dDtJ+I|IHzxtsG6<)pk zVFzk&{jkl~oQW7si*)YIZ#)l>%Ec?Qg~MgC0(3FNuo$p64skvb82YWFboB4F4iDe8_C8p+$6MDIdt9|qWt_p~ z9uov5=05vBIR{4rXRmk4fjVtlBR>u&?kx!pReb^TnZ~Aflj__M!Ha|+6MRGQA#zo^0*^#Qr91zOt+6DnE> ze~hupnJcp}hQ7v{!a!ua0OFEJg%RXuZ@8By*CxwSVRj>y#kkT`z+h$A>TI(3>``HL zb>&~r4cPEPY5cj&hc@aP)>^g-pAL1i$iJQ&Q0K1Q>}0xWsQold9X0OJQ-iuPTPqs# z5SP=+aRavacfQTg;~(HZto-^bQ^NlGD`&8QhW~Bh!DeCc04kZy9!p`n$>@u`Hpw5* zx+JwOf5f+Tf_J;Jf2Vg1bD})Cas4?HmP=ZL&`A&v0 zL(SG`)SjUwssQY)%38xr>eBr1js(?^?5yw7DGe0OxJkU-#$RF_2d%??JNY=Q;1)SW zbY{gWQkT4yC1%}{2Q|>2LpPq26JOQNW^0ixf91*93nmlTJuE$>J9jaY44<3~4X?4m z-FIe~X(DEZL52PqEI&}pK9I7B$F^`vD_7IakzN3)^Ymx+tknSwLXFgkI0`=E7tIFN&#(`e9s^J^^5@vU>x9-N+Z zoo=t&R?Rk+`OqtEDz+Mof%B%EPit6HIJ4)#UheR3#LYF5Uv#=~9+a#sgjNn{#y^N= zOj!P<#IuPpro_|#KNI!(eKh0-k!qOLykSQ^xK` zz?MY7mJob&(#1vgzam3>Im*eWPt_<^s-w}!uGHl7tR|m2HRWiq|8s=MOYi@~aPf8T z|C>!<-81+9##8?Hr~Ch1^S>G|?#IDR1iaF?WPU!)ITYcTkscdII0-I%pnRBVgraop z9iPT^QFH^(6#(C3*~0kT^gRz*?%{%*^euP(I`zO?T*P%|y+QYV3PG^7)o3=qo5mMg zaKGGY$Z;h_bM*ojuA@-BKDrTx6bUS`ajt&6$6T4>l;p%J$&{&RqocjYByw;HN501}gozp| zIjg|WYZ`&(oJ}pnoGGD}02n5SN^MlhkP4kq(Ziie)+`_RPO_dPThKcCTDZWuOy+*d z0Ex26Z9C1aM*=auP!*yaZN3`<oj~ zZmLtW$%QFeAqOqS=@i4ea>e;CYq^ZATWOwaPu4w3wn^hTllxDVU zpJ}gZWvyR9$v>nfU8w~$O}JvO< zi=42t*31;ERgmeFOG=61ihR(SI2Jj4j&$G`2A&e(d16X`D!kWA&$DPI%@|oD7evhK zm_W|Wdhn*00JMjL#{U&t{{pKI@qPD@wp`h<2W!%y_<_}&JDi4Ke z8kANHu&{lU3&nmoEZM)_v#2TcDcdGr6|y@RT!2di{9G?WLh@DMTh?CR!mz zN>YNFB<(D32qt9ju-!VTCUq35NS432E%NPtRUx|^W<+ie-sHs}5htzYMw#tZm(3ex zMNC9g6EdShE)_Xcx+OcjbV*Lt#1t;&xi&I9mm0^y%&d2SQK!Z0TVuW=G>gK|;W-Kzz0ZXABYXMWV&ix6iWDi9 zg{|XZ?|o;lC5x^k#>8oVGKH@#T{oPo6&VOjLzAA;>?unVu0NGTdy;2ojL2~zEsKjbzq(~6Mad3`@r&Mw2m*OSSRQo3C@ae!r~1nfg~BMyUWVL> z=(DmUK}oJETshlWbIuGl_oGMBV02P;Jm-kPiQM0c<2&*NlD>4IS!C%FAQO|8?2L*$96kJcy1jW%&kzsdy>4&&G z#cxTC5qbJ%We3NLH)_ZWc`D8@l7l#P-tZZ&0WbaiHL}w#no%-~HaDJYViZB!0d783 zLczxtF`YQx0Xn$jSkkyX%ylgHAk#{J$#WLdIG&8r+%lf0oZe^|uF*+g-MF!}Q9$_% zcql$b3CZpg5JW#|GMpK*V5E7B=l-yeb;VL;IjdqJX})Mwm5e?_s+ua-25?@T9uL&= z$!%9n3Xs;%lf=r>S_*#w90**pB#unP%iCRpy8&O9!RjKi*@zBL`D55^!yTjCg0mM9QQV zC&t|VBS^vTye~|UNS23%Z?$bwI0=82Jz^Tsk{wcBgiJIM&UjNNTrQ?G}kVb0o)=EBLD@N7dR} zEhbdWFb>JYI$>-k!R*3DG}W48la0pNaT1n63rH6m#HaoenyytSn39J|XpyBIqnVpG z8{QUiv{qKrfE1le)sdBZH4c$GDIFsjX9>skEZVD z-C{v7lkI6zRxXNuAVX=i2WW}hIXJMooHIouI0e(j`%Pz}iZk=vrr6}vLG|!>aKa)X zD+DNfml4K1#8e4o0E|1XOCAuo|GV>J3{Yq!%chGT%iBjDDjdcP^htJtf^=eKtnw0q zV1`rh``lQs9NTw7>E`&J;b(5)zPCd;!zpZ2++#>Wj@-{jm%s1Iere(r&vKf)PD9a$ zNq~R?Ya*n6qRAR|X`oJGOBIB@58oNW%LsDvA87v{doZW|{Pv!)UrPA@Z|v;s{2#Ra zZ#Lk6JB|OdvAOy3<@S^P|5N;z!cYKxzB7|Z08)rqVCIB&DukCv{j6%Aa&;!jcjCqH z(sE>An`-gq!JO#LI;zw{=d9Kkl@iy-+O$gxvmI89@ZO9qh|{T1k9|KB~4{?6u9yG3o3F&oNhpo|zHr|Nx4PHATcL)|+$OYA;{ z+5C^X{|&zu{eRhLY-sd<^X1MH{eR;B{mt`=be7Zb=afu}TvRfNR8 zQ;t(p!^dumXvR|2(WGeK4Q)#1u+?75}pFTm29Q zfsv$=SjK<@rOOt{E@5gprDInD zeQrb2O8*ND{@UrpJMC`k-C=v*WG!E&z5n}0wFxw}ZLOAR%Kmyg(7ct>ouob|f{=Og zN9{H>{}m_6jPS~_H1Ob}fWLEWzbdGeLZKDi9DhS8QQmuVuEY?zzSPOb$Y}fxHKfiv z`r9+~ZSDWhDaEZ$DD}Vi8w%ToQO>A-X6}ltvb#Np+Q`ep$3X00HuX5bFb93$`m5rQ zO`oGSHb1>y!MbTpR}99(xpvTB44@Xz=7VR|JWHiUszY|qp%$7*KNtuj0ACC!!)8Un zo9n5F90Pftdz)3M5&Z8&?VaW3a$%ZdOQZ1pE!Q(S{2Du zrxH#)I1z{eM89ux*s$CS*Pq2g;BK8SE->}c@XCvL97M%97a)@Kts0&rf$&;nz~bz; zyPdWaaE{IQnH!-IucC*=XK*gnENH)GH4^h$EWZa(M^!bP0jcACIpdx-6LG+J;TzAo zbgw;fZNW*M4Ke-Q7#pFq_fkSTd~w5hYs%z8?t*cRyG3HjDQ2b>g|Lm*XzI`W7$!^v z0wygeH!C7;UbxGQf?-^r`WWvd7|$sPFK3L`V68_tZse_xfEGiS>onIFUc|nvB_}$z zC(`?QpMk8*+4;_QhCd}Y9s~o%JqmD>3?nzb)N({iv5!>!iiuLoktq|}T|n(^lL;5_ zDV5|%si4yia+I!=npZb*l29UZDs5!4Z5pox;w}K^KJ5&r+d66kC8JETx|zTuK*-@a z@i1Z9ARyY$U+qnT*ki#QIar32l24M9e^>cWFuaN%76GtW{F)_b_>|R?!I#bU+xu5 z@Fw1z4?{mJDf>xFh%`!AAZB7A0UH{(_0L+z&T0Rr-pQc)*+v(zD*I*Q&mVuZUfIB{ zDi7bjg@-oW0XII6;V;cl!*g(-cDXI?!RaBC+2hK#l@(?>c;O6&;Q(*E{lptsyg41| zZ)oPb0fv}84;FL0>9jx3z1hec{Q~X$3u^pERT6iS*Vbr3{<(}DN%$0O=-i|12rPzT zz!rPz4leFWLXztqL7POf#$5({Kg-$@JD19 zSY-*D?Rv`Yvv~ZDBefwm56jeTjoqm~xmCUADawAD=!X`~Z2CIbJ9Y*r(s1?;Tm3#E zHww?v=e@IT`vepAI<3Uol-rf68(Fdwrq>#$WEuezRIbL9Mvw>hX5*MjtOYAnVp9{wG^o>IfL?4vaKo@IrE=ECJ=40O&e^2^i*_nKojr6M1R zkOk}Cwz^Kn&>^GCte(|t3prq2^x)$vq5 zR?6dP0{u6`Q|&nX6X9txH~)@!Dh78KJk4@0MR=M_-(%pZXlxmt3N|fa7H2aUJe=rb zCpiB*MhE#-3smH^4q%Gg1A903Rny+hyz2M%J~;isNxOBF_jdpN3BJ_bWL%3PKmxZl z1GXxNt}vO@%;U<{0C*t5&~vsf$CC!l-=vx)9cnlsLnkC_2Fw!~??ETOZ2tyJ`cL$s z;QzP2D3NZ2MvhEy{gESQ!jb5j8lLB<^UeW2LnB=laQWMVlnPQYAaQ!J#VA`0T5B4b zYZ{ts8rqY~affj(hryIEd@h)i0?F%sY3}@%SKtIl%iLonio${B#0#apxg@5jJ9glH zHrJybDN#vpLvLvzgq!u{Oh^n_res9p%PA^wgM~YV-Q=LC9KTenzz2JjI58cJo)Dn4U5RGGgm zq@&p~8U@YtZob#3l+(=VE{*t@9I?=ibm1^LV<$z|-cmLMOk3=GS@-Nh)KoxC8>Ft$ zi+gm_yFuhQW|a|5bAo!o3e5f4!do7zYo%Pr%(E3%g;YC05{=y!)ICPsnHt8?th-JE zFwrI;Zee#NQwkr~`_5tp|4_L%))K(8Q*kn%bi(WH7UM?-0i(sO>MAx^GcYm+CAoP& z7sO6YW2nZyofFF}+q1cxE|*<0{dzF8a)H`%21w_(LJAA^l(7*L78=6E=6WkWsk9F}{Xx6S6x#6f=F%TtT0>Of-*_w^ zu75GZJGn1KPD`k;d9E2ddrv%Jl~Y8~>2^ZD&DAklg@-jci%;nl+YTG1{Rg96IuQ@U zJJ!xp#7ho|$HY9=_d`%GUD4&Zw`6^C$NK<86s_DD6ZJEG$*fnZzVCOte#bQJYmMwP zetKtLNK8qs45_M>n#XLZ0t_o#I611dRT1H<(+Mn|c)f06ENiLJ@~z5&t)&Kxkrp$e zHZvobVPKp0;a{7N%)n;aVU(z;Q=%mL!e5Z%Z9bUgZI)+wo4G7+feB|B*0=dhSl_8P z9Zo}I|BGS5NY)gYU(ISXZ6hF@0kF)&xhGTHEIgiZ0O74TNSBVI(X{hU=jOi^SKNH! zivJj{xDbOcMFG7h!jj&XH7RNaaP_sm50({*WGUE^B&%%r<{VY>RQ=mW-~Nll{~bQ8 zk0t)Un_Ep5|7~kyv$46ggYiF`&6iL9zfb*I{D1zD*dQfGojad<(ymVZqAZX(?tW2r6LYdU7$yc!_UcBHei%7g$2K3cctD0=8 zAFVB0c3nv7Ka*V23euqH%Wm|`$}XX;L32GC`9o&)zYkyNGGQAEA`zs_vAIoQ37l`00HvM-tRJ1%%q+Ju%zP>=`6Xlt zQm#8pW?JO!BDiiNH!>u+n>8KsxDPI`F@_aVEcE0jc2D7>8a zzg{G&SIJS&W?j~-V&GV*wYQWpZ0usrw~SF1e{2=nZ*=Tax09!z$zlA1LU~h);#G6%%D%hE9 z;xasC<byt(ZWUxC+mbDq`dY|Xn zoZ=atOA*W9P*t&vDl^fb&%Wfao8&0iw)qG$3sW+XO5{AJhCD~b$rQVtz1T{Q#(EJ8 zQ!)VyC#p&^Ltnp|FkgK>KP*r-lsge=75O9RcIw7g9qA1VOBv21=_lTt2)17u8=Kp| z>2Id)F#jd*LVj6%sTu||jIQU6L{%woIDg`t`*R+QTT|A0P|1JM5arZISepl zI)BX{OY~Dgr#$|%h&TO~=i0rGH93~dQEN{SJGDWr^W)3g*yp-Bcm((S3%LG0Gr4uo z(X>XUGb&T}oE7-~*NyMh7rH993iQvmN&#Y2?~0*N0_&0kT0^_F99?cq(M88jT!j(T zEOvbbE?yq04VU!)s&9V!byg|njA?L7VEV=X&0eNBE>H{J73Q@+5Mm$(@C)(vL5t@K0ROUKAkHEPfA!JkQs zDl?}h6)RBz5^>-7lZkcirRTYY`A10p+B$F!JKYba#-%wl=~QW8tP^npr0r5QkP9MT91Xz zaL#R~0Mbr&@e5Zq-5F{BHRWzryes6bAm+r*hmv-L0;*lu{IbpQr7Xu{MBiq4{B3ds zZkjQ;`A4B}Gr{2|A#syqaaq(&k^PUu;yW>saC+Q$R(y#`E?`q*tX>Snj{${OiY8Yf z4XMoOE;f=Y-@#Cie|C;q|I<5hKDJN#onF^^3!Gz~k(XcxN#yYgKodV--1 zRxiJa*~lLoPbImXJifA!w-gPjBt$xX%g>8o0{=gI@BW^~kt__qKl4{i@RJA>gaAp% zmex5hmQc(w297{cvRXg$j9`#v1q_)1U9!jT-~LrqU#5GeX8>7F_MFe&jV(>ztE=nQ z)m73IkPe%Of||i&=qd$7YEMQeea=F-Rg!VaT&SuMi=H#UI(60;(N~G-D@FB4WJ+zE zDu(N@Dy6~vIa2o*NZwrfHsXDj2)>H8JzErC)$uBkJYFX$k{j*%@~GsVNk~npl~!CV ze3dJLr01q?3tVNz&v38QuM@J}J0p;9azmjBk1004h_1e-6P_iTO(Y;FAu-|7^_<>4Ua z>Ao5+Y`~<;Nh&m+>vR(Rjplsk&ZU^Ilz^0+!k|qA5|Km;36nEiES-sHiCIEW%ztoZ zJVpn-ii>-ctN?6rU0=5}_ck#?+^H>}i5dW& zttTgI+geT5h&jzB4F?;Dk$Pjgm(#{KYzXFN!WH77Vzs8O0|;zB5+mOYF}os4jqz^i zegn>736LC)Ms#LN)Fq}IBIyf9f;CSj=+&=U!FfMY&g17byz}OXm_|u^hHi<+yhii? z&_E%*!A1|=xf@{MlO?fd?jhLif%wA{PT&Ky=EYK|lC&W6Et$Lo}yJ}#Cy!}XQ$&J)0Ralba%@r(Mk$zBcWrY?BBfR~y;9z)4E z?xL2dI%fK>34tKh7i|zrJF~gR+qXA_U-te_Ph2>B`S*X->Rz=P%m2A|c=+x8-(URx z?>~Wzw?U+v{X0Gd#0u}-$vny|X^odNmS%`Q6@13)zFz3eJ@`Z%r#V|rdopX~mnQpU zR-tY6ec#+0g$4c{#=3Tc?wGmOx}#p}G*n*vU3#;?8NDv|UOl7q|9s%AG z98M58Pon*U!z4Z@xN$9a<}YtWU{mV^(R@fZ{x0OfKTWj2jQ#_wz^wGs4Jk;)`~1YxmK z+mG2md^Ml8h_ zS+agmVO})9l{5fLGr2J3l?VfTNdyDQ%4Z{#cYWtGL0^pUZUFejNC0A+J8>~TZAeEn zaWZ!$R=N(HK3y7F;OjU7H>NtdlXjC4B)>s+O1PerPlb^95l}jR+!&h=eERzA5Y_3bUL^s zG-Cmu{c*f?9+YQT`>oilylyUuCH7LFmfwuDYV@w#hhJv?C2U-u8In`G&Ps+xG0hmP z#SEj(`9W-hMwem5zyA8GwFBJd=^E3Px7uyHaWZKA(i9eAG!p^!yVZj?)xG`N?kg14fK=`uzTT@GzOLC+aQH^s zeKAv(xHOtke6u+$#2V8$n1K`$j<?Zkh<1!x>%^BeuumOSS>_d6)!Zr%9&*+QRi=l zDndI;L5|*emp1gjE}G}R+3nWH)}VO`(!g2w{3BfpnD7Sa0wI+(A|&M(GQvt89Yr{< zP~(XoAo#WXLU?BY#Iun`6PpZA8&=&gC$sHFRT91c1(f-6I z-Rp^ey*mYZ?*?!b?a}B?iE76$sF4@h?Plla!F&5-s}Ef1*C z<$<~e-L4G{K^Qc&tL-J*#l&_)qgt|2r#rCEx)&W&gIet%b#@|*nBMF)TNE}!Xukcz zKRIsm4_~CS+$+Fd*mf?phoX9GMFX1%&Rw$6a3}<^Auj`c(91v_7Jf4f zd>NRAz6@f6Uk0Y(??HR+IbI+>{MXW5%CXz?;ki3>mD$mkxp-u98T{e}Xz63;PMvah zDaSa+N&Io|FGKO=gZt!;XlU^zfgXXt;938{nTwAn^W`~I!t4owKapSY-e$SzqctoV z0+{Y3ngZj>vh!tl+xDZ{AD1BSMIZn+imsq?E~j2N$4kFfG~pg>({!%P_cza-j1qfr z20Tpb{O6?;z?Nv=;M4#+mu(soH(0!TV#wW!CczH{A6YvHcrxIygg^)294LrQ$3Xf0 z_{Eq;pUEEOm*E@G$#A~pPZEkHG!4kF=ENEMO6zm#Nw%a4mO@dR z&;aQb8uyMjLGw5gn@}w|@uyR70Vgx1r0v09>gS&8+_54wC2A$m!d>9h zA`)d0H%m5ihPQ4;`Kdbvo{51W6Gb=|1ZrwQ%Qp{aY(yo77N`a}hGt)E<-V)Y3##{J@2*g*7ghIV|+aE+}75hlJIQAO({ zy^moadM(F*(YOf0pO(*^phh&W#)*sPo|$YV*S1WE~L1sWOkP&5`93L9}wosDP}jv=WvI+#@j3Z0z3P-0E=0BsObxvQ!*Rm~`@$ zyTrS>s(wl?QJ+b2b$YpBVJB^ROWHcE=@)|9-W#xjse?G7s0SQA`V9sXMj-i7sT|pv zqEe-G>K1S#in6epQ44v#jzyU2#o`0_0KCwj$&nEpEb)-qvRX#j-a5#%J{ram7$X38Pn($FyoD<16!KpPVlKdR0Q2ot4m}K`9A1pK+^r-31`OXUF+{a=19xs z);fHVt(7IdGp_}c`m6L7nb{K^W)%I`5;PoaE|rFhP-+BPomJ(~hpG*wRLib{MR>br zDB)8~DP`AbSRvI&l4b(YYo!`O^lGW*kmQ&vtvBo0c+xC9=@f>abe(USNQgoUO~pxK zXsDIde}WvE+Gou`3ajJ5{XHqGs&>5YW%FF?m&l_^0*`Zw0p#)H?H|gA6Bgb@{|LWD zMk?75t$Yy^(wZwppRJ6!A>1>HkLhBVZklYn)qCIWiM!v}`ekZY5xE|3mmu2UA_J!(kU%*(ydON;9o9(vzAftuh?(~}PEZC#z zXaXCJCgb752>)?s_g>)7(i99#xGDw0YBWD4Ux?3AUB2&1WmNY=mL#Q>5Zj7;Srg`-JdAUyFjx zQt`pxodLSzJyz!#Wbm`-Tk?B(r7DG$fzGBtDQI7 zRHy&G)q~Yfh?j)7-dyGS5y!S0oo?s1kKKztW<%(9jE6m?cP`PWkG?w>9~*WDaagMf zL=u?vNO{?R(l~h^t3>9{=wc9 z_10{l(WEI|gWAi`bZ$O2KXyUM1Q>sS18n!31N&XOd-5Tn%>w8aEYl-Iun z*_YTclW=)avMo4nMpvBSKM$Rjv2eSYTx@}J^+l^fU0oNHB0LTdZY$PLiU z%)e#{5@IKNP5}Fbxg3v$pEw*1e8=HVMq#;JMx1NDigEUw}>8i zlc5tImpIm5jfx7F{$+i?sJb>mYkX~oe&$Q^v2;ac1{r+TJ#n7=<)WNohi0Ox8l;?m z0!du`%6R5GN=1tZsUz!NEolMFmP1*8tK?8vOu8h>x>#Qlh0Zc$Q7Bz0jpB6T@~C(c zzDgQh8$=u8ZPf_SJ=qQW-WKt^xy556eBBf5k!pPR6%S$6sHH@U;b&7U=Bpn{{p1-B zr+#j8EJ%3#Q1VLgLrDU#V}<-hjEHf8oj_wWGFX^efHBzU1Pd=&tI$EOWoz5+EXbP@ ztsJA{LqlrP$MTZShEvfiewL{N|6p(9q~!RSsv_1tS^DrTj1UqgqOX)%T@Iuc2z;YPFrr^~bhs>12x zOL-vT#ia#+VA9sqA1yKO^aN)P)MJ4U`q6#xg*+7Bb-QgKc&!ejEchPHzrn|sQqxsj zt(%WUtFVp|9wnK2`-24#n{O!Dpu50leJbZhpoTa=tLlZ?POv9pu&GG z-QY=Sa4DA0>1!YHEKtd7%r3;8T%|z;*Lu=!^!rvch|>Sb#L>y|+*nN=%2 zJPn8$tIY&OE@$FP@oM5NptXuGX@W`?NRm~uJJ4W}jZdl5x6)UZ0S4wtqBIduP#sOO zmYS$h%4%-d^c4$DbYZ1V-MmcwDayagUh6A0&e2Mnd@k2RYqMCRWuGr5n4F2rCj*}a za&Cx4#`3yuH)QrI>Zh;HC8ev>F;eDIUpbe$c{07^Wa?>?sV67HfUeL<3cA2vI1Pq# z7Tl3fg;Ou_Sv!4m9y^;cY-B&z-C(2%oz`;F81pwYCq3@W!ssUTryz>%yA$IM@#z`o zoV~J(k#S|>^B1h_;`9YpCgx$Bvs@W4-1fW1$p^;Z8$*1UBN-wYUB&XKKG~d^h#wo) z)YMArGnbLJybjjM9s>xt*_8Bmk0OQkAS`jq9 z>UAq?gKHJ-Ox-ap9l@u_h!R5pN2`^@Jlf_pk8<|F0^IQbq(cm z@lYtY9PA}@=MJ9|*?U<~iyId<;m)J{S>9L;$~*L@^N9=fF{~GKQms^`3;-hhq65&M zdQ3?d(QSqA1(I}Jwq#zzJ2ybMg)9pS%m*_~0L+JXN2UlC@|*~2GG9(6y9aL$dDP~U z^X6%5&_A+#z$9_&R}2=)nOn1o&5j)B=+16v39SW{FVF@bxJtD+ zwpvqX_GCS|P7t!}+ze4+LKurc#)_t$xZy$CSU|OjD=`TH!Lq|VxB;Ttjzj4*Mue&u z02rHKMxBjEf^|yM?}w^?!^GNpIIg8=Hcgwe+?k_88U{< zN8;LDJh(2y=Nd;dz?fd_y7`9Mo&kV5YT~b44!OEFw3N_ac#Z_eC}h41u(o+M5l@PD z#)J%yMOa`4K9OeakrG23ntbff-?2)v6ExX~du&&j96Js4Kb)X!hqjXQ~zcqAf%2$wcO@M4kMquq|@_zIE;0h?m4FNxSa6>qjR0X4Gv&tnapN7RMP|V0r$ufgT_^Nx3j~H1Yr>`-L{6B$N3)UGu~P7a}Qy(YFgc9PxHh*36(zNm>+r zb%32s=aeh{wTVVm9&3W~C8+UA`V?>RWqAf=oWqX4aE~l!68bXmF{QK(*#$QWJS7YG zHHbnFw@;M3&FAtBMnf#CL1uAsc$rlo*iw!>^g^`8KQVn* zPskSGfr3&L&2{4Yb3>47Bu1^>F0AdEB`O6W>dp<-{Bs#qtsC>>&+0Q^x3odoYUu{a1OGT3*NybXLqDC5tUo$!Rbd2(c5}aOFV9k zYO!8fa?z!bTzNg1CV%BezZNtRu4Gk87Vxkr_SgBqJ_ntk)oB(D?5Tt@|>FtfB*#i=gf!0I=h*; zoP_czmtqQ$5}~)nRA1gVY33!;sgXTVB*}^E%$D4P%eJ8Jy{c|nu^eLj6C6W!Xu%j3+@FegkmqVXD z{VM#xpV^$8w+7@0*l(U7{-^@2$?o`rf>xwTDxv>XncJA*Nol+DQ#`6lJkwKzgFk5P zMEDf%lg@Vv@{LxJH{JOu=A(@BrGr&mkusTy^QX)C#KXjT{ER24oeb-rED*+sn0A@$Rv})dK{L(ptz$zQtwLNMfciw4${CwvQb3<+lt@eCrSWvasi;Ysdc zX3h=Ff*B;)-_f`V-NQD|FfMANtVo(hj4_%pHD$lS=rAn}M2QJTEuTA0);?id;omu1 z42P>1k=0Bjc;m$~!5d4p=|1Ac9G9j$?0_kE%{Y+vuCUNUG&wqi#Y&R|jU1o?rGTBO^On&)ea|fr*kAQetT}(kjb0(?n zTYWSloSNH?ybxvi5wu3S7)gI4iq{-6?Y0n-U)KXuhB0LfhjqxWNghG7MdvHE2QdMP zep570?p?P#$XeR9?=N-;#A(ap_L7V~*xjY<1!$_MF>=Qk;m+J_Il~yzw2S0+}vSdd<#h>evKc8?}~I zGsy0TCbFuZlWu3w>RhboN~pW5dg~9my;Y0z=j-&+O9L-ue%$D_UW^?x zS*j_0NFA~ra4~}9m!w4%L>9q!r1NPZsusGFamk8)cY+&fS#5SM;HXDPiFf1tjqIhh zJ(n!spcI<8hci)(>eDUka4#EI2X)kHaul+^I+i#q^jU|Nlzo98xeS@WFiTWsI{ zTmdMubRHk8gZOu_023p-)D4LsC27CI$_NS7z>%>UD%&e5Ilo=$c;YrMBVgRyCBpDni9qn!XBEfwBIUkZY$!nWzyCXt zuk|~Tuk~a19ORM4pb;}-#r!$2C%GuS<~VR&rA#5G^0+B0jEYs#P{^Vp+r=p+lo}Rz zhs7i!DJFAC6yoM_^gDJJ7%z{sLOOCFQ?U~$+~p$!=FDXFioT~9HZ{n|6<&Ft%JLWT zgA&He^eV;JKFXovlpxh+n?_&K%b&5RQ`SS)qLeCzMd?#mdvTa78pSz!IgDyL9*W6A z+d@H_dr$Ver8gPTr9vTJ=yr?wlGw{q91h7T@_ts$ZEc$|^;cZok!B4{nW9!FtBegA z_j1AHIS4v3mxSe&dY$pG8;pN3tFCd1y0zD^KD~mv0If^iPRyB@+31_HDvi1&n`SMV z9Vrq9N$x@t!$m37H^$x#a24s6CK8#4M_6~qQWwp>TzfOL`?6m!1z|D6YOa7Y!*mvT>1w8-EP<{h1r-K#2J9>| zQu>`VQVGmT!=8jeA@jIo?N125F4-me%td3B6FiYSvb#`Sk(pgL^#0&n){G&Bp2bW{ zkvE|#F)3?G6LDId{>9l@>x2?hFt^=}WLv|m@|jNQ_&3AqLJH0ci6*%a5`weg@H?6b zRiQBrAlO&TN9pAkn={B(NuetJtgezdV6{6xndOXRQBhfa>X7STyt*177Z%cs#7ZJM zvgRV*c{7IvJTt9BFHKpB9COoE2wIj{g+k=kTn0xEO8#P6NW45{Dbc{|tR<56n51VB zYmlok%X+d$6#BX$h<&PjXhIKT1rBs$nOH?sXfRh3U`7uF5qw#~B8~G(Ipu9bw!~?q z%?1fh6OT-*G>K8M#b#9zYgUEA-=#EVkhE^o1V&nDmJ>ks?0;Qj`oFH6f4ZEhvC4Hs z%Gg4&{qH7eGzPLYgh~DYB}16xVJ+zAxi?x@L}bnWJw!ya1;Bz4!}+>G;{Q|`jjj1B z$Y{!a(1t>qv6n~?fz|07#WOJoK`q^#Yds0>tu#_yv}}5T*Xa)Iv+hObG-lXoF#joT zDhi|+1-gV}bls7_iSbzvK0EHM!y`ssasxpqff8i@nvCTt_07OV$ zHcQJJV5zXx!u(b_9{w4^_Ilg3wzw1Cslra;vJ)1K0tt7frCdddCoM0PZopq4p{zbU zh(IXB6pT0pQ`uZ-cxe`nD4b}z;k>hW`^XK4fj8&goa?b|YV&8^(PgphY|bCKO!QCA zTRn6$gdxM>NUN15R>be*0DJ%cZi^v@@bLijgEZOyN^k-VX)&dy2a~P2^Dk9}3sYfMa zt8pXt&R%c4`l>EDrILI#kt{1F(DFMuVAhi*WP#AzGn9YUck&Vam$K^@y2>GIjUXfB zVa%KcW)x~fL>XajXCv!+xuB;%=(Dv36DQlx7b@K;ZZu|Z*ndAx*=V=<+p3c8)wZU) zt67;LDnwf+ylNxrlZ+_v93r81z6NoCV}9NoT%31+U3Ho-i|whH>(9R);`;MH32&1Y zAr!0shv9R#_iRzG6YUqiO~B9)bQB{ZPQc{YEp55o|~OhL%+{GIQmr9I6A8jz@K=yzD4Q%H;DhsBTc^i`!6V~AI9VV zR%(@R@4vpi|4O|7B6G;L$}Q&JNCcwTp7D43>~_W-^;)Osv&gv|Z^YP&jp19dF>gD^ z5EjB&8Dw)Wa7PXC1PJ4^^VU$$_ClLKE{GcIwVV*3Lvyp;M=xB2>L`pk1G!9X146-y zc3=Pe&)mgzINE)QG4MPb9vq~ee>^UD{`V@iy;>dUM6GgAtNkDA;M@8C>*zn<|Ii=a zJ(KLOP5%$7d;bS%f4vI-JE-FO-%73ijsE|;(SK9T>OsjmfAXy^rZYcpP@TV?O(@oD zPPRdcL6^)Kdx)=Ix~n=AP}W3KI0);t{NE-2iSv({N5|gqOGv6g*k)0(a?6{!Na$F_eBRG3Xuo?hp;ADL;eGs)%3F_X3Jw3np_#Ux6OL z-*C*eJ}F(mHva|0QT$zP4+Csl!`VU?^+;|-iiFq)pEi@LI@Tuwhxkt>YXM z0hL~c(~*sq7j;b05WlnNwYlBhBwgdpDKWcjZ6bg)Q=S!ImHo-k{GMeGvZwC!8Lh(y zXa3BlG;a(DHh$K;Gg!vjUATcgoG)z*@wq{Jso#ve@Xq#pn8gwUqeWd{RuHv|Z7Zz{ zT7~=QKDQ~tFTVHdcY%vX?}rWA#^C=jS`D{vR-8Y9{|~_%QSJPvHWX@O9#wm#9YG5Zbpfh!&GrwWn~Ga!DmWV;-q# z@-zH5H1&c6*iai7GJK_L5`?T^&}udBX6D2?yt}87p;5$AK|EWI$4VujIiqW}^G?hD z*!cB*w?Bx_!XMtb3&ZS&w}6344=23~dNJO&et@6t?Oe3G&GSyPEi0ZR9lAs7M~nTu#9wx;Dx+%UN-^HU;1{(6_^Z6Q=RNRW zl3lz|{0=>mM=PG{2PvnzWiwbI5f!%AJ zMrC_g1~ZJl?0@3pN1qPxQ}tLTZNLgdW(oyViHcCCWYtTwV!ZmqOeDfxO}VwDmT#?{ zYU*t#-E|gNswTSm^bLuFcC=X7ctU9|0Dm92mQ|7NX$VTnLxl`zYk|oIMpPnpMtuYl zIUvyv#O`D}et$U>QFjY@J|eFRRr9N+8P8Od&^mLgway6pK6+DcxE0c)CE#>wM|eeC zvKG!A=GJns2TFbbKP@Qn7I)2qP7ni~5G8i1!DfhQ^59e8JW-h{7{5pxNks?F z^!yMTW6dksA2Y#SFUQdWop27K`C?qa^jQFKlAL$HAMFA<0PG3N5dLOFUh|Cc_d=3l z!j7O-X5!863N$POD@S8`h-vLuRrR4LR8xI5-C2^iZVGZS1&kv^mA~R1kRvW05tun5 z7tnK&K5h>!|I!A?RBk!-S7uL@ocx0S(gw7PFuJDaF(%l+Z`_`Jst~S5Aq3y z*DIr!VG8L{ZG7pZ2UTC&X4L_;h@c(E*|mrvN3V#z ztvC~$+J4UIx9qu9R|eU_5S&xyvSl$3E@nEU9vC&gev%p(>K_&}zae39Zz$8YCQ;#U zik5vhKYmF%V^aU2>D{~-M~}2v{W0L;$OW8z@orw8+q22TJS=8OnVSJOM#=?oK2V6W zSF&i-V@=2iO%yw!ra?Pv`)-mRBjC9KJvR@=`K(P&xPPxj>)V&Tl~mrOQ2?}xF;!Ej zkl`XmOAl7k_VCNBBj#ruFJjS1aVyvKYenfI4CBoSm$-Tw>KTl&=mp-hn;?BR`QHR* zI?YnSjR8B3k3vO=h4W+-As)*!J-DMc8s*o>BUJd|ZgS;)D(?I=u_xYWjTT8$wc1C3 zm+QqB>gL}x0;L{7QtESeleNP@J};UhoHz43zWB(>GpLt0>^FL?{>$6)V>#cS;f@m* zUQjS0E(OvHz7Iz;E0Ewu=V0VstV(^Moprukggj%q zoDetBl4l4Lmt-%I34{_)y+$0^b* z3Yh62kHvWl9p^2U_8EQ#`4Lm}7R#bhcV>l4o>T-^A+BSj5>`>G5|*Y^q|0H8StIU| z#+2id-8KtIb}aK0y2FWsx1=n_ut-G!J^sG*(9*x8VAG&VFA$y&w=Tw)19=Bp!0!t` zc0Zuzeun`UK3=R^Bi{}2azNa$VJRDD>Vt6X34xT9W|;oqa>0^YF3#eyS{z}-TT`*zcBM5N4PTn$keHB>Fc{LDKkj)X9EiCjXk zli0;YtaFjH89C2%in0Lu@iODcoEb-$C_>tGIm*>D^+O>qQ0Dniz^SP4UC z2o@3Agw|Kr`LfWX~)ilYS=$}|+3IPMGjoiEC zJrr-W&I@-sYfJ`Y7t;)P#uI0;aA$Jo*_Hl3@Yy?hk1hNlgdJZzxb95pX^Hn4(0nwq zTxWPI+VYgq1fT`VS|BsdQP6yFf{`elxsMAec8Ni>CE@qT@mVcl>WwjCd=W zD%;<53+N9FVpq`5CsWp1*2N3vti|3oN?99eXV_FPX84YO|0wL-+JfM7HJ&&2vl2Rn z)qRc%8O>#d0?9GbtVEi|kH^#ag*_fXp#exg1zHWsR|T*M6%h)+YPg{b5sib%)9xS6 z^|kl7Lk)MYC;s*B6r_JQ*bRf>?!>zecmKG41QLki(JppI<`d@o%mytFQ$llW@UTH- zHA}IiF7K!AzU~S<{R`!4>Xl{=sE1Nr@tKO${z{*y3;mxu-5v41;dBCUY=02!sH6(zRGI0Kg zzq*g^ko~$X@rrdfbkMt2&yh|k{{jr82#0ElF4fFHzyt+28hEhK0Kq+`vu9Ib16@-h z@o+_5#xg)CaAlZGBpk_uy6zhyj^j%>c=dfer`V3Lsl}z!D;_}j2Txo7veC0U_%~^ys?f=+CNHwdUNm)`8HrkfyG1SwR2!J)!qXFy zn-5sQ!#|jUr=tE}zc-|%p!&$fbiNc$JJ>=s_bpa^Mdq^SkqOqn0yA{w?w8mUOAM^V z7dFkyXpgw>D7(%;P+HE*95wOs13P77qo@Kf`sI%8P#%WBg0`VhY-&oZ5D~J((1{#vm0qc! zV9`#58O2roVx_EZB_o;NV0|<;#~24ki}m{e{82h79!I?(W~qXyhKfc(GQ&$@y!Iu! z?pz?vwq~zoYa3@Ze;MaY?rDP_d6LRt?`Y(V`+p}4n7pPT8YY88;CM)X{D30iP!D;% z*WwyEwP_D%sF*D-enSXrW%Enfmrb6_Mz=5I#`kc`v;%MW9~zC=Q%ra>=sd;oJT91% zSA@YR06pOB{xqurrUr2F66c=XGembgFq1H8YkYqhvoyZHv^yug3)N=G$sIx?gWzFt z!V~-DZ^5OoB{u#_zS#P7Y|b-D+i1u!3Fxx}Mf65PeowK)Catk2J$uml*wl;39_vNl zbcP|O9J@7EA-RV~l2=PIkOVl%w&4V`LZ00dh+xrZH7gJ2*h?*6JbtcIZK}W8XDxSS zgybnf?pdJw5&ns@rNYQxUQgVjvYj@*q5Nd+S|{!9$%nq(Yo6Qv=E>@Ioz_Y7Iqmwt z^`FzMb=rQ`aIMb3u)G*jd>6s>1-uAEPaFCXh-N0CV?E1{-b04k9;&X?! z(Vab`Y{4as&Zj&nf?>E2xlN{^%*4uWe*u;!F4jbcGQpx zWto96%E_-w8tK#lY+DO=+GlxHqBB>DhE~%I^AR>r{>vL4Ck*H`jLCkEv&f>N@lNA( z6x%0|*=$5N%pr^BCIhm(w8fg2Wb5Z^YTr>`f4OlwO7PQSf0QExYHRqg7~XO#>EaPo zRS$kwkeKcVT3a{T5^Ae}4SW;TMgO z9sj3xcvwls|J>XA7XRm4{LhyR3b-l;kGD=(o{VrgX(4G0!FbZ5z?ee(U>C!YI}S4f z#^|+wU%E>-`FS}@eiNZ>ULxWQIVL%yQGlsF^Z zD9NApqaW++$H7TY{;)59;)NHdJ^91F{7DpcTEDWN(AP8fnF1iH_F3j|7)C)g#(Ylw zcB?yQQ3*QpAWASbH{In$;0O&6`H1xZMLy6Hhrc4ff+52xT!SzSsl6@nTj;9eAdka!e{w$hF81VQkuAr;^W z;hXzpeaF%8V{h=A96fI1<%m6}8@r>%p_A1ip9G4mvTn4lHm zY!T%YkU~JBO3UsY7etq&!bDXMJ z#0-Btw$TN39J-55+@)6q_rZT+e$$mNjOw#)oSqjAQ6+#B(#v$Tg?%q3PN0iVc18Fa z)!QHTKr@(GKk|W|83QObX#==$L@~%}u*IU3ya*%-JS(@}$ld9UMY5n+P*+t{Z>j#t ztabmi{ziwx`loKEQ{)X49`tvv>g>kqOGNl}=O z3g^kk8k{~6ZQ=|yjToi!Tb(rFCrO?JL3;fuO%@_iD4Vj0w=1ya47;NzMEIbfm>?NA zg@q4gJn|7W`hidEYtW4N@muo=$XA+40Rj60amMtZczgq(Z`uH6^q2Iot`K?LQ-xF> zCP*c(urBCm$h8PqH1O9ZV9`h>@jgMm=zEcHePfa(Rfbfeg_BXK7W@t*fVBWwWhLFx zq#0eN*^GASQ%1^&oVXd7D@D~S8#N6nZDY;4Gi)+3B3{$zq?c`3Nj z%U>lfeHx|I6b(Tg$u4ablusm~IiX9c_fg_G08c=$zk`AF=F#dvriaCFUgjcho`-Ks z_;|&TdhNcKqp#L?9VcG@dcDKcpWXX);5v85$(`B%-?24m%c~##uinAIN$=lh|Go@( zDa-p4@iS!xe<})@=5TSk=_Y?w8u!vTjF#4;zm!m*h4<*MhC-+H>-uxRa2}H~2qdmE z{Te&X`*(kzJ7mH6YD0`}g6FTm1jk0Z{Y}{TtB?6N)ZGAeKN|&fx<2L4@mXx2od<8^ zsscJbUzS*FeKcdb2OL^ud++o^k)liwshlG z0y(w$YOS4O5=A4AN6x~*vG3-J_Kh?Gu`5XgqA6%ac;(c)-?#h#|E(uRENI>Ht8YNM z#+i+}P0{-A|295-TG6gfw?K)Ow8j+!{>wNXUx%?wJZR;xvGEmG=*{df7+P<0=}*cG z&5A$h;0}hz8x1+aBl|@|jzq8?0|dC^36U2Ht_B3oSQpu=JzMzm0tYMk9uh=$e!?HH zixQ)?tHKX*QyJAQ7R_@b>I(!7hP(|6+DKSZOkGjnPW{D~tO&rRt|-`GMM2hzg2amC zNGU7&ocKbKl(W#ez9w$f3AyTsFj|bdF;3SvLTZw9o`V5(h5~hoYxS>=*6LVa z3$f+01j5z7I&Q0DrDAu^M36|HT21CD_8<`Xe)r^q-5&r`{8&uELhR6ralHk8c8`q* zEV~;XIQ694>DZlar+I8##x?p%v%Mn8FHuL4`Qi_pLyAc-;h2{KJtm@wUd&5Ri=-n1 z`q8eLH2^-xAajlZN28QErUEmg<6=H*vBBnx)rqJKMV~G+piRRhGhk9RC=yq)xmDzD zi41(1B{LLEP1d2VX+x#c)pdq4l2jg8pJO9m4;*axfu|2iX%R#%7%9kVk$Sc=k4;)2 zD|RGa{>*4-n>Ki`YVeoA;eTa_>lsuQol@xyB_m7tqLy46W6LxLwN4C4Aym3u3ZjxI z)HDx6aqCMEy z7C-y)Yv78Xn6xB+BPm4w_9PoD0%z!6JHtEi0iRoAuqn0*{HZ(h+>yBkbL&Yd zLbNiMiTM5FkmN0MB`-u|vhj(HfM2`{#(MV5{mLYPtQlM`hR+B z74}NjevwHNf>O?^&qdJD)fgX5pGVH1GL*tRp706BbXU9sfm^!FBq6F=)y z0=g|G7rwGQA060ymd(JKag{IM>h{iCUHhcn==VuW!E9jK$MZqr)4L{@koC_PWF;@g z(^A2cMid*F^rB{e(0JEw_1`y7aTNO2{|)|Yb_Uvq^XADf^21rHV_!B}gQ}Q@_O&MK zVbCA?B)^=ryZxsA8?T^r1dAEijgt?u9^O?nJ6f|==V$o+6J}k1ndBwV&(6*caUcg6 z(o6N4%k{dK7`5i2*K7YqC;`}#-=(LA6DJIJ=l+8m*mz(kPx;*YM&Is#Z1nn2%MZ(V z-pf2~-WJb&8t#TuXC7`@-(w97z2}VzAn{|<-g&$Au{D6kw+_bX4GPFP@R|*|4N&rl zH}w{IQMr3!1NI;aowo+RC0kK6H_u1J#mg|>?xc5NH_p!RRZm(QjD_Hg$9Ng{#9M-r zaMrkJpw0Zwp)4e5BY953d2jh~ws4>DN?OKdEHTJO5u z0Uan#gz${xGZv8A+<*y-BbIdq6WHO)qx`jZlV|UdO3Z2hiHDB;7hue1hDBujWnb~t z>^91sT@g_h14ArBmb#q9jb$;*k((8Y1m+M}BY*QWb)LklEr7cN9ffn)z9mLDb={-2 zlD$%n*Kqf+@;djf^)q{Yba8gpJcsjcvCI825^`p?cwK!{%e7mB0aR;tPFsx*%S}+m zs3?9gaw%Z@*2G&ZChivQS$+yKvF9U2%oAOt==#7TV9O`~JI33^j5hbq1d)xFOZ=EY z3ghuZH;&9ieo(Dh6oaK~ox0)NTdljb`2iiPmckeZ*mes>I zyL*TAgV%>zebmx{IxWhGRz!Vv*^%9?)%L5EdPS?f22ND>DhFw808#+(QOF0PSmaO_ z|Ll+Jht;uL8^1ZI?KxG~sa5LZ`rg>BSDeG);q{(#P#+x(4|n++Y|#ZiS%1}j^G09P z-E>m+gB$u`7hmY_zTT}K?$-A9bGUyPoNUlNxA}2~eISX0WCuVBJhzO*G|n(x(Fa6V z_C63k^nm3x2a3qiU=O~}xILM=DYs^eCj492(n`11NYeJNEk5ej5xNN!;v*M77h`kN zhA8vzc#JqpP>42xh_)S#8zax9eTUPwTicBoh#43O83>i{p^Go%DjA=Bl!Y@ znqBmp$N`y^Ie(r%5*l-vmD=YQoeofVE(G?I75eRFvlrDkP1az?53BJy14A!^Zm-uo zJ+5u=307+HIzsyp z74}ROP#X~y_Tv?#b|PvVq}8a28ufS$skw+6hw&PuyNJ@)#!{_=H}NV$%MleCi3+6k zh~jsqApj4^Rq|zZATo5ZE1j2AgkEtQe_2WHLGKcC;XV9_7yi=1#%_nUs9>vPU2Rcl zZTM-+xp%yYa}Dww{KBml_#+B5_%A*aOmM?3mhS<}MeYaundd^lA6fnd{E1~fpr2rz ztxv^h;)$r5Fm?Rq`Nqk!BAPzR*rSWmK8}no=1>%BU{;Ev4$z z4Q|}TT=cKWrq|2xiS?_(L*&sdmdU=w{VQ{Gk#W!j6Uv0u{A>vP!e4bkjCderNFDNU#N>8(L$dTH*t*hG+$c$ej(@p>byZ>}l#R zqqTlod#z_60?EbV9;Gf63TZIBKL;WJTe}6I-m{kOM%TZ8wm_H989L856zNe3Sg#mcnh5IOLHe&{Y$c?kvk@n3CKHl1@b9jdO$v(zYI`|4lF023p770%Zf$1 z7o&7?lui>g8js}Xp-Y{V6caeUaL2n7y5@!-n4w1>lUr@0{;et98;YB6s6!Uqh2zaA z3GWhPSt2e0f%(T{rLq-ufrbJ~yE_9Z_-W44rXE?-Ww=0F0321Ity&g3)c?`lo_E0_ z&XO4pD&?8mK*+31l#7tHlx3CXvP*tcb-mg?cBIl;ei=e$QHvo*s=;EcjCf;Ma0vY z`>@5m8bi#${KRG#7MUfAH`>G=RXtR9kF2uceBvzx?5`@Hc&{gb46sLh$8e6??6|`W zP$lak1R)6KM)o2v6tMSimLXpGQQl^HlRjLqip&mNwwm{_51>hV3z;wZK|o^UvU^e90h+8_9$rK4lxXsCXCG{x8mVR}#Q|0Sb(32k}x(OtvZ7+Nqxp;woi%!*v zKfA{hLqb3(jfs?~$D08vIdlwA#*;ZRDfC>(?z;u$Q)P~_=$r+mfKfwaEvSqD+I8*o z({88z+Yt~~zz_OzdCtE)h%e`-m*@EVk6WK*FBp+Qbao|j2^Ewst^ZcL6Te|s#ZO`b zL^~>KfCkz*jo_+`0wiHRae#o(oVFbJt6I#ZSNf5-?~n52b8L5+@i9EIf|B)6vYe6? z{0RU2sO}hc#dplZE%yVw4IH`m9&}A6Zn(fCf-Mqd{JFIE=9+fSJpYA+)~ksuwLIkxUSU?Yp*Mn`WyH4-gR~OdNi!K)#2eTSMr9h+O^7S z-a+4=x_o)e1Wbg*u|P!$Z@FiO$1gqD@`pp9UAx1|s1i|HDrTZVghsoFMc;8Gl5xvK z21clk&=RPeC{GZGykgV-KFnL+({MTAYPh2QE?cA4jBgs89*4XfIDduT&+P686fpj; z@Gd}f4)Lj?5P0kv6M+;Lh6u6y7`IIkl+d1k?*txE9xlI+TqM`Xj(o=ZPI?zCxi4e> zLK|hpfQ`(I&QtO7Yi0~cH@u~NyXFumpiBiU78YCLj~h#tH=4k2Omu>OgWpROfSP`| zf-0CS@9GAQ_JT`Z>=zq*`Sj^iQ6rOzU?{n;j`YmvXh~qvM|r`+{TT{dc;N^LjrWZz z81WR3qwQog2R3vpBpVmVGGmg(tLhP>h8(JI6?qdUugjeX2KtxDkoZ&ZJ5^!8*kXO% zvqTJ-o0Sb-6j(|nKfSeHN7H-7HwM1e%Jp(Jve>dIiQBy`0`pd)t2e1#)%Mf6qRmNm zRjnBN+AG(}mCUYapLu^_il`q(qCW4V$jSWBSro=BT-F%G33QKoEAC`LTBXfq+Gd>c zlN5roCx~bagG2{MbR^hamrQmH)QFy;O92Lj6p}JXz_54o`V zl#7xZ37B&(eNvw=2&;p)UZl?xbJXyA0X;++H{y6bW}(esV|Yh&r6?VBM7fUT3O!ELsc zM-*?XSg4dSS0?}KZ>Hb;4MP+U%Diclg%5@4k_<*_sU!?~q9xLT#U zzgu~;Tia*S2qiluKhnUJuAWTYa3(i+<#ap6RDcsokbu+E`v;My%oag6p+opxzu(0V z`Yl2kKSePrK)!+B|HB)--P?Ef_o~+w$K8ALdOSSXcb)p1@%Z(DJ3OpZ4r{gHn~`&P z$S=t#8J&*~4ruh1kR-M%wgI{A$Ro2ZGQs~>EgyW3H~cdr5aDnGgNa(BRy;wy8?-If z3u&bWD8q`N6B7Jz@8;po?1uj&l*av9yoC@I+3qmd?7*%|DPo5)SkVK&)I{R~XhN91 z;sHbmKw_elc*E`uX>ouuD54ZtHd3BUxM-nbe{&m`bTxEDb=&eMBUmobF_5XymDCSL zEXRCO+I{}kzk2rOv(_NSQl?1f#<%hWu{?l7+dKFz1_EJWxOBNaB_h2u=DUKdDijnj z-=MpJ0!1&)(;1X|bHup)Yirj!b%*H8Erj!Yi{B}1+OB`@4kwN`<=ALwR(%7_I{rO2 ztMg`zSp4D7T%s1HR(sH@vAn@n2QsG)Dv&^zuCBM>6r90_BQ8iun7p+(^spX!mKCn^ zCj`hN%xhdsa@9$&WDdKo%?2sc+Iv(yF*9+JtF{<`}4qQ_wxU(nzgY+{X zaYYe4@T?+5M!b#5BlP(#{iDeuion6kq`TYo7K{~lcS}y@$G7At!deSSo~s#p&F#0A zaAPwrO8Y$*sZIjrc49S{f_UT7F~-Hk@a)GVBE{P50FK~Ifc&tF-fY?^MP(j8zKz=I zpA*QpLmekRL;oni7)IcDfS{yag+v~|2UX;5lDLEl&dOQlt#ZV}^>-SeT~b;kD~|xp zlVvY|KP4;14(Q>-Dd}V^F(~j7Z}B8_HnNloCbqLz2En8zEFVZ=@oE)mt7FNl9;U;B zXi?v(yxFO~F0RiVBfALxsqK$PwR+`Xcu*Y=hr_+Y1LwL@dwn=`hkJXDb67tdSL%n= z*No_aActqM%+fWT!I_XVD#e#jL9R*a30J~3UH#&E31TsIQ>~XP`(=id9eNahjrQ=o zte@vQaAYm#7W(f^_$7?BU*1D2EC7kQ7ip|0FECv2B!1l-ai@G427Jg6@2mnR7$_?i znPp0s6+O8I9vuW6@f5-1`0BjPN0O<-x@pr{$FN>nGltl8vFFEHpGqM6UAt0e+DTKT8_W zIHEvVS@|9Nu#(qqbiGooR4axdD@wj#73-u`MEGwQ1QT|`O2TF8ETsZ**t(fR1Y-(wkgzXSokYBm&;T4}g!x9`pkC>KzV8pFZ&s zgwk0nM`pj&-n9-ZI*l@86?Z-=8rIE3od~0uguN1@WwVtS&HbWGV+%nm8eItME5}bj zSn2B@3Hej)oq3qR0KhO;)FkJWwQ5eB@|Bi%s&XPM3y{*+>y1Az&avzhP(z_%M# z`{Y;QZGewH$Vi3kN9l>PFPT&`aHu=FsYYW0NU$(Gz8F9|gm}vATJZBCB2|VJ3BJ5z zk;a1aBEe_BykD*$|06kus&1KtnX)uDymQAW3dx3wd%P_vMUKArjwZ!N$0xcm)1vIb^nZMWQqi87{I$)GrcBSFwE2Hr*mB z<3X~j8fuExtI3pf04)kkX^9?@=>;xoV9YGW&mktW%M0EIK+U4iw=HUL$`WYI-v4(sDAw`wTtdFCJH@ zDtgC@=2#Z*l9gvpg!+I*-PtV!dvBRBpbg<$cFM1Z7G94^uB$ z=j=t;B`Yavk#NcXxxnE_U@Zyomxy$hXkQF|c#I2`B>yT28du^ZuEZsi60sOzl0b(| zlRbjX1_}j``G!d^xc`azpEM26$%+tD?dX&W4Xh{Qo)ILE|Sb%VIfldflIkwQ{V?J;5;|JIwHEdi-4J1W@D(Nnuqd-f$P%WpDQ>@wx6|imC{GiLGU*gMHwogzzzvvb z&2PNf?)(PmQ@Gkj41{Nwnc4E|T8I(X-9S^8VZ%4_N37N2^luA*%A6jzLYVoMc3NX3 zF`tl<^GPcC;3`zuDtsRnae?6?D8Sq|qG(a<#~D3%TrMP^*A?fu(L2$IqAzH~Ae~NV z9GRZ=KH?K{ek}K`J8$9(PuB;RuDuQInTsvguuWmulBV@}_%MgPFj&{4^~B8T*IU+B zk&~uRwWVe2F8r?orDdE@jp}Vi`w` zixlDwS%{MtqJ<(#MDhjnQKBwh-XY_pck$A07?HPITx@aF2W9XU(w(b%K zsBUK>4y8Eo$EuHL0)KReP@D(7VW96Z_fVIk&DYv7sGwZQJa_+?5EOVLp`DJsAY3pu z%k;Cz=bL+0QCbdMFj2usR#FgP9ns#%-(XQD-X^guRSkF^rWsprgmoIvn}P6%lsJik ziHNJPdBVs+%@PSQu!chJ=>3_^edm+di#s=yA!>w+J#11aA^~z_G`dShPSIJJp%|JG0A-5{&KAecr zywO@}lAH; z>>(ygYFjk9@oK6I|ArCf;^%pO3+nM22U^qvkuz}9j`S<*qr15EN7gIm?~ZkCk4PG( z`YlS9Ma&2Kz$XD^{3~V@qemM2{mCvH1P>nmcU9SW^J#l`;m-jdZ=QDf82Ms`@3o2T zsPij3qfvp3Hr&a&C_HH>ycBc#7nP-hJum%E+a(TaR+fuFg=x`Kpt{J-rTJ>O4AAkD zMF-3_YHdP&HuK>U6e!LiQ8vVSCOv27K2Rhp49RK=84eUopp7@$B2RsFsi2Fb9tvW_ z4A~M5Q_d2H>y=vdN}mE*=l+p8Xsl&4gXB3k@7XHd)1Tdt=WG_x3@W#>f@1PLgTAc^ zX@)PMm;$vs_o>96RA>b5dg~vHqv%OsCa9nfVfLh+q*a+8pKv)X@ZBjh$*54&eAReO zKv)rL&PeAX;zfdAl4jv^Dj$SWDH}58qbOvOR%ME-E6>(&@o2LQ%p??Q)YilI{lRj+ zNR*(eW~Uc#EUGRZjdqyWAO-NeQqgE#jZfgxlU7 z#wK-U^bqCT9lduJFJa29Rt~F1Il;6nF37FBthJUV-{zrTaZ9*syDZ{$AysO~4;?fi zk3IAtWo%tJw&?4gFPgRrsWSeER*Gt+67yGb9&J%4ZA-BZTYJ&mhc{c@2h_>x1I~i5 za;QX@2o_GhM5B~wzR8@R@J}vB94tX4RSUuz@Edyd*Ss`*Q@d z5?NYAqUIhDc*vmc4mYXggp8*qdZs7eTDIrGNw0*t>Pr?&tQLY+GI0VDQh1aQcfsDg zIJ3O+sN+aJONUvhnb)ibcPl{qJaQoJlP$035KX8HmIM-TcMc?PvCC*49(cqfL@D-+ zluebqv>6tuk0~vXlIgVw-Vstna}lovUj@+ncqha_yKL52n>ztgN|=B$lyL9A{p#VH z{kptHkmtds{KvLkz&zH)Bh4dR#%+>U80>uv2CAaSApBUsjG=h$Q`ifohiEVV1wSo( z8ykJ*d1Rz3$8f%nPhRryL%yU$H)c6e`R~R&iH4KGyURX~QA`GD{nt`FhzN}#=tn)%c*9a&qgntu-m}@j045r%A0;!^@ zO0>*)FQ4_DvGt2Mmgz&&RVW+64C6r+Se|&y>!y0iV-Yk}vI!ON3Q@oO8Z*DJu#82R zo&a5l;Q!+hc_Sv~!iI@4GY`d+(m6=F@r>ajkVPUQ1B1(IKvJcH4!4dh`Vs|VFLb4Aa zx&ZMZ$lv{*RiKb*Ta4%-D@adLZUP05L+-!AzX|&CP)GH=3 zq6~Fsw&|Is69xQOZQ!JcO&AwNO?APD)X`O%eD{g~#Q8FNV8~KH@a$X08y1dv^zYT{ zqfZzk?o)cz@QVKVBqYKDVIf)kN5!P%$J*$p(V>{E@-Ujtp<)CkgMvpV5B>=YYagdj zL}Vw_i<1F5na@8srFe!T<4ICTMUkJNnZp%J44y_V3M@7jK!;L*B|CA2I2Wpt&~k?1 zTw$vCMhyL1j)f=u*qgbAZX6Pr;OPAmqe)`w&*hx&5!|f4gy~bH6uS39`6cw}d>eXL&L+&pz(Yrl@U8WbynG{k_z{}-3y4X1PsC9#_2VI$!j!uf;>}X6B8(Ax1*N_BaNfK;>YOPYeoth*C42r6@qp zA0GLN`F(Sdnt72fdf(3M`!4BAT_Og5 z7-~zoY-MSNVs}0$xO?+53!q!ra>AkKZ58#%ULyCmu13VY1~yHIRI60uR#h$Uk%4*5 zqvSFu2HSAR=LMb`ndj*&Usvml=oGwp@#+Y9c5xlCV&lGxdh{}SwAH(>$Do4dUlFZg z2hJk$p*z=|Tj*O!w3xH5a=9F9D)xpCxdo>p=9%(Jx&y{19@qF{&7z>zJi53yzw(Z} zANM~oh>>jJ;nW_PIlqFqjrjy)q5;j(1fA8Q$d_ZxdRUXbyQ$XdOz7!(vN2t2dF~AF z3R^$zx3)^wHva}<2z~tCX@#3 zAC_3Oq`dcA)e*X#Ht9uP_y#u}Lb;B5FfvV&1BkR^^zkJ<*iy)SiOXJq4?K;i&?N;k>XEf8txbw5vGF_A;dGKG!6H{)+7yg|)Tluae zi$_LJqS+289FcW?RXI9*Hphblx&{A3azM)PEaMPuE@B?m>(4{Lufm8o;=*6VeJ>Fa zW7onm$qc3Yo!v}0OHAoPunr1mf!0M9``itOfj7t8!e%}>cf25svy)AD32%Q@5WJ-L z$@ro|FdfQG18q{#>&yAhN^Hrd{akQhhlQePygtfA0)Au1PgmN-!|H*RzVi9hTAV*d zKBRy#^ljnWC|uLS1^Q4dW*kk5W-UAo#ACw1oniz^;b=gH{fs^oj74)a^UUO%CcFz$ zJn51ib#X6)-|?j?vbf#aLG7@%x4V)pW&mwNexA+K*u`ZkOJfzed2iHRS zgX-~PFv2RHaLLn}oTG9LSd979MNgb04U~Q>F`Uw1e1-e*$>@NK7wRa_WL&4qArj!? zDi3-!r}(D`o0LH-pU72fmXll>4O_>YlGsx-c}xyXV&NJ?uQMidiC9x^y{2$2{33S} z8gIO_)S;O|f#&%8N|AYWUUi+sZDP2LO(^^-6HQh^1S}P*NFQeo{k-Y>QEur0dwbI)5v9wydU4jZ_ zP6(C9`l158?if2fz%^xboJ`nVZ}hy9UBIDt55YzZ^q!?8FUcquSw1Yq%{|q{WH&cEe z1^!(7F!shiMlhl4e++P<6a}!FlrntY%)$hvR3P)x&;blGmy-o9`jxE-Z*C21ihV}C zXt{_jO8(-tf>q0&khS z82x6tSVl=*S(!*7Nx{obFM93fulCtRyM2V6*~$mgQq)H88|^c#5q?u(XLRdt;aprx)O1^c{!q1%r44AT?H}!DHL^^eIy}6GeDpwYWkJE5nHtUm zElPVV(c~hE-^51|N_?%nZ@JF!mN9k=<;$b|R}VNb2J%?GDQi*Z_vnWT{P)_r9Xar~ z;eUDaaP=RR@wT}m&Nhu)-Iqh65eNk#T%787!&9-+>nQeC6t^9h$6Uw=bji8mRM(nl zxm;e(Cg}E6kP|L4k1d?9>Ms-}k&Q>~dqw6Hnmei{+$CA&DwL3>akwy3I4mZoU1ig* znr6CRuDgQ*6sprMLa<9INXuQpJwVuaadN$uluSkT_`rn!J7t-9Y+~O zO;MUCl{40O3#ZWhkd+_ZL>U*Kc?{aUPX&QYUslX*xA!rpQJU62uWk0%w9WJT zG)BCTZQdfXL1aZ_-PsP+RDQ!)qlQE7F7c^0FFsZq5)IpA8)c{x%nFdKPL)k*0)#`q z!zQ4^_yPr3XJH3Q@U5~$OFW2aP(d*@6))m1lrEtMwc(=bC8)EGcTXtycV4NV17>$X-7 zE-vShi{_;*y=l_i+zVDQ#ASBUN0G8@{4-Yo)AUCRrfi`$AD4LtVo{8Z#%9(ob37yOqIjt zz;)-V*ci(ZLDF1>Oz9r$j^2?vd|qCsLQyFHj4eB#nqs>}FSLx9qG=@YVc z*b*Kt0tA~$sRV@w!=#78@C;2W(h12;DipwmwGaej;&s2Bxx4fBqAjc{$-~;452wr2 z75WphiRLq$z-Lj?Qj)4QTGkITXqYwt=akVif=NHd1Zo3;B5@vwhr1a z4tMuomJ7aT9qhi?GY9XdZ-2|_M;6QJbf=w0!_H#K@JL5+{c_g)%|@%WKZ5R;1rP&JNJHEqi4Vk0o0J00(E zxb#SiXA=$j7}`de5<=UXo?A+`Dl%!J&Qa1hQjo-M36Y&*lhsU9bV?I>H!-*DNy;0G zc-Xo%1cj;T-7DW(wOV@1g^`%S0#p*K(J`2Zj+DE3j2x}^6=h^^RauOUgypZVtEYB- zi%lkRAHT)EzorVagwu_yf;oTxq6!vQyeKx{Y7$3hfes`{ciNQrTZBi&ezUNNAVeEOW-AE`ugk6uIs_v?cKkNW ztOTI5b8`p1YfXLsQz#XrAcy&c$xN&@@lCWuwy|QHCZUI(kA10-&9XrUAgDuSaoR|o z9tmJ|^sz%KvcMNSWiWLIAT6)Z{hMSXq&l0>iqH_{p3b&K7bMilOq;CaldfF0&e$6> zXDUB!q*mV|eY(&YqnROM;lwP)qU6Y==M52%RKi(ndV9X&!rRZpCffwSArFzbBqTt` zwRFMx->n_&+%0>nCaHl=p>cbC*2T}ce_%8BP)ZiKf>2QCy~vkWX&c={y%b<|#z=Dy zs^$is^Tjf%Wl;2( zFN)#F2;vU+B8g+y+BGGqX+-1?7zm`U!2B9`f`K0?e^lbK5^4^a6$qsS`6fin^sQ%I z5J)xU{by6rpJmQ?ClVThCNy0`Sra(N1wO8JZovLT>}5;NwbF7vmCoIbKXv)^*|Pem zpW_t*CN8NkA$n$ELs?>>{Pb+H>ps_BTJj1Z{fZN;M-IouD-A?()ZWw#- zA$jjTJ9t3s{k?VPvKw!5BSuy{=wT15<)T{3jV&DspXbM-Z89B&9;$I_we-kVg(@m) zu34(l)k4&cCo2BPnWH6~DnwE`V)Qs^j?D_Dw4zu=#Dn`6P)Rbuq>{!3@hXx)>7*qW ztY9-vrIE0v&S8IKX@M{>=DrlPn2-u>(+SMZ%Wm#F6-6L6tiS8GTB9(aERi{TMEtm+ zjG;A~L2hT6R&b0D3pVapwMHJweCa)6T`nNK8*>(f(g-TEL0T~gL0c`ErPV@*lqsa3UcOjJ!CXAny0FOo4)u)>-= zJCiivpeid}%efKK_k$7zhbdESl(J7=1FTG!40>U)7jg=!>~xP-$W#GMjaj^Fm2yli zyNhk;B3LwPOYd%_DzNEpcaMtX?tTS3AWnug+g~8f%7(FtyQ*mzJM$t91HPsMxK+nx zK+`wi-HNw>FE9;h(PalNx=%7_8(4sH6sT{q{rgj!V9+M~!3Tcm)#SXNFWcNl6L4>B zz&)xVPW5qZ9^uG+pA&Z?DoMQf)Zx3a{(Nf|T68{CRd7LJg=Cc?e$`%3GO^5KNHa5jB;-0zu|& z#5tI*c78ay-rW%^qL?BAXbCk7NPciIuG}J_G6m8Yp{x-xE}%0K z(Auz8uv>48QX*T0K&vg?gIu0%ozU74@Z-VAMwEmOzdMZY;r4JmE_dk42mLSD$>azE~b7lA6 zUS6L6VqczI|3rCw)^KfMWYvW4d%Sq7l6abk?}>$OAqi4MVmBfNeam_)@Cc>hcNIr( zwJFvskqX%p1k5llF;?%P|84K>zu>9r`%(I&kg0!DuHslnT)E?8Jy}QyZXX^O?%WL~ zD|_zWq3u#UXp@G)3_&>FNdi`z*|$TGStc&M6_?aBuh%CVhcl)sc*~MxMJdKS?Mjpv zLlzX6UdNld(inob1@G&Us$|GqG9&c~g7%_RMHBPRWs82b)P$eRVbBdiLRH5%8cz_d zcZnEW5%FeSvv>8@-!;a#Egw~+jbti8e>iRHfM@xTBYJXO%DS0NtZHWx6BC%tu3MUGhyD%A2Ru}2=QF0YcZy?ek?yxu&XbN5iij%tz zmTqFcft1DQ4Kfy#Fg$FC_S&6}k8tXvyaGkgEaq^Z7x`M9>k|}VVE`BG2(Y_2)3FC} zc1C_g@&H;k4t6Su!Pjnk|KE+5q9ld$ zTw7d{6?V(oKiu7IY`Da%D<=6xR*W2fQn(e%NHb2Wskcev(aj-PAs}p1$ICgNRv+0q z0%6+?$_lZug7lKm(ooR#7HJvVoxr&h56Eyw;ilSB1y79w^ zEh`YmeYR-QOIsjH5H<@A8%Rk5bjD>GXB5fz(-qFC)3_z2(Pv1vlf=U{P@S)z$fh5V zp?a{K!)(44>J~N*X;}zxIP)eq5m~>gh}1qQF-YPTd==v*o>E$Aiy*ZoN5yANR2+(y zpe3qy1Un|$xE}4M9RlKT$5xF%u<=1nF%?qHgs=$pxVa^9tEt&F9EgmmP{V8`gyRew zk?bYS)YM8-TjU1feiqK;46eefX$W1$YoxpIhd1$%LzRXzwSMUJu4zVB6rFh?5v-Xz zc0-d#BO~enYhfbE;DZw@JT=DVJT_GPi)%(U@loCpN;@O1!BneKZA3X~AdV5~1MA25 zG{PM3kry>F(A~#g$5dX9cxb6h6(Mvc%Nk5)I{y1c>T`)Egd35Hq@)}w2lcG|zc^RM zC)bZj;cUtK8I%4%UZ*!MdLR(Ck;?~jgb!s;Q$jt2Qn!S!*ELo^PzADgvc!J0>Oue& z#TH_criT!VP3%%_ERs_7L^jg5?I*F>2F!X#G$t`=VDhNVg;rg9;Z2NTMGcQ@CRRX6 zrykvqY6G4&R6o?1*oe(m8v;N!M87UX#)D+6Iw_DbjYb@PP{S=E%L}$`QSKeO_JTJ)H=015Gx<_`Q|X1hB(i7TLSMa}c%!3gBmWL6ny_%Pj`dn^o9>t+k}A_CPFew zq8=qC4@R1SZgBG-?3(e zK}MDfNx{?_-gwgyEPeIV8mpnDlySl+;FZcu*UVs6<^;`%Ea_X$NFOHt zZE`WWqs9{ym68!tuuD-<;|@p!0X-e(lf$|Zg?0%kqXx^_g2{$Dmz}FOO_dYQAGK1e zhJp}iz*T{b3yJoi9R#G+pw>tkl8i#?ObqjZ!aue45R1y-ak^N<6C7h@CN^HXKoImy zTF4otL9*aTM)p%XQ32QCl#-0;Gmw7+Ct}!JsB{!K^KeQG>H}ODVn7?1cj6XIQ6~#i zb)w4ZFNZgxGb!{5bzirlA$a-LXcW|mELfkFdt*+Ghsjtg+LH^ zRz!oVh=TGIjDcDeGX#T*0zde1Vos36_atoTPsBzQOowCI(eaB3iKW$4RdYPk`-mKX>l43FZo((&_ zK&#cS5wCcB^e+Xe08T)$zeC($St>g9?(d29n$9E$MXM-G?rwbKaljEA$b_2`DtMI; z`Dp-sL1+Ju_{2JXlF)5CV!diI`PQV7~tQM2wg?0 zJmHgvN7R@%;s|NRVLev@#Nb4VmYuPYtP6SX5H1HHYza`5eY$Jl9Vrg?Ood6T$)sx} z;K?v;IXxRXgPf=-6SjMJVF43kl#oEqU6hsZxDa_;pYGVA4S@g|3fhUEItdOIkc*6!QDB;YdeMS6=4{h{PAYLeRClmsQtNOm3dLKor zd7uV(mI|;WC6<~(I*Bk7VlNd!3iWn2vHiTD*;Lad8^TbGTssr)WjfqqY0sB4HO&5D zD$HQ|$@3wp;U}#%_g{XLa&v9uPMsBuzQ|SsS1JZQ;R6;>M&+Px&09gQP_wgk0ri+@ z5v^MOHI|)ac&~*=3bk_Kd2rjpk=ER_xrN6VYs+3>xx687N~*@OtAAV((M2{9gr;jD z%Bb(dE$ZaBO*l>}N_ym#j}y13IZC$NpJCbCpx7h#J_RooD_!(Vr2OGVsJ3W$n5v1` z9E=sJH{^0&$Y(0|7v`bV4;jQyVQr)28sc^K952X;W?h=*v6(MY-x6(>gQk3{{mgzOO$fR|!Fh~VJ7TMOCGH3ZE(^{h)-1D3p25UHb=@#x z+c7>NlF~$6ktGT%jlWjt&iy;mBw2O3%d~d4_jWVJc=Gf)efaT{8#~3^k;^7ekVDD6 zL!5FEJKv^f+hWXoPV>L$+*_1pQ#qpjK^lqTNjsb|DOK+BAEUOw|3%ucWX*A zMCOiyG8)aGq(C<*LUD^K$Ruvdx!Y)+a<8gdC8hdzIBy5$Dw|gn% zCGv;h^N7HuZCOA1{$%Q^js-V?QWJ(ofHCXfk-L=#?^?=NSwXpme!)xiUqA2e)(E=< zj}{3FDm@n#yERKgKhZ-%It}AUqyxy2O2Z`EUmSM$M1t{E@Y>keP8$tM_tVHBYi~SU z$#JF*19il4V>ioFps6~Kq}iU(cQmsAIcWRfVDIINX9v$-YL;u*pmB@Rcy{M?QD@?> zV#-V8ZG-8Sosh=nfzTO74iRw8%H#6IOu3au1b)<&M_%`kR3b9439GM;QP!=TOo`=8 zGm=8Ivgd)&)8`64;;5OFCSnx-_}(0qaWV_Od0H!r5GxR8|1rIn{Oqnwn@H9!^^LP) ztMn8^A^K1;zH->ggKp$=7<8BCqh<|WLoJ|NG|Wb0gUUu#q1IFFO4J|JQ|Kb*1D2u3J54xD#4q8UKJ_++X44n4zWi)e)db)1zVjXe|JL;Ljt zoZ1hA8c6CxSVWp^9^s5obVp0?aDB8p5slCWOU9#9B1uPTp7fwNB4wh*_SDx zf((w~-q*_XizO)nGfOCq?J)m5o>;^Rglx7R6TPNS&yjBVx_kO_U$L_{MGA`} z>Dtgt?6k6UZ8BkTGHXiX`FD;NWuj{e(Y&~F)^skwCW}sRR;DK8sQMOd`UQey=TWQj}!S`xQg| z4Kd-+GiOK`&@_ZJBgFUeerDv67pcdFD@t&g`WzWLtmT3VV7da$FA8>R@H#EoQn)pI8qv z;8oK3hxNMKIX|=D%UP#?deyzW?)ENnSK@zICqJLy$93-#KK_sb1u#n~tH2GR{}EWh zjR^7CSRnCn)#>X6`iFHp6A3Y}G^_xVz?tQw^bdai59?j`>N=HBcte-<@t1`&!2vvm zGrxQU=Zpoqwl|Uz^?$lbmk7^qTq68Zuc7`Hj_i4D9R(qNoc7K-sf4E9fP=u70Nt+Z zObLerTjAM}2~9a6{-q^ECqYYod5RMnW?62DMx4;u$@NJ(AuotlR{TXYQBJ8KRAd=T z^f<$)=$>hIuM;zjr6!Kdrs(h{bs_S944Tw-O;Pb<>(`7xBW>BYtjm)hJBXj1n6)R2 zIEo*_(esZVGrK6P2X!g|m8G~Cu~RXhKcQB9O_i97vnx8BV#Nv8`VKp%#bhwvSVCv^ zE?#$kwBNjWE5eb@wKqW@ShQX67wpa>(wyTuIf@U%Kb`dL{+pA_{!yjeSywE1=<&zv zUZyE&Yc+sP|A^NemjPYP*r!w1nK$E~XV@ai&!3iX1fLGFmbfq+I7Hwc2QHq(7PvPK zg6gkx5xKQ>^lSLE{_E&z!vsbIn|f%B9frRaM-1Py&Y*K<% zHx0Ap8Jm*tqw%==+09s*OJ8O-lbEKjNaz5LwiVvoP2)cjF*=Nf%T;s(AN!QXUYrpM z@%y{qSRwh4a&9S(oF_8w9$G*xCpRtYH4ZixsX48?n^h{yRODa$Wpdj?AP%gIPJBGy z_WPt_Tn@-+Cu^TiBc- z&BY?^0$LG4=aYhg#YQ(ElcM;NAzi&|g7+99@jG7OkwGRdX2ZZC^GO_rByiFjHlD+Z z?&=9GLpnvmK_n)bQPvZ(0D?BICv`-Zr7f$yyQiyk7N&G)RVkkaE+&~o#0pbB6}j)= zYK(i&RbX634*TNdabby2uvY5hfVwonnNPERTM||(IT#TG3l~ny?5m?Y)L|>jrp% z$#)y5`1AeNWV$n+xdUHENfSmqm)*19@3Vc&zXxpMCLsSK6QUs~TzAzn(3vTfW(j`0a%0PM zvG;{G&s;+Vv*m%jzzOyH(n0OldFn!C8YU11$=naZ$W|_ZLTZPUjg8h&m`D=sV+IBG z1{w$*@2S;@A8gYV?IvE4IIVSSQtljeMk7S(bpt%x`QvfuB7M4hi>fLRPMXpiQ)F1V z=iDrt&9C|Rq@u=8tq--@$6Qk*NXA?O2@UYUnfvpPwG9l2OqOtll!aBC?)qp5N7uA# z?hxyImm8Z{SoM*MJ`|&d;6_vJNb>R$Hdi+0HI%5+Ypa1DXp6C%ZR2Se1Ev~N5iNjy zjjM!c5A5>>cd*$Om8Rqbp}K2VAuP^KYqzmBWZ(O{TQcZn`9$d)!pHc{qR>&lY`*$>&PCn2btBIDwh5n)%Dp%>@ED2hHB+HB2J?G+cL^a5uWIwI@XVV%DCUU_-t* ztlZlq@_y!!MeMnonnA8HGhWW@Vf5L?Rcd%6E;$Pf&M|O!mr*y>;Bgcua`bCNI;Wbt zSQ+FC#TP;0q`(Xa=0@ZcA3Jq{Sabu0GP{AU;TI)Ys&?y7mvfLXSGHCKw&_Bau)F|S z$*sx~3K1!!F0K<#g;%5i5r-+ybcbDy4Xyp@NNT(AgtoU&)5F*~CFe}msanU)T2OP= z39%2qA;@IYN`AIKHp+}B#t0FE$+DG4*^zV2FN|YG3Yw~BP~cfud}dblk6whlTm%mT z2W4FanNmMmy?LT9^g;pTg1&hEg1qZo2F8w)RGrB%afiiTwP0w*s_7@=99kPs0_9>k z)q47DNI*dIE$fuNP#0x-YPHs{9Hs zyqVaS>tl$VaUnL4<0zd&=!m7x$uVnZ;w2f~`O-?Jj&9sm-Tmw~QbZTjHevK3j9Q65 zB)c){*J!c1O%$L0($;iFvzK-|*UBW<(5Agt7$-y7xZw7tg)}$;eYC!bW9x zOZp*=iiqP_b0KdSTm>1$t$3;ShOUi*V8%uuWj9<)cCgx}SD;S{U3|5rPC3~(KD1wa zR5TP%5ZA>zO+f}^Y^9;Fc5Lyx2s}UVqE#ZFm1&RAl~y=xym(ZQNodGK#*^2mF?B6n z1_>I0L+zsT^zyBJ^7?i6qI>;ISw%LQ6*=QE;v1|?eV8h63p>j;Mp9ZP_Gd(OhCB5p z-eBrttT5*~)yiHxooix!O_lBy9FX2{;^xYg zqF*Rru4)SFRS(eHgr+)7>M1oE0^@A%lFFRf1Z;@!#l zQI5V_8NBh}$PR0>{su;cj7aNpac>x}8&CzhSdyz1B$ThS@u;69Yp~3?Sizi8F0WN0 zSG_r`O0WZ?O(O`D1CUa`30_&l8z0d^B(Q?;CoH9thGI7LW^Ob})>4c0=vCFK7++0^ zEaNJ#SG-qKtx~GOjEp0eeu6vH*MD*FqYJlvbq~0_>Ydu%9(;CtR~zgD@E~UwXA@k) z<4L>`l1c6PxOJs=fmENl(2m7)Q6d9Kx!b#xTcLQ^C_HI$!RvYn8=KWSS=3U=Wbm6} zOagN?Wb^Er8#8P(y_gg05@v#T)~E z-Z)VUt%wC0-W**|@otCj=%qzR+FItaduGL~0tvpWG}+1Ad?muv+5yN)Argu=&%0t2J@WHx%mdm|_L(h0=jMIAkYo;^vL_wNb857VN!T z>;`hu?B#D8n{63YHuOf%9CT3bj4-T7EFeo&x^n55k>;_Wt3Ez32OX0A4^zJc2c6Nj`$4_vERIv;;*M z9ujw{5XB=-hQGALMO_-o1De0~ml_0uL)BlbIzi7SYg8y1XauMa!ZhDGtBfvzB$NL2 z$@SZQr%(4roNE&kUw5P?9Re8}rkld37-V8BlR|R5$=%Qz{o;7U4ky#Ju@Gt0VwK`} zR03e538^(o(+VWr1+=LfgzZ8?p|&IJ z5xfxd)=UlZdImYvsGum@0@tr=e(1vqo-C=X1Nmt5}EvvZ4Sy-UAk7utR zN|QH}&qWa?I8`58rZ|D7^`cQkn_J>yAn6}i-%NAi*UI&S^rUiJ_0YTC5i@fdsW7G+de^zn!w zbI;rWSMpRWRCFfjbf#j|#|ewyl=|8xo+ynlF*d@FU#Jl#n>NB^gGTu3!GC;4**<7J zZ|%wh3p!ye=Lqkz`sy+McH!^v*)#lXKR?)2Kk-fb+2P?=a6H;;?;kwhZ6AKMySIDr zy#1B6`_&itTcT`XSzpD+ww!S5-g9MktNh-n7o13&&2`omAKSIA$>fdrS6PgY@tbm0n_yCvQw%yb-t(~@sbUfbP^&UJ;~ zwd7+l)zeP}N<#KAPD;MOMbR(0&dmu)b618GVMLa3!4%-YoDf{}L-X5_J6KN4uTn7b z=0KY4ZVr-zU~3GknJb!uV8@J|8H#IoNsu2XS}ok-P|MJnxV9i_GzZaCIZ6;{5gBA) zew>k;&B0ROkU4=e$MBqRzwB2k6&v=^C~$1N3l~fVr@e~{x-LMr0{Zbo@9o7I{z4_o z>poGqB7wmp)3-6x-eZ!tp*Ols?&zefLC7P2KCajLr*{0R)~LX+Kkr`rEH0je)r5Fh z>GtizXZ8=>Ym^99VQc1mCLo3Ht-YR>No9d{7!yMTKr+l~{4w z@1J)%mq)QYz@cn<+P(O(sf4_GdyxqT&n{BI{;T)qhfFwp*zKsn`qw=}w(#(>bEbxa zdS!yqm68&scY!s`EgT)%&>GG`@X5In@%>5nIui{aQk{OURIX1ia~clb^z9D3`{BIX z|EY79Btw0mylJK)^?$jr`<;vHR1Epp6#VM+-I*cyRp<0wI{54E1=YZAry|G~?c5l9 zIWhLqF^FGQZ##+*KTk(EJ@551O+*ikAx&u~FVa!YPx{yP$?4Cj2=Z|zc(;Guxkv}5 zho-{7NHCN{AM=;}x7Xcso8IExW-0$Mf9rE*B&S!(%ZJZfD`K?BN8c=y;zW;XU&4Gx0sKv^_rH zM|?avKIC77GkN@+f57SL_yvD;@%u~u4(E;IwkU;5KiZGa$4PRMa58?xRsD&@GEYmf zaH)h6gG=y4uzXgp#m{R^>q8BBXpz&F@viZkH=4TiNmyKX&^9EG+x}vCjOwFCWs#H9 zBFQOFMPn*J0um-(B`9GWMlI5<7a){@&2HXU?OVpi(5j5jsJes;glWbYPxwO!G58h1 zYw&X%xUQCwq@&Z}HWt~;7BVjw%a{_3V@yao)uZkUK5`Q#7xzivFBk4ew(krc+TvLz zH|1TeS)@$+P(w)+izG_sNUtOOf$om(sHn>)YVk|TY%~hk4biGu zPZ40Z^*7&}*R=|?>;&EKk*6M4;*oi9)1yye#3hkZyq6#ZGgRme6ZR*vV;GXj0$mY| zQ2R?~NK$!!!d0wED9YV8KlNgoP^93q+&SJA@bX4rS6PAXr(gOc)%9xRYTjRQ>>0B2fs8CHSCXDCkn2V&XBp8gm9wOk3obCxd#JfWr8exDXQxY04 zx~)w*l7Q5eiyyQ!1k^oai@Ub2Ga3y97Q7u~c zveT#}@6h&t4EgZ5q$m-1IajI|Jtzb;API>ZK&>r=8GC5u$S$b{BW7ErPLC{G@LV?4cl`^dYZ zB88?X;sveB_8p>p5>6|LjReZ0$i_OwFWWQf_S@Qa5QEKbeLw&tl|ugSFygl$T;pR* zVyq`*E+B^5PL)ps4H7c^W(EDAlvFJwy#A;(9YKHDQ-1<0&NN#>T&#tiG?YdJ!^RAy z+L-GQZ)4isx+sdWg;!wLGDKw73%)`;Y(=y`guKzn|^hlf@W2bi4cj}fdSf+DbA_s)8-TL`Sgh)CRc z5-L>O1Ge*n4kO$?V(fJyk%9+OVIYj1LAt}M6stBG*Ko+q&_5JD1??G_?fDOlpEe3V6DN;ox*~TAyf+3RQvfH%w%%+;B^Tlh)*#(HjGyz%!P4XT0Qz>wN#wd$C5^y;qzjc-qgrYlz1ej;9O;AbkV5}!i+-Om9 zN98T#N*e5KMlNyqJPZ9rcUtu-TD>8>vGq-GB!T$VAp*G@?4vV9&v@L1*d92b>gxtx z#uwdW#*;S1d2D^18{PTAr$=1cAVt&4mU_&=#x^QVLj4v-eIu4Pe59HgvAGZ;%pY&J zvr8P`&8mh*mUPR2*}UD3<*GzhtBB5(F|0ZaKtDO^s;}^n$G6?6&5)*R=u;&y-+Sm@ zg}17rC=9d6nc~6b?M3&m^a!Sph!StUf*(i>Cd}4G!XNmySS4pOJFbg@iI2e$KCA{u zxz7o94g|;clD;(#C&8ls`r{WygwhsB$qLro8DNy z&1*<2T|#sc6IcGt`0hXJl|~iMF23|w=^6Z4-=e1(SFpgGL|{xJ(39YnM(a)G7VrZ< zRc!Jdf{4~H{Oj;tIb2iw9%nB6>-0l2lr&8#Uf|Wm9hgvIZdAn&{X=OdnyhCbuU~ln$`%%3?ex%Ts+gyqGh9HI05QO#?y*D zS8!g0;?UQkA9ZDX<>ezLRH&J*I-wIqL0vQwEF>4+@Qk9SQ8qb2r9tD6b$+EaTg(I% zckA36a&2@}ELQTTRrUP8<3 zTLSJpYE9PfSh6KZ%PAXIj}`|xrb{;tQmdF3RLs3z*wWfMnvs;hh?E>-#Xj9LrvA(G4-v6!V8w-4$mvpocgz;6BA^5EbyLCy5Xq;S%&GI6Pd zyiW1ZFW|6T2JPl6wJ{VNMNf>GE>x_#NTn+BN||@pVU8#n!hxDRrir8yYUkr=HCXM4 zBja%D;7}(5rNEho#EQT^XRI*loSdF^*jco5*|~ayjiQ+nqC=EwDrqG}(Z%!sh|Nn| zSY$3}LX;KYundGf`WBMH!pGL9JN#AxcM=lIiTg<4lEM+Mo(t5~V2*XcDo!}+?!4Ye z^9ywPSEoNE$%yIEARPo=3MTOxS1FC&{zRoNlO93R8>sc~3~HI`r^n&;HmgXEHuTx zwZo|&g~HqwYJ;Y&R2BNNkWZAAk$w|#8rr?a08}=D4cWGsr}{8VIsjj!oS4LpNcRLO zPeP7jdXp3f0%VqMrC6GaRF*dIiYG?@k`A2;bzlZ{PooihV!fti-Y1B&Sa7+!A^H`Z zmw`;UDOI{FBWoSVI)W+%C9XNKle>{CxJQyHkJmQPc>>sNJ*HdI1kifnjgQW5kywJ$ zJws_wKiIGp*toE^sDop(bB<<;#XKQs6ID9O5P4^efwN`)>_r~;95eoSfMzR_;~AHLyJSPF>yR=a9$v7drP8HJud5Ow-2f+_=E-J9!bOP5t{=&z z_l8EwqcUl*R4sB_D@GHeMS~n5QDK1fBP21^kaa_M%W}<)V{C2r$ARwA>!kQ_vb>@4 zP&RWuV^y)n?Spg?@@8J0-1*kf-G6q=qKx}tD@I+&Vl9io1NGc-T5v4f9Dv*?CM+Cg zqI?n`?r1iuR3pNfExC4$L?WoYC@6HwAMLtmsc|#A* zFxsAQ>wk*V7i>e&E&+i{vw0Z^l$sAy5<6~uxuxMD5_Lv`@rMwRkgW=2+=}KnvtT2ra+B%UU+x@s9 z827z%RT3(ZYc8%V!g*Uy+DDcO&${0rawW{a0X(G*O@EMYJ%my-PEFua4su z*Aa$9cB5hIVaK%l!0~Q`A)p-_N)86b6!@4kl<>Gx5^bP(XES-nH!Yk0ua}ng_sp)P zwsSV|^7UQn)ukL{xyq;F8j_J7|Jr%Yh;U$Tj?$0@MJ;X1M$H8z_+l+Rd7PG>eEF76 ztQgldw{-r|p@);WYenr6)-5?uRK0hdtJmkf_wm6a_D(e!$KZ8qIStA`QYno1RQSz^bP72zWSEcqiLsZmr?;SZH$@TNdm@{?I7r-Y6`Ut1@^o$^%s{mf&SjEk=y6 z0uTx2!;L$g5^72_$H{-4k0g2hn~?!ZqXXo@|7Rk9_`DV=pa7jZK3nVQHZ%@`0+<02 z0?}`T6&8#!RCm_MteFyP5i@E%*O+WWTPVyfb&0V-W}8~BnQ#=o3CL3r#Tgf${5qF3 zQ8a$I1r<7@G=_qLouHx-kfn4p1~@<`3S^*l>l8m#BNgvpYGM^7suu)9Q1ISyB4ZVg z&@Tn2cCC?1SD+v%)X>Ff4+@(ll}9%U5jgzdS=-j$M|bAXPTtha zYo+m)*0LWt~J~xkfKd z;Z0kMh+07sDQM|fcv4xhnYQG$MZsQBY-{d<{$XNJ8^Q3QV?@(nGs8)d~i(I2ZXEUoj&Pm;*)q;_8AujGU z=raN)L$AdwQD_SezbKP@(0!%0@Lx7^$8V6*8omajU_r(Gm@jhABf9{a3||qt8ZJr! z(Rlgf74a!XijfIq0L0?R3T#+TI;9j}gk6@B{z-@8lZPEGv`tvHM`kKk=-F-2vp4Q% z4o(|@STJknwZ_<&%VYwC?L@O%Pp)Bdpun^> zaqB~ElLN4@UN3)3B`y}knv!!%MG|f9A$lDY#Qk(g!nMwyxjYJSbYp#T?vM)7$lfmH z-YFHNVz_OB<>7Bg_7}uhK?U)b^SHEB4N`Lyguf;Pe;1u}9r8i+L-ycW@d87)YdD9! zsS^~W6ZyqgRXHPQ!@==~lKdE4Q*=Fum{^6gv+;%LcK%spHkhvp)Ra?zL`sW3hj;oS zv8CAdn^Ma&FIZPJgz*)J4xH1d6iHFDro9j`hAl1YXyVpK=_WV!&moM?RvsJOS9>f6y(I1Hf22v_ufw8uB zDwQWvi~8Lq3%WPoS1LO@kK%oe>7ZBlk3>F!(0HM>gQrLsA#*sSK2|mrJh?L0mnDGe zuRDEYICy1vb=LXeExdrt9oT&*b7zV^72YCT{Gb&B}`$Nie~IU3KP<3W4%bf zs#^C$@J&qncb_pZ;uF}!@Mv_odOP=ULfL1eG=JScbH~nd8YNrk<*HAmwO_-bj=z>m z;$%MRBea__3GuS>1cV-M%q`0aj_P6{z3*O}_1^az*0uG9fw(g zIB)me2=jgK%|{>{!;|;WPAx`#;`S( zWq1`ggBarW<;uQ1x$1Xp)V$$S#HsBec+&Mh&U+U>;+T~iPoW-{a9&1Su)n|w zAc+R4*w?8zqH+`qhwL6j=+1eqm8SxB(}F_=b5OxpUbGggmeq}FeD~De-TlTIET>bK z6bb&gNy#8Ife#toxiwhX;l;o~N8Jgbq!CkI074Y`?1q%_>-XLFSS(bhk^)ciaD`U4 zhU!TK07IXAqljqhm*+Zs? z*dfN4)Kf2tqEg2g<8qgYsh~ZhB?2AQP+2i^hJnwJIovhsP|}7GHk(+S_6a(UQScdJ zhbVi|bq#?mX3i%>T@Uy%?GH@BiwHfgXudh!ooeHhY5|qhN((3Cq#Y9_t*ESC!m1}A zLFo!3CmC$ib?HpibPT=4U52YhK_;bgI*)Tw&UH^{nYOB0*dqeE^v87?#0_5cJ;q?- z7YJh6v@&|Js(6hG_Xb)lD!)k!-;ibCVV3lNycaf9GA^QE{C#y+gq z^Lw#j{o@~2y`bfk1FCVy{QlU|+3J(ML@kW^6Tc|!J58OUa}(&!BU5~8qCaYg6xSjy ziFwTEk^c#U<}pRJQxJe)+fWYBk0y%AEqhD9FIV^1SvY~MH3_KSbr*%yqySP1&V3XC z`V9B1#T5|HjaPrvX#oYeKcwL#siPa&ksC&^71t9%h?N`3Zvq8+Rk`(HM2moCS{gMuR4k41ka)+L;we$c;k0d{RkEZ( zLiyd9GxV_(^(6os30X6Lv=o5Ual%z67~brN)OY3)9NV0Q*SZl-;@MLi6c5(bSL)mT zFa7Jz8(6Ae_Y^r^h!V*=Ezapx_quy}0s%Uw*SJV4ankQzRrC{p)=u`jZvXnkI@~P^ z^V~XY7rlRB9qtvrx7*g?eo=__E{di_Auc-atv4rsr6pVo_vYmMymyL#WA{-n!^NbxtlRp#7%vrg!y=A+^_6osLZAb>O-M zh0x-i_h6%HyW7vTr$2S!>9f6;t!FO}pYOdqtjN8d#DJKTHNBb17uMdsx?wQRZ!*EB zzB94~w`RS;BkS^A4@4vpK$QJtG(woi`uXK)|N6?BdIMH+i{Ge&6-S~qDbRN64epbW zSl2JE`=rT$)x8ei$zQo>jgSVfyXPHbN3_O~ zG0HhCr7p-N?!*n0Xy+$aKXy>O>ipQj`Xr~q|6TfDKm7by?BDD3zt7tHyL)N=?>+eV zQ~&!X|98y)4M*r+zZC5^nnlBQ32RMhBJdLI-j6}y4U;NG%Uz!2dt(Cc7#+RnwZsGe zS7GTUQZzAuZmi7flyg#WNUm^-JP?z_&PB+UQj zB+S1TlcAR(8!t(NUY=LIEE9Smu{u=j6Zz7z{b3RHGmd^wYZ)uPn5{*+8Yu;Blfc&7=4E6YE5Fq%{=*j=LN+K$(xZvV}W>-u$458kfP*cANaaPC#~fp9z%+lrQ}n#o?3ONGG_E| zPp#Z%*#8u@a>CcA)AdP~U;%t2yR&IgXG&sDB&uJ6P|cW3w5%!l$8^8ff`IwPzq9_! z84N&3g~K+*bOk%IAe2>G;4{n#>}{3s z7i8xhu5rxrdxCd{c*nlc<@(-p*0@McXW1|?Qeq}l!H^oipe9Q-#YOMh*c>6Vui^;B zn>!C#hsl)9s^W{PnOL}$&`ob2tG!al%vzTmu2h-EqmV}%?#pw=P%+JPAGvY`Q-wNI zP4uua-*m$=4q{{29B%3_z+$VE_kRN^t&xvb?*}I0m=kRsM}pBXnz}00XCXmtUILqu z)0QR96;}IXC54HSo0Ng0HqGf`t{{d_Yb2c$8GP2L+vdkvYHqTwH39J$SoozTAviN3+mh_Sa&=T4#H`s=l$$R#V5kNXY zMAnt?hZ|j!+BoJ4Ornrc8tTC36Ae*T?ukwS-7>sEKW*9=hu*Ch?%aCrUF0vkVQX=- z_{;dX{qo!B_}SsX?(Uw>JGcyBbkDrG-9&I~Tb=M+VU1!&ZC!euj^FtB@4>-aM6Fwz zq<2#eULpjA&P|c<-h=t-e;HA(c%FcDID=5osFK-)`ck0mi?>Jr>zP_ZcOLq|V>3{R zRP6y_EU&Wbns{NMoQ~!MQVXB)7K?=@SOmhUJC2YM(mAR`>=%C2 zl^TC{lwo9_`<$k{f!Nlu^@c+~Aj90q=Vg8D3|%8pI~6!py43Gut1anMwKpmZ^N=d4 z45`cB`_2_B0^eSoci(icJ8X$ZhE1|%(lnFn68ia~_x_@i^=DGz#Yu0;yZ-b(DBC*` zZbj@=KQ;d37>*$cbohe!Xikj5vRWF?a6+SgK|B+_6anbojGXSttCq~;HO8^!d@8+u zpJ)s{5YN98w`+m#3kdX#{44O;)8tMWht47I71HhsUB6oCYG-_;wHuu^9D!MvJCD#I z!t4@Fay!ZF#@CcQ;dg`)URgf1K0t9l=Ao#j!HYtH6VS*J#2j#NFXl$g4qbR&H^9$8X^p|hQ)dzyB4`ye#^ew-1*jMCks1AT zpKPeJd71Bj|Fz=Xo5A7Dx^o)G;Rckl8`8@DNiF+-jav5p+_7c?ae}f2G5P$Ml&sSP@}HhoVj4xk*gg$a>9mIf zHHgr!j5mEau!nRus1Pz{z4aVYPDIms z!^A8T1r8klw})QK4<^|K_iz3n+}YoKdDwpW@>x57_mN`4E(i$^-$E|C&UyS)&&d58WoXbbloCDa}RA-X}Nl`w+Kg=t%z~u`z3juQO-vOyDJH z1M$Mg{yXJFC>Gk*2crc?3?hxd2@A%|Dfz!9w&zTUiG-O{VkXr^11mmU>oZ>knWv4X zhI<+3-NYvZL83wdQYv*O?_|bKTzSw}jl`%%E4l4UGp`Yzh^}5N=g;~~8|2#XB=9-) ztX~&%si~E^kr5*a%hV(1?4esnPtQ~Yth@mO2AlI}J=XRUiJ{)mw6enEcj__tf6`fq zWHgKn$#7qwb)-Oop>7RDzfy-q!P3oQvvB^Xfq?FA$h>n+-F`4=C zju6mjIUO+>9;1=LnnWD+5|}`NTIE%tmCIJj*$E0<1G{MsJE?AL_1N^J#Ic;%N|k8{ zJO@x4#A+I1qC}_Or1I2S+J2Er+0;U+(bmT8l(P8BZ>W;w$@&N>!-AY@%Lj8I8%wZ; z(%4*v4Tz2Nm}JF_G?lF0_@EEc4>b&JVBcdU&{%x(?nA0*-6tE>eWTFfq*UGWXx^e|WzU21 zgI+SRB?+*_a(twpkdHKHhEbFj%sUZd5+ArAAJeDGpWT(|82KpFQ>Lz0<%@=qA zsU2N1Q#DJ5W@4(cp{3#O1~H_4uM(pqcyVI)n`%F%tzs)+YCzo%InlO;CKTYMa`MkM zv@j&DZzY*Lwdza6cWm67Idt<5&+<2xY;S3{zd;vC%l=H1C)V)Bn~nl^&cf@C)Y}Uy zJVE>=aMno!Sw~F*oRCw@l?k8a!`Z(n5C5o2#fvoSMd>SK_g#0)|@sWjaW?mHyJ-nRQV?Y#7l`2bT z#6YS{YGed^&XDosun%PnloI+KnMYQWLM1bqBdO|O4D(3*4HCIu+`@r*#ns=Eq&mRXtyrzx3 zp^NMALr-~jELkrC&kww4Rl4d_gwU1Mr>*nhB?%2Bk%>Q?6Lqar@$bfoYFdiape@st zeRk#HD0Z6aFn2M^ZdsBo(VS4D2yH!Q_mUO_U;X*_2jPDY!clAZN8`V=cb`2!koe!v z_u2=9|Gm5S>`(lce=+>;rgiSjM{o-IA#j)8)T;MjdJ4kwt$#K)I0m>B=rG&pKk1FV zp}=mlW^Q!jkC<``F}ffty1f+@XjL$__yMICl07(dW7euFcotZ?vN0keGHxC%(9Q!&WfKapux7yoo(BV z6dEB$LNy9Sk#NIWMtFaf$%lq`Hg{&~)1Jcs*$F^W%ng3)VCDh}5oZIOJeR}B`pmCW zahCIJI?MTDNZlY3`0U{Wk&a#zJRl|wnc2tH%(`ZT_R?{>iRl_?L z`Vm)Chx@B5}o6KshKTWa^{XaM}mzeZ%6Je z_Bb^gwAv)qA$nj~>eP^+gW^_kL!_bi!H?#=BCzn)=Lsi z6xe5(=`xxvWR60^OD4@G2xKkN=eV{Kq8J^TL?`twI~O^f6z`QvCsmAPGOVGubJ&7q zadC>gyXyRy+Jrh+7oGDsz}fXLmmT{ZItUojlM5`pSu$oiCtwI14sSrRQ8GWhe2Yi6 zPT%?#zS~=R8}JrsY62KDC5EXCl{4`4J}BEt8&*h#AWgTV+Um+X;Ut#=uEtFR7KmH4 zOL0i8aZ6Msw4fpmuK?k!q`+XW-|e0C-u`gjsYeZ~4*#^GTRU`zcrn92miTK2!DR7| zt{L(d46PIck8B2&Qp~(594y%b!30hF!}Z>qe&@74z`_jBb8!eF6lRU(sn?f~;^8v{ z0vE->H(QE-y5Wx^?eEzl$#LKet?$3L_V*fAgTKIMT)##UBZruEg#RuX7>Wco@#^Qx zYqgOh>&X*Kv@w6rHgVFeB<)^F4i$lDFC8k-7)yc0_}}A`ur-z zNwQekiTdPnbq-%Z5WK7JHVh$!aUNwTy$9-Q3j8vo^GL_w_M!V0+@8oI?ps;!ruD5> zg9g!{CuvT680-XSuOz9(u)c@zqGbt$M{h8h(JR_EoS2>%k8A{GgPN{!gd`%Q4;!gw zin!9$p&cQe-B;M4us`Vyjt`$c#r*T9a_li6+f+y9ugfBCfB(tD5QNt|Ej4LObEbTD zi#WHK#XwP1*T3czviCM>r=%l^QFX#4@Q@p*ik^ve?9A*UUgpUdBgMMv4|;NVcoT%_jP&zR6wi0 zdgK*Jn>N4au2kcxk9eQZQ$r^rNAYzYYM4r%lUng&mbj~xThVY+cBA2qaO<(EpWI+h zPH&hrmCAvL9FP|3^UxN)0D5=A zQ2Al$O-FQ(Sg)d0b)5x=hRjz82o1H@PZ{9Xg84`qo`}E;EN4K>X^B(C9Bod~ls6(J z5od}C5H~#e3JyHUUM2vm)@)#OVJr+;=}Np@-!qdE{L9rRT96)A$k)R1oOq>;>WL_ywr>+y!m0e4%rHwbNa!ZoEwX(Yxa(5Aw1M=NzjASSP z1`GN$Ai;+Td$=><2~Lcyc#gc1h^VQ6$vZJkQ|}{VI${E+!jAI7($r38oC%zq=u`Ds z*tfI18tILqp6x|DzI)SevYuZcMJ~dG-<{~`psR&S{78*htV?H*NHskE9lUrkem;IN zJbd~5#o=DNJ>DC&4__P}3=aGba>FO*2fGJ}J(bc) zby|+Z1x%8NtE|frmGc`OeJdWCXINVfa$TXXas{3%G`{owQmea?S`>`XMJqW}GWs zrH}OZoSd%=xWjuU1Zv}Bia&ovy>ka!Jt2WIf1&%?!Mm9Zqi1+KzjFsIp(iB2>VXrw zJ2$Q~+F6D{3r8TfxoGaz@GljmM-Ykac;*D3mWyxkS|V_7kN2MMzt}&Jq0qiy8;uFv zBRVxzVI&7tauSyVYP;Qvmv1rYK^7q%w5zul$dATPX{#skxd-)4b~t{1tcH3O0}JJZ zn!-?{aLH=I!JRJ`0rhF$hpCF;VMT9qwGf9~2;%$C(b zA69anWIjtYLX-KkPdwgjkvDgohL0Oi;8FzW$`z&<&o^|Zg`Td4Q`cReqPd#6iauy8NfWqG{W*yuFqyhdV?+!i znVpsAZ@Xv7Z%sB?8j6AmG2vj~B5|Es2qms5suI_QGZe!k=Oqx{8j?s7Kz-3jiwy66 z%&o~}eN84g1(^i?auI&m{n%VnlgUGBGSO-he-*Ob$h~dm4+uJi1y(})NPsKz#9uq3 z2aiWefW(rViZ}ub6M8z-t8F`sK3metJykq5RBr`Kdwx3%@67F_#<%LRO?)FiEiaW= zURuk!AvNSD?(rpAZVuj@Jo1|65iyEy*>V%W7RyQCF7TicGb!MCL81^J#n%W#95eHf zA)B~HGcJnkQgXh~I&^JPVNOzTe%~M^dw8RjOB-jgYskjwg@x&b z>7grd_Tw!GeQ^r^lyRUS$$(H>Iv#{g%e2ih@z7le1Ek!({Sxno57-VN8Ph&^ukBEz<(U(EjO~zf z$n1mVw?j@Kvk!jB?J(1g#@!}&3p9)ZL-fqHhi6rBNJT9_>r?QQa*H6Yy4&MZ-R&`4 z&StJQHzR-I5}INi4x6Z3@fb}}QCxD_$SYA?tE*4am+P6WF}2A)G_^ms*niP2R#T=) zt#)x*ixukc2`q$SO4YV@qpH&Es?Qh64XokfHgjbvPw`YNn&!%t5nYXmYcX_boKMQ! zi;;%^UiV>!+p6>x)W6o%(ZBj#QGCBzd{LA;DkQ0qIuN84Q2b6fc!p)hhD3b1*YL=( z%}LqNJl4R_@=y$OWEGNmwvnw*{1lP|Hl}>HVwtVH+R*^xnRJ3W}?1 z)p7xoG*~S_Otx6yWxLo~0eax7bN%*;$tz#+#_55egX|M={UvpQs#`R7p$Ar3+ZY5-|YVP^LiZ&iLrx6|k&>i2(Y~d>w zBpD2^@{OD25GI?Ol*!HMB^uoP{wh;|Wat%Usp;b>{^MKF)KS$vLM3;;fvON5m9DhW z%jYA=nWyKy)1UkHW#`K7cTP7<w4PLn%+79|XH8E#lX`v))mBD>w-JPp||!A+r#oaRu|C&lYf=W*;c4hRNe% zQNsiT9U%hZ^9F%(9)y5;&IGsA)+X4m2QLq3HNrVtzsH5n3$}O0d9Ba8f|-+O-JMrwGxvKjz#1Y8l zM2+^2<6U)rRBW}zBWiArB4-H0zSEeLuXwuTZn~yICuKfMm6+e(#_w~>G#+VXitR5H zlLacLCyfpm-a!b|%4Fr~+e+82T76Y1vK7kogJ+M6D+M8L*H#OY`Qxjl4PF*lL~V|( zwmLfHeE>(!KX4KxQq~gwYZ((?p4hhJJAp`<8MoIV)CF$ZO4oPV;#qtMTIF4t;2)_2m11_Dc2?syy zkyb1BSSCaUEch){duyEdH6=$fB~T_zJb~}&*aUr$FI6y&V*YzwWVxqblyI=sbsx%* z2<4Fdq4Q(+!ag}a@4dILf4b_Nob~e?7LtO3p_lDA#D=SjBU;mXb8&57^xmIzuQfBP zIKrCnN`u>-i?dXD6t65H*C=af$s=EZ9HA*lU?8AXYdk_}T+Cp$fP4i3)d?M{QjlJp z3;&H^0$-c^gZp3%(j)0>O7=ls_Cs_aDB%MubeuA2B-;xCHg6pPxsB+bLiTWA3AGNp26t>L3!N`(mpvoU$Zti!)drl3!k39 z?O%7UuGTd$h_L9l5!@r~_a)QbpzkhT_n)nAi}^TwW^Rw7<88JcXPtNJssK`D`O-iB ztcJGkU3JdhzPVi6)_&lQmb3hoi8jT~Ijx-eyQTI}=S= z1Ig&6GHEx|Gh(S6{drz~oKC4MbJaq zx`WBq7(YNNK-T@yD0pSCG4d6(Srx(}h0L1Q$oEo#nG#ZUTR5W3Z$#glU#f~Lc?2U( zRCpgXSW*c6xmJYxYtHhZF2)-ITxi_JQgcRz9SFgR8ZpUQ-`(kvi&iirH|=6QSen|r zoF0rX!v@Q-IL)&+yu9jN_w3J~1ur>9+|P|DK~@NxeicV}h7q7j z_7zAFug|-Es+{W59|t`U3JIgF&7m}JNSWGvr$Y@rT(QCf%&5SkSC62%AwRoynMv*3I&d%5H?v+K~zr)b4tdu&*INrHRm~=fm0UOEeB;6XO{qz{aZ+{Q} zV7R0xvT@?K@_y>-`VEYp?#1g~`ZmZk<@fT+60ZiS*a(w{9d9aOEVqZt0HJSo(n;Xo z-fp|S-5W;!zzueG_g*|d*lXQHvuQeP4Jv{JHWO>xsm0voA)y-FxUiB#so}A8mm;;L z>4FV7TPO`!rRsqwdO&ygyV;8{$y1-|3w;=;rMFM~=arJ+;sWl8@rs?<^2VO+4_1*I zJ}3$A;Ys)l2l06ySdK?YgjS;m*5(n?@cw%g_zOrwoDgwUv3vjT*;Vhd|DdvQx+%^0 zy1!i$&Rfx+=}uc2&zs&ZlWYS!N*5%GK3U!?f=km%CYzea{cfD&=q6}5;wRPD^ zD=9GF^DY*%kOa{=7p~DN|K*JzMr)$4F)@1>$YlwW!FoQ(al>FUs2(j4I2ZomV!!U5 zcdV`P;#J|rB#jqTO^nfoux?+TT>oUhy?%3vH&NAO5awSYju-i2rz#J=hm+ZBZ|Vxy z7)3Tjb2*vqdO7j#1}%2b$if-bza<7CR`)E?OS0XB>NGN@IatuGWzW41O>(qX3 z>e}BoR);-GX6oJ@&#oNR7|aOsn|J`1*QqIm&6pk$YPkiAj6hL_E`{$dy3V{(7cQ7q zpV@*#zHY=@cxuIh0NdZ=xWj`cghAf~8~L<4{r=-EU7QC7{sM~^XZD4bFV5`#3s~{g zR`8ND4p4|YrNVwC6FW7p^FWtn;f;XHiM41NZ8>8YzUlhgTeJR_Tzc29x@#9)G4yW* z>TPD-OhW?e*k~xk|5P(r%xLFV!IH9u_fR6abp3({9z?NiAKpW;-C;%TWwHBaqa7wuHGf;cjjt$120 zTbaV|%?-UcHMbhs3JKLvx+Rh~g~d|BW&Q1_kjdPXncj`knca=bH92b!EO`Yq@&d>k z@rKjQv9W*LM(%Oyuw*vd^vL9=g_Y9HtI08Bx9z3?fVhUhq#o{Fj0rD~0C^D1g_GEGMaqKvW%DrlLn>%8k&*401)QD4&Ju zj5onSnndi~B*+Q)HyAdQIpYSlp#<9FGNnKPE>#kJ)kw08=~R;J;zw(DutJKLTz;1% z^OPT0QiRlt%~r(q9&J^Tf-vkV@79(SJ!QI+6g~B#u;^qKlN1~cjM&5_OxqEq8_k$? z`pueV6ShsMLSS29Lg^AD1)!^!Bv<-bEGBMp@1xH}o}SuVq(_DM;U=N46%UbAQmnyx zPnVUH#g=e~*my)msYGmTB%_4xJOmNZ9yk&7@k&|u^cRK25n*yhm`sV*9Ct?cNz1^^ zW|az1yj~>X)NFa~SrZQ->apX{1YB%5sSSQi3`z6hN*@pSxLD4W@rX<>$tq{}R`BSs zDPSpd5sz@9RzH3yGQQ|#1QtH3qyIOD#3MI}gPbxOH^p9!_~rM?@8a6-@)!Hf$$$2) z?0223ez$jlCzXATbg+BTMZXADXHZe8tc0Q%j{Kwt5J!IahDyd`?eZ)RVgJ-QIkPe4 zL@ifUxa<{e9hJM1TskD*6~#hc@O8gf(-Yq%${W$kRTrc_TPaZe)<>lzX*r?$wzBQE zwNub)oB^gm$`ezv@aNN4y zLu&hH;g2YO`qo%9igL#sm+NFS>dvE6Sfe6m9%1yRRTZaa$V)6xqMnULl2l4F%CN$? z=21dn5thdK0`$9Q=a4&or1LBh`RXkKzv0I{BKOZbolA^PU+$B@b&uo2=RKnTSMSXa z7#%BQnRM?lM>R&-gw9~y#)R}MS=VEjuTK$?J+h`rfOpoglWs=@|=-4>vqc`@?@#ql0ADAqE99j8@PXie?xp5-YqIEB!G2C+o(DSThZsJ(i%F$8+WJD@QkEQXz?TLIT!fe{Y+_+5o0J)ap%if z3pUISeDZ_OLw6Bb-5D07lbAcmjGV}od!tRZGq#QUW6QQ@jyJdM)=~WW zefQ$5_r4!LP!0r`H$q&Zjp0%HA>v+YFH&lq8z;0eY#0YP?_Rw9Yx3jz`n-eI|J{>| zIEVs&0>4tag*PXsz1TYdnKoeWpse;civ^o5jo7N30VepCwz3BU?B!Fsz20v*q`Ox@uK=bL-rjFFzw+>aFKkcM~@{IuhdC*>G4uOi~deJXLauaa!Q+Hh0IkugbjQ?xPT-^G(So152m%3Gi{GNpnm&}lfV?9aWJCmj9QfnbNz^V z%Jt#5zoN%TGIA+fg#Ktb3lJ8F1VWDSaOW>5p&e5c9KpDX%yFz3J5Lr>OqNPK`jDT` zax6LU!y9+XbT?{B+zi(CjAm9k&1*D2zx;(Iaohh zjy!*B%c{SDS#!6)R}pe&%rW0+aha{(22+1xEqqva<3`6vuvE<5>1@~v{GGks_OqS# z-p*cohl>J>q$kB9END7;0FGZN!f9L5QKw|_ny$R(-pbo zEEm?he#^q804oF4dDl-CYnbTJ6I=1nY8^J=pXW!`Z}0lsd%L?Yxb#r?ySuv4NY46>(X1 zjiizQu>(|f_9R6@5;D0pK`B$!Rz?MYAP`~zfr^C`()#5-&d+GGdAZNm>^{v~{;@fm zd$`8}N~x@xwwX%nRuK^%zWedBey0xNh4VUs!$#mu&}V0S-OM)3SI>F7*&bkz@uHo2 z>Nt6H(?>Uod!72kO+N1IBMR_GAljau9ZHUf^29w{71Z9}Qgk1IfgUxRjee^O zTNUd+kOp9g$UC6C$bLn+<9_H&XL57!8Pi_#RfIsvo(^f3%3sN_c6P+0J|j80wugB} zOXPE)x+X`!6sJhWB&%q#PRywQGT8M`ZzzWQdzrKQWL@{tI*wk$wxp9IspjZoN-o*8 z=;IOMcerye*3Xt7k5q5(+}X^jJ*v*xeXS&qVlI2Gr@Pq4m6w?PgEr%6n)QjRGP`E< z{3Hl=3q5_9`z!U(Up+J3l|vYZfgAb8tpT+Bgf^g~v^awhs?#Qye^M!*@x2$=C?3A-)s+Bnq zk!gUjl3$RH2^IT{y*5*AZa)~e;`AjC7~gAqhs+^zqofkr**Wtboi{05I6KByW6uNX zir|uSe3g-`ZAqoz{+k>vU4*j*5;l#G&W7*byc?YjQDSAX^-qcZoAkea6s2(;4#huG z|J!SHS^jT#`|ykOzpeH^<^O-ge}W5k*KFN2@7A04UE;Eh@+*5c`+v zWv$t&H8D=ab7QaOE@!>Y4k~ybx$x=e=H}h_rPJJT6d}3e7%_fdvq)uaW0HROyWL08 z6-ws5DJP{O0um`p!Z3)X_|km<85VlDG9M^HXFNh`mH%B^dQ159K~*MJ-P_^#c69mX z`)1aepIzx@d_+KPE4Uvh@9v#DMIXYunYZ%2nNphn&Z^e_9f&Ag%}#FVTK@%>PFAk9 zZRL=?eQxa>f309Bm!YKF{{Qe&{#T*@7blma*D#8@zxv0~|7NqyE zZug(`{~z+7viccU|4#Nyn}f4w+C@Y^I=va5jc&*K_uJ9<_Uh&X@?`p%VOh}6&PS)i z%kfbEHg;e34300x`RWGM3x7g*TU1a5n9yg^KAZ*KR+%qRkEJgH)T@@i3ge0w>oBfrCr(#k zT>grDt+0dBs+ZWw%9k=B&%Iw%z2|{eevX5!e8~fT=5=MuJSUZ3i*~TIfO=P)P&b+` zj$k&As^%qMU{P7XzsKu7-cp4sQC&waoNY^8`I6h~JGL%h9sK!0v6bMJq~e5nuKU~93tw?YsB59q+kzlU|-TDn5(^j!JX zDoj^X?@NlBTBv8rB0viI@oq1gMsx4Zv>I(K4x9c?*`n{B7M>Tx&y^=hwyaE;gzK^w z4?grH2+CdoQKIX%Om5IuESmVPjlUWDf^#j^8V;Hw(EaeomQ`_ z{eL?>jQ{90I{km@fB!N5zeyBoXFumDOoN#d_zx6K9eLAmzCuXWI9z&+QV6_@7a}Sc zPylD)K6=i?^VoYMBGgcqQDYX~j`#@TL;P0z3-2wR7-4kqkNXfVjD&m*u#HJL+c^98 za1oH93OnIp{vrplr-8+B$lVBi`Y_*6lo0q5x*#KJAn;h|+~M9Q=$;2XWlv$*)r?a4 zL=|A~?tL$qu>%`ntUCLb2ZxSVqvrO9@b{B9iTwm#{0u(`lq!PGox%@=b%}ng`)3D- zJNu&pajJ#R;QupMF&=Z*Ss zXXhkMU>3Ch&gIMOrE?R`!ob}*eF?MU2AiGXOJ`n>=;04@93=K)=jWFyd(@oY)zQf? zUWe>1wzD(*4A(wkdohwXU8o5w~_(!Qa0+7d}&E(KI zr$3xmk(c@bloJ;(Rc;=56F-d)oj34@GhX`9D!jjU_W#suG}{MK2>AYWh;WYAVeNF0 zx+~{x?0XAmAB~%Up<6z;y+Bh;L!O=f`MV|uiyxzarlT$P~jT; znyU^yE&L<^!S&Ph(D@Pe=5piwERUe5IQ*%?%jlDLe-Aa!u`u-e7XDNfeQLK3ou6UG zfAn40`l&p>2hR8bgcKj9@O1=x3c4f@pn-9^GWz1r=l-hMJ#}PX!u(NX;t_g&nWES8`c8Welu#tasH_kaM z_6m3K<&THXyYUI`;ZFfRGR|Rqk-B_t-m_9*n=@h$`ZV57EO8P8A*% z4I_OYg@__Cdg*kV{X?hMz<-)>Dw@r96aQ_s>2G?{?cl#X`nS*j_A$bo%D0;Mq|+D> zE>*MLI>v|n9zHzASKZd2&SMI^&(4LrO5+FE4dp{|m-HS-B4^1_ux0x|3a`e$nAm7= zvc#8}kkOa|TRbL?u-O`5KiZux{@ZQPzb))vpZ*;*>EAy0GTZ6pJ#dXqunXlO9F zB&|k|TCxdJ`3Qu1VQWIyayy0^=)r!XzNhG%=e+k|U8v*qyZ(s3?XHV+q*@Z{<$&tQ zliKor31!Brm}KX=>!nA@fxcpB=c9hxmVN;2;s;3BwjCoo$;l3u|bJ72kn+3mVW4e zRch`UXI~L1h3JjW;G&qyI(k5jpCPMt<^tof2)GAA5NGbAKdaBwo6@_T%IG4hYsA!P zN=)A96y8-qIM+cMmrzchk6pI~C%4l)tNt zMHCCkeiil2t~{);kN0A~-KJVE!e3Dz;JgNQZpLn{I1?`JK8HeF?kRML8+tb$3xqFI zqTzHJ-Y&e?s1S;iaOG8WpjZwE*6t06=)noB!GD^zA(G`!s9K@J%n#}h_`sMms-VF< z9&ED+xK|j=iquKO+wrrdJj#99;dQxQ_<_F$)^I{R9elQ?C%_ldliXK5rWF}stR$06 z{;2dAX<6vphOv*uWBOT7;HO=_)o37*WO950g}f){G=x#(S1$dAqVPNSS%*7yvJByb zP+9uxhj|#zIS`48^)L{n2bUt;2fXrb0&M>i&fbb66W-`|0@PQ0Si9(%R0;{{uR#z@@0ih3l|_lxxws- z>B6VQxU$y?8myOkSN$C>-B~M31rvk-?@Ga8p8Yo zzYDi?{q-$fy5{fvi~#4^Y4C2C0qZ>THhfLfpZV%}N={}#yI0O@OjgcBrPUE}K8Abg zy}R<3MC9>j{SklK6?K|CUqH~-o2Y?h<1Pc#)(k^~j<_@*%y&TqvyaT>ia6_(e#4apzki6QKEhhpXLKocgq;5f_k+7| zPTdGd1TQr`sZaSyu3KFY5IWr!A31jelMe1;&SvZ$bg4{XQ`TVDpMJEgbWn7g=c!Vg2N-uy|dPq;aMTqtN zKs}n>akyoIf%DT4?(Q(+GZm#V+#%5e?Vs#dZYuh4jduD#1n`W4Jom#g3O~8HCj6Q= z#v5R!-K8^z30g3_fWPZ8{?1j{>rq|7V)er!UEh1bEb){2?18K6VQa^lLz{*mUYsu6 zDB@MSmuK}UKdU$M-Q^8<3G6Ho|C=zK#i(Q$;*#MbU`6;*?z>h~ORTUQUIYXW;REO} zs%Le6mizLU3FP=!AGm!VW?}*y-lgx~)3wG=>vMcsU%}Jd*TOk1W8klV(;%89f9Kn2 ziIf16!D{ZjO;I4lMe%_La943DXRcn>g?scvI!Rq&^-geDIKh!W2QK`#|Glh|(y3r= zDg{-SxbyMaoqA7Hq~de4#L)U6`1P|r&Tg-X+6lfT#+%^L1zGeWO#ha8#8$=psJ`S! z`Hz{NJh)M^@E?GN@>3=PucCAnIUmz7)W~fs%=T7o>U?HUY0(7=(Re>RiE)oD$eI<>4v|~(AaUes&aCp^HX&rd+n7D<(! zRlUYm`aL;@(E|75LgW$n-(Pc7eIQKkj~E?v1tVWo?D$VOEvp9Yr2(oF`y%a${_rh` z13{G*;M0QN;3NN+H@K)X%8ObNdRM>acR#=)0*@D}-E-V+hz`}qMR|oL%-A`Z z%vNbtPbOjDrt&fO|I!CW(T#y?U9C_HRsP+IN=0)zM#p_ka#LWh$3C!+Rqaucm`c!e zw?v7!@*bSC^brH*DoEO5#;-{g*J$OquD5O+d%+@I(3X1Rfqb>9+Qlw?1#%u%@fL25 zRlG>ia0ExPYN8fWY|`v;4@9H*0gfS18W4z9s9dP{dNY^T^r`5gElXd;hhi2abw5Zn zhPGcpL{N<#v`#eo$Mi36f`UD)YA(=xCi+b@)ijRV^e$RJT0;Ut#QB%K)Du2QfwF#A=FIzmVCl6r^;!#|+7B1RD zVXd(QeJ7^|WnCAA&w14V-Pzim%Qwel=OUYzs2Y?W4|70Qp8F(nH(W!Hd;5vDFR<;E zcez=DzdTlF2Cmr^3}*|$hHKfKk|BvSp`yczlbBgXzp|@V5&E{nR#`2lNp$ngL_(yH#g>k;aP}{=+S|Wx(DFWV)YFBQg2y|6Wvn95F}NY{^xP z%Cg#dIt3PJ9#&o0pO*NtmUxQ~JRopvMHe3yegNGEL3rU+l0_^eYUlpI5=G8{ z@Og2iYF@;XnJPt9$ef+KPmzbPG#{$IJ|CXE9^QOrZM=x2bf*J-3aifkhThR9?UtN6 zT$|Tv5V+xL7FO|35iIWHLD`T^8%evxbN*8ZO!QA-=vP$n0Pi30HQOJ=ez5T40H^94 z_J>z_XU+Y&k48*r9#NagFruteYXo>p;{5}zSQG-UywxXniE99o+Z;dC;n#>U1#%jk zd`j|uescK+y#kZ!lQEf5C2YOmY5T=@LjqBH<%Ya)!pEI@Kvbr%e#;OJ5?tO@>o*OI zB2=}IaX96~5qp))#B2iZn(~ow)b0|l#0%0J#+7$?jHME>!zg{?667f7BnCN{O&IX= z2m05=XL%)o^@0=xy$0F%2fT6J`3ktJszIN~Tez@Uo~51~^B8`D1q+;;O#t@n1~g1TgX*ug$0nK*tzj1o*z~1YZuGZA}K?444A7PMnDX4TVA{Cs?m5@ zrWSa$HI|{TWetD(KT%7+0`bd>;EY#YOpmczNAj^~_S${fz0vBo|4f`Wzy0SVtUMH` zCz_yXmJgy*Xk5DJujRZAQ;eROBADdAZMa-| zn@Tndc8#Bkby247WCa}M5-yz7ujVD_C4F_={ioOP-^u@1BJ%&S{=bcOqe=e1%|4Xs zxBBG&+v@$(|Mws9AG+SOYp3W2g#NNq4-O+b+N?LES8?{I2WY7WHe5U89p-#d4hv4F zdpjpV;7|pz6L}aB;32Z;jc3Lxkzod##az2&?4~CZxS^sAavRI|kYzAnJn(VGPeO2*M}i7%-Kuq{hXMmR^FeWiK4NOXSQdeIaL% zC2SAOr{c0pvjf!s5nrk4S%nE@=*2Ym=xnEQ!J5sjX1TsVi@=8f2N=~$`v7ejlc4$l zqXVYZ+tv;20ruo;yCDwSh#iq?TNYLZA026&W{|2tOmTxan`l}c`qGR+qd{E?pf4pK zcMb1x#&KldF2v=_iqP!)No;$EVp2}ndJ_-#%8We1fn|{?3GE6*&CnrJos>pxD zq~(aDM{|MDmruCnvW2ih75xq0`M9|v+(0V>ofyV&`*t*T##gUze?GYxI`H@P&DHzS z+3?JH^})G)J9JL3u0Pz2-n_ka-d>%b4R6NI$>kY5y}Z2{y?S?h1rK&l#_;7XzSudr z{NN0KxxN{W$IjJ_GrG7wA3p|?OY6RPT#`MlUJkj(d`H7$m`MVCARe%8ar{WPi}5Ur|-^BZk+3P zH`iC=p##I(IU9{n&re1d!?QZH4lO#v_ruFuXZ-f${5&_xtDi52H`sM+h_8mw$CFp* zLu`l!c{aKkp5EeUvcFDY;-GuyhtBwVcsjyAhQAD9EGIV~4yDfV@Za7+A$aMWom`x} z8IE`MpP3QN2lwt~c!6DpX&AqIHNG9)zPlYdZ?3M+Xr9NzoA+?7jsLuJel@1adN&>d z2|Kwxp@yLfn5prf@$Xmf#v_`u(Iw_tdUt(`c|l=$e}-9sKAym*XEeE2mo!wEpsSk? zSSii{&HbVC^V=ajzrp#WnL5EK7{iR6-kQarJ($2-V~oz_@Xh(?&G7Pch;Og3mY+xC z;Q=hw2(!6imDudhC(!0Q8Zs^s^osu+jd#?BJ*0(nMz5Wdv-czHwiJe?ACF|4(3G9N zmFfN`c;f%x`9A}>=^w`bb$h*Dv!U?6nyohFf9N;=iU0Kv`R~Q6bgpBSzA8}Z#m)}x z8WlX&YP1@JDhR^hix^9Uf2W9(zdDElymljUH8vv#!eGWh zDNeWEY&h>I^^eoQd%s<$YB~d~h9V38>ZnxiW{AQ5ffIz`L(IU@APqxX#05c9h-`!4 z^}sG6c5((MO?lk2a?q+Vkg8%!LxcgQaRfd zxCZq_1#j%164DzKJCG{+);P42^=EXFfARxdpXn66b!d(dwpfZ>kIrIrVyDajz`X5n z4k2VNPbg^pjAGVRJI7W#tAgu2PLWbD=H3AN)@=ND=blt;T-|`C|9W%1p<#P8@FN;J zF1$C7*d>e9mQac^d)!9uqaRBJJ*z)lhq-$6Rpz?SUmdrtuh2c7LgO(OMt7dzrRA{_ zb0QeX9T zd!-_o-d% z#zn#`9-KnzCvQV}qvX7{jAQ?|)QdK_K_+et{5K^Ypt&BM!6Apkn+BvSc3%5|cNr$+ zr*Br)v-Ue$A60i8$s12&o0355!UWAZ84b*uIswfVP%Sw7oHE$W{QCTr;n_D`py3$1 z;yR~JvRUKb2@7FZl&axQb?u#$n;uLgL9jkBM>IdNbvhh!gt=!q2)Z>*Bl2n{NK^_| zi|cbQS^KbT++43w+8nxl++mO_Ek=lri9k6c52YK=`OYEK3tV2#ydrhAwj6%iB($PX zfEK}#5%;>rb|8QeKfI$5S=#3yNqUUAo-jl!&hwPsL)CEII2?To!{uYg!NxdjhFgm* z+G{8lne_It*SNrVELa4VC8Chindg$3fD;f2k)mug=$Utb$t-{X-n$rKx=)YjM7hBd z(`~rHleAkuJ0`p)s2f^V=q8XYoMM8hAcz@+%TP4Z+#OR2DaXB_(xpIMvdYfCe2-}_>dm&C zMyOcObl;x5AKs0wu5U(H^zp$<)c*RMtg-uyJd|w`5v@MDQ3OEfFGECyc6)$#P+dS`tih* zNteyw;rRhtfhM;(9RG|;Fh8Y8<*GLR!VLG88R*xD+>}R38c*Z`Sz8}_jS_XrDCqw(6 zK6>?~pF|$zm6*=`8YNYD#6fv=_|2Jw?9U~Eh`9#}W)!9q&136O^2!QZfO$_U*3+z+ z4Li`7GVRC~>*iOxQNG2RcorhK3E-ArZ(tQZ0Xe8A;WEIaS$;y42XCu3PPWDYly@F(#aNivqh-r*fJK_>_NF*>?Z zDUk4)|zqF&_;$4GUedn2U>&ws1Nd>a*6wWxU$NL$s?MM-aj_BWJCO zZL2#dnfXD#TXswCWhd=0izCFVA>)g(7{_2k`vf{eSIO|^=IZ8-RB0!e+xz;1%o?6q zxT9l~q*if2aZNBe<~2_f)NJ)k$_T6B-rr-u6pk^5H)6A`4et2~x=uav3P0J zkyf9cW~pvqOT)J~Kz&!zM}7OI`*@lB96t3rFFxY64&4Z1+UdlI(X6q+!Hft^8QMdr zssSCWt1<2-PE&}9XkwgvV6&W4ilJVIaZGIV%A3RZ9z8zFz+vcf3?svBWI7Bm)o%0* zwx&q4;g3u~U{M9K>3US&psX?-==dJ&fpS{ zmKcQYut6?ePB7&rh#regjGb{#uiueq4!5Hxj6c*)BD|LO#5BmJH-fgKVRn&bsdrQ8 zM;amJL|sjoChIh*J0}<$9AgGTJm#p!!}>_*6>MCqDoV5f)EhW=!jy>J#z z>C8F%a&@djpWVz|UD^#)7tunEy~UvUGE&|SKejZc@ZBZ8uJnC$fITA zPUs}TJ%PmfGhv$<<1V^6au-<%EElG_APkffgXp4;ju&oBG{UC2d?g#ckWzoEd@1#* zmnu;=Ohh6?pp<43)T%hR6$!_h*a%9&W|rN8v253#eihLe+i z-cxjfE3$cerQUc#geko4pl(_z4_60oU7gXClwg?85+zrkz_Wb4cloYlO#@v_GjoF$ zxcN>_b1wQJXnqpoEz5nO%UFp|KocHO;=a5c-=5sQ8*8i?$2qwk0dI6B>~=( zbLhx6JW)%)lPXYf@Qpi7GTod#Mp}%=FnCmazrgttw?J_2JlS;SD&xmGDYYHr6crycp`J)8mP#{+XXY{)a{(#8 zLyl7L_=ZZVT8sh2z6y&0nZ`RrQ`40NaO(NK&26rT7Fx5N!Go>w#CVI>eY?vBJ z#)P5Xr>m)Wt6>|k$^7|>6iTZE6Idg-HFgHRo@vsmK4PypAwDv+oGAz0kVbzQQbB_y z=IKTUHrcXzKVsKWbH-hkO7ZlWQ;)>xkQHq}4?Wb5K{sO3GGJ}l+@}&BSDy0kez<*&y-q5D{jb9lMK`(HgJPv z-cyXW%m%pxGWG=%eGndTE7QS7gN|h1DrG#|-S(Zv`nvPsJ0$0-V!D}P_a06G@anL6 zJf-NFIk%fNUpKt@+sB>K<85$8nVrkh8!y4L~ zWyzw6<(cQuk{9L*$6bkDt30JmBB>-dBb1JJ(zuEm(u0Z6E>m-8Svo%9S8|0&aL_YEIkj<1hS&dgb(9j7YRhVG0jOg^J}98(k$DH)jte7KIph_6LjW*p7E zmh)jSROfm!{ndi54cH$n=b^x_c$ouQ*o{Z}VqibIdFHNFYgV!!Ij+nQqW|@KXHakA ztm?(kXTr2xL08x)adLV(9FKuUT%uDkCJX_7Q&wM?tj$_~mN<_&3ANXpX`o2h_XI7NHRTM}G_atAoGC{aJc1g=#Z&YzK7B- zo8-6N>vZYz6&r<5Y{8Z**1qHOy=QMM*h{3BBq%vxy560iJL2)jdJO79^8B^{0@A4u z3<5H!H5)Yy$}J@z&EtN#N>7fWpRs`_7aJ=F_QdM$bV3l+n#T`H;*);Z=Qd zqEl>Cro=(ryq*KY(}T$*&33~wH>p$ly!%(3ZJ8OTp3S3px6Tw-x-V<^$TzYie%n7F zvKskQlJtp_PVg9}=zzr4=NN|qy)3e$2pvmPd975<&H+WNR@h6!aWuMB(QMDeGILtO3-l%HOHQx@SV=*SiL@5-78p zqG>Y^9jHk~oL-H2F&oDPH!3N_s(bVU`U!Y#-HhoifX`>Z2TqJ&a4gA z7Bb|bG&1rYt3t{DjgokgFR@b4@5UgW?DAaG-}wEm988mqNGPQiInX;XD&9!z0&}lb z7jVjEP`BFgPpF(jqFcdJ%e;2&dF{v*P?%SewN!?|y_f?G?!?O!7aqohjG8=&9o$rL z!k;8z80a`F44|I?bs+~=D2%SrApcP)z3G~(de|xSuu5QWwawGTlBAMXcVnQ?yNZ7z zD{(msW#7dXz*iX+?;V@r0eQ!(3ECdg72k&fm(c9O{zl(NcZw5+Tr7E*yE7I;cw^92 z14Mi!p&Z`*J)KqzyaDlXvMGF#DWqLCEi#-gbT-QI12*az?%{slwl8K@?E`0j5<-W? zx=lx2`6?Y~mjt%TlgbYFrWYM(J5CnTz^uB`D$S!XT?6s@SM-5JZz(pWmGy)dMb6kYH(Yb-&yME) z%vgWSb$YapSq{7x8i1B2c3oMav%G<)!20j(%W0Gg;wUaWBH0ytf+`d7IpVFwT>#>P zF;e1jCA>QKMag6ceOjZNHWSRhst2$A&sLZNuwHynDVg*gt_kd{oRW=dMfP@ky=dkm zZ(WCjJVGQ_+K(Llj;2Y?4Sbi@Fv9#3Vs(CU$x-pyv9v5f8#^oR%*dDln-sA8$lD3? zwZYRAcugP;AU6JY#o5vKx!aeoYtj}Wggs0&a&ktcASplL{X%}m^}L?~)RuWFv?v0F zeWX~E?+55ZM_2D!d06)>S4&-;4b{l?wOZAIi>7k|-e2aR;&e%d`rYx9yMDPVK`r#_ zI*woN*2xiueP-zaGePox7wulaey=uYx#vr>RjwGv=!#0))-6n5m?p!|Yd;c$S*u+Z z|13GeZGs>!b}S)C36TtT7^{Ze5O-gl+%|UE)@*7|)*;ZaJ3K(ahTHBmDoEe~CeeVs zf{Mpj1pDcRqbCUtA2Zu$4z>1GW`bbys&%?w%a)C<*rKqz3ej+|AR$TEm2THkYC~gd zeW^MuFOejk+ti3$v=VXgr&o5D^B|dg0p}A$(B2g#PUSt8^UktdDQQztxHqpGE*t5i z4fQkosANu+!klOa_!rEbG~xeVl(Q#&@~0~*JdCa=`HEuE$iFr&HQw{}A?F!m(#4k9#Xf=uH2N>9G?t=w))BZ8C&-puu@RGVyH=>Oa|8+$6G}m?t?nqAhN4LW zZX3uzUNu5aCr~nS_N9Q~zOi!SWFt|ua%qxktlA2bolZRi+uXI9gSKHOG1zC=1Fg@> zF9<$)cRBin*1uKnn9t8ST!^YdYGJ58#JEvqVkTJ}@01ujrr4F&DIU6?`KmG1nP*Zl zY#4c4zAN%r2^CSN!m}xL5$8>*5f-l<^Fp8OF2XoLiDg&seQQtNP%`ejF@WsQR0PmXJiSA z$;}ZN$I+YH;mw8ZDQ}HZ;c)YgCU;C>lxj=Mx0+)asZi&OOxfsG+SpF1di?^ZM|Q4Z zpRCa%ks#etiaUCea2b!C457AKin@guIT9&s$Nn2|-=Z6CrduB>C)1Yf&Oc-`$Bi=h_n9%U@ykA;n^LFp9w#=7h zw^1nfBvScnuC#6XgDcrV+2l$Eq{2RKx3?exAOa7G^NOC~d;(WS9w$jU^FvHz*>{?_ zJM&7KEK7y7WU}vtc2p2=y+Mn9Sj1l2ygx4iHPh1bLYu#4=&*Z@d0sv5LM5rK$QNg>c z^JF&)lU>PK56Jzfgxw*3VvAUkg_|@}#!UmK-d*F$V=5lZv_wje2HbO_j1zXr-xmZQ zEWC?%f67UzYtAvb9?NQ$BQDuCikyXFHz2LAl71ukCBE9MEhb&E*q6ytZOd0=-0=dR zxoT!=;H7vFWG?cXScM6&nFvWr$WX3$FESS|F1BcN`=nfuu!EI7h`I13pMjj{?x;X}%!Yh}JP++9iG>W=fviKu|y{w4Y9itmwAe^Kzd`rK~amdkhBL!*c&uPP;@YG zIl}DWxJgrBx{;u=1?}0y;m9S-MTupxf)EVmEYDT*+%cyspW_y1jXtUDDaMj)RWX^e z)dhfbQ=HQIL&8xiLwSKF&9H^JM=6ylSFPTVL?eWkVH}pgdn7ZkuTKNZ3z{|-&L7w6Q$`KirmK0x_9h6!#r(rbH+c1}F#YdTIusxVPpUS3;^En>{sj9E6i@&QT_!1>7 z3f+l>S*5TRp`51IM1k=v>Pl@gWgGt=e2TwvTsod2Y7=71%p-SWd=!u)@=7=eiF~2k zL-i>0ia2!i;+Nf=dqC(u@7aVbGfC)p1BoqER1tlRB_>G=;_vv~nTP)x0t7Rx`M$^< z2VD6B(T~zA-?&lickKDeW5(Gc^->(N1hdjYF9(7{N&2s>PwO zflANNcbP&wCw z1TK^F^=x!{Md_|ev#LCDS$VaG=%5Kr4mz<*b^X#frp$BTrM2)%RcQdo#p0hT_1T^X z88{^>)R=iuJ{ZVA$Wn~1mHAfg-Nv?{71Ss>nhC^y#X3xrzV1p`y)x$dCfm!@`_DSa zQIxQTB~>;RIx`U$M^3zKZxvnsOMbe*|TggO5 zL@yStR}+HWvl%dRk;znR-p{RWmt()Yh|)cM&JDB-PaI~b zD(To3se+wA?of$sv#bxHGUZ8C-J%B02#3e)$#<(HTx)+!#pQ^A&VUF~SHCi_USd+` zZZyFl1EB<79*${eJ40F8h`lu}y?Y+)$yDZ7)cy?54eKz&`+;_U5Hg1^C5T^?Q}7In zJ;;-<;@m!Iun9csu(hVFVqvT7Ju#I$?WABYr$F-*?TPN(#p7PmAjNluD+Rj9prtWz ztEMAm!}95{RsOuJ3|%3RZ+dOz<5HhSkaO=C;XsoUk3oD6EsSUh3J*3aIM9sSFhj?) z8ADpGbBCZ|0ZBGRFXBzic4X<=;HymPyhL#bPYCePTd5`(dw{k6aM?WyZ9gs#mNnG( z#<4Gg`m$q;;qK!Gs8K`1mI4H9G`~!btgSNSY6^1MwYXfETCfIrndxwCgyJIv+Bk&! zn}iue7^>-6KPm%;e5vsI{?w+8`=<`;o6%Tmh@oWer`q`bJyLAeOQ(bphF;;WQU`;r z8_w>o&89oFm8nv>J1Qz8trQ!+`7cpOZLe3ethhg8!nP16cwsV?#S_Rb#*ENoz1QeV zJA;k|d|)5|iq1q2Y@>Y6ub7b9e(I}G11L)SQoicMAQNsiT7iiQ|v=~OAa9ji~ z%c#Fbs0pj#oiS!arf6(!UbKCHbc*AHZ;p9sG~bI&X)(si9qK zbzYQeiki<(ogEm0ALZcn%gxlLRIPgsQ(P`9A0PL=Y}P2Mb3yngfn&bsTKX1aQ96a> zj+6`jMRj%(7=FkkZ3htt&MJlQQ_EPK~HA0eB7Ma)6|}_@r>=f;|Ek80Oe=(QpDeuZCPWE zBGUu#+0;b-;@$Wh=ng~B5Ho!|uz6|p%v1nbz=3}(T0uW%Tm-VK#Is=65vm1F&_@Zq zznUQG^G68<3mL}jcu+PoMtX*=S}hyamNrq-@cAm7#{L&D8p0YY##?NWeO^WdgO~B9 zSttMEMd6wMNXaR((1>Q?>S)2fE~OQ{-Zr1cIy)k+gLFRkW>tKh&|yQNL>;%_a;x>8 znaGX!0%ipkpkJYHDu{w$*WHO1DE7%DQpjY`k+6MsfHRPZYF15D$?1P?t^}nRnPzdy zB!ybcAX1z}q!fAQxYv0uLd7r`Dg&57&L{3HK*?<8G2>*!5}58b)KvHRBm^e932NUH z^r*wABldVyw<)4?llYS1GqE2Op$RD0iG=YPpP9X!Q>o=l$_kF%`tRDWC>`-qH;PML zWj$v60xR~gsKVGM05A+RwOovVv|~@(bndMxDh~fXlSi~`(U-@a!k5M+zHi|`@CV&) zRa4pg?n`K$2IS4!BfwA#-~8YIdZ6jJGXA<0PD-xu3Yk@vS7I_@hzE`r_;Uh+L8V~X ze(w#;cwbAP%~XEMN`%23q;7I!>V}?cP4Gu&JZ(sCpx4Mvh>lKcrpZ$M;r8v-<<<4= z=wkGj;rA^bd$}$(r;Vgc0UBq_)KB9sN7jYBfe@hMe@IolVRfX0+t zg!nyh0wg)Hy$lUr-w<5UaS6JL6Vi1T8>v5F_16CML2Nt6WO=>DYgEbVP_gMw$jK~N zF{v$y&)oDH^={#|x`utbh-uy(Mbm-a9tPd`5TerG{pRntL zW;36khai+)Cgw}eMY#%9;|$=TK;%&Kz+jMLg?dJiJe_eezAM#?9Nj! zPQ;Ib{=UNyqg`RuNb_Mrgi%!U17n%$&SA3-zxZ;r3_}l{QCq!I7MGk9

#uEAzbdn4-UxV1}`LnywAYFb!c@;c`TV7HC)Cp zxR@w8L**A&x7#$0)dEnoA&OeA8_D9vp$7?iF#R_UDIK&+-2Ziae-#9#sM~jmA7Ep5 z-Xzwq(860T8yOVH%ux9h^F|C>-HHr3e`XXdg~~6Hn3Q=$2SxzZNmtk|lMp7N<@&AnnY*wt_i@csz5YtN65jqT(Zg%&yIMS zV)ejng^_Gj5t)Zxp!RMyo#}@FF`IcO{4R|9ge+HG1Q^9vs@S7&m4Xwj(%hKaJd@8>89AeL0I|le9(4O9=@JYJ z*r9z?4~;yH?s8_^PtmVftHCUfH>3y*!zpYy0p}8Ct_hh-tL8fG7Cc1CN+MU?*}Y70 z){KiUJC3B-fk{Q!Xdcj@bbbV&))1=-(S91^G}((uaiih{soq{0vxEcJ&=IlW2;ff8 zkkf9VpcvEVwiNK>ukIuvv37(;v6Uai7AGoPw>bS$x=G7ZP9-+RHAOq7!I?2R?Hxa7 z87>R3=G9 z&0|YxridMZoTqEXfqdjIUK&14YldIK;8C4J*?4VY{Imuo1w{9Uue)Wh)8(ClvbWkW zm40Q%y4fg&kv9S_tc1J_0pPC@VYS|3>DZDP@?s|ZAHS+~>z|pqu-u{wCY&-=u&K2i zumdPMDQW@F@>^HBS9YOeJ~ImG{Nav8yC{ZkGDw{zJ`S1%k=dIS!|8+`V4w&4v)-`Muz6P6+inx)^BDRk zyInci4pZaIxf)k8N!SrTVPP;2`$`+FS=eap>X6QUzbqBG#W!hNpIm!w%eDw21Tm(F z_Jk1itoI09c2DS&16he*OcpO7Q9E4Up|hs~^zX=lSIm{!Q})Z;)7i6oqAdTN4|bT@qllB$vj!c^YwEcl0{G1Sro3rG_n1L_1v=SmF2|AGPj@bD)*if zx4tOM!1fb-`us$Y!h~DJBBupQSyY`8Q6$Ha`E+W8%j5Sw8@jE4=BF|EFHTNvpS?bT zK2+Xwdl=J>%!4cgkw<;CpvF^8BX5b4ffRh~c_V`i-=Py-P;4R&eigPy*8t%&Vj0S8 zwOMo#(Dg|gZ)g)60e8Kg%~YTeQlGfAP2wfUq^$CUHJ))A9zuO5q5b_>Nh^f1G8L#d zbAgv@gpcqjmbp&~%k2?WuYpEBU{<*YAOVay(eJj42$KcZeoXT~3Qzc7HklnbyC|vZ zTTIfeo2?BoIoyrASaLgEqkF=-XBzTdc!K_cyP0DOEw&D(V@JJ!wHaD(i3A=w7%EFs zEm(H2_&SZD#=1QpUB3I}P>~WDE9G9Krh3m9=EX1DB5>pvvh*Sl%(<+PId%>)UvL){ zIb-o4rprBsv1dBEa?4H9_26`1;H zO5e8eTPsRZf;8UUzOD^8T1Gi|Yr}_13(JYo=+4{k_lG!B(P_Wq^-5k1yv3ha@5!JO+le5h{kpf zRyv@5r&(e&D%}H1e;xNad`3-I9u^cR@)0O@mL|x|!Hl{DG0JiUR?=B3IpoBXAsL1o zJI0A?IIc!jGqGfNnmDe_W0K2`70$i{-W}}HIc=6PJZ8`)iaasj?IQFX!^&^CJ9fBA zwH(-EIk0cJZxl^UjLIM?hou`JJP1rO$F4*1BlJUdIDr+`)_>lYrOde!aqO5ui3O*Y zlrWrRh6{950cKhn<}k}z5{Pv%)3eb52wb~psKWFjRS*$he`ELvsg)uoJIt5X(QTfjmk;|nRC&Ftv?cH>LFW}iM}mS}34g{f&) z`CfLrR(KM7yYMd^)DCwtT9Q~OB5#D7P3T;$fG$R^+*h}Ya0x{2r@&3)6+?sc8-t>3 z`!#k@!vmdSY8f$MjZ4!u?Y-(;i^|t9aX6fXIp=F+pKH8_0_1Yh3`KR)#5V_DlC-UK z#hbR}ys*>~%FUrQgfnalQgtIo0QC9;9_ zl4DbSUi9J_2M10;P7~QhSA5} zCiwgl6LT?se~SJ~-NQ^v+_hsAFZ>738H0ocd**<5Ow-;mXh9Ytb!?B0lB{31H|KY!cf~0q`v?k>sG!i_cBk1goi?E`p zM{bg*BL;3Ed%0wQ!{!7c)5NyFzjtn3hKKF3U5bxxPD7GKUd0SkT1&zj{o(AtzrKtQ zY)wh8+s#GlE8btQ3nFjsMw~%bOiw!D6`dqvzw2$vVTk5qf(UVFfa*idNM;` zB>YS{Od;BQ!oVP@3L&Y3oRU#S6`4lz$jqD8DT^L8sS{|sk%X5SoJ2NJC2vH{S9oJ` znC8nuXm;64Bg`!K#t1Vr-ilXwDFtm8#2)2mp?z|2^W2<|E->HM=yG)Xf%jUo#I{mx z@OCOUUJk}IxA#gUU@LBWRXZ72oVaKbrI-3 z!%@&CunLjuX5m`sD;cEVl4~9V&LMb*oG`P;5%E}-SY*u=D(@I;n+9d!Y*(8GXe4XK zo6EeMjO2VhQs(UmBtKnF!hFBj%OmO1a2r*_Enzm>ovmrPinrBYUXKknk~>I{EXX86 zHE6YB1|@&-Xd5&;eet=%`qA5j5y)IiWK>a^ay0kd<=PE{Pyr@VOMTHf z&b&uwp86c-tE!qq&FO?{$$yR6ohC<1lBtdmbMfeG`2Nki(b=#b#R<)F(;fs}NPh!9 zAEO@%Hz^wzrV-SQ$$Fw13Yx+AZo+QMNysfRFEKG;m`X`AuwOUMpSs6=+S093upGtO8-X3g zgw(7V^)YzsiKQ-#Bv?^MBcbHb`nG$|C2Q6=F8OTNJyuaN=fXt{kRH=#9~ma$sYtIU ztTMwalPrQtZ-OfTjs=~oiA5j-^v+Qoo(V_`KlRzS?`+bJVcE}c?SH`}hPRUxccN{lS@9eTFst6mnFrf>^B~VnmA`q5f};$ZbdEtXfKY%zz^8c6PGe`^hZQ~q zDG9dPXSDW{i^rjJar;hU<9ekP+n(%fCJd-@!`ZDCxG;8%ZSV;oqC*~MnF{V-zsJ!! zA3u(+u5U(Hcc-IPb}&uOOuO z&n(0P;VjZ+4ge1}vcFR7GOcZQAmM#Z9YF-itHb2q-nbLrIddOfVidZA)}4vPVHo>L zdRm1#w-suZ#3`wY_z0iXMm!p0VtE%~pOBbdpi|RI1&Ae#LCWq`c-P3L3 zAX!l;K%hGo!n}xc#R7kI$T+u$4(4kR@m0`LAQj3R2)~Esux|f2k3-<)jIb1*IXe5-UWeiY^IsH1T=eZTKv=qi?lUl1 znbGPeZ=;>oyNp?&zssE>HCt>8_cC}m14i)l`W>Dg4SJh_YvZ|SmxTntOqU0_@GV8* z4BAHzlaM8Ls==JkzL{wdw`_BZW)=f@h!MMhcak*ue3gTT$A@B-D5<0Jt?i_HJ^4x|QWm#}WA~fm<$d#3HM5P|0ScGNR4u8+)ql?xAbF~VUaze@=!V| z>H`&oXk^b)9VZNDXB)w|FSrLTtuFhs@IK#T8%8gmfkkZ*f*p|aU$0(cZAlh2Hg_qL znY*2S(HN6UjA|1jz9-O0I24H&jhnow-qi zFdbX{b`k;N=KWV~5U!r&#&=-tWr`PJ!eQ7bDgw2CcM1#ERF5>J#` zk_&`b@Hb&NM*s~xEx=H}A>GxVS?y#LyYQlE8u=7Q$Hhn@A`2_-$t0wBa=eqYT~L#9 z!P?2N+)Q`o$gNeS({jl8MGKu~ZcY((+^5j@*9VwMuw zG97dq&9BISW`pPRU~IiF-0*lXbnt5IWZVro@Z|#u$$nfGN=ON}&Cr1T;rQnC?SaXS z6kz1L7O0*OVKV;STwmx#a2|bEn&4SWAcV739v+s3p7M;OE9EmOMRR_Q0`o=O2q*06R9la_?ULA)ihZD! zEeIgYu?&JAjQ7F6pzBz@dtf&80TszW@871nx%QX&=;aWn%NiAu(#(;RPOV*v1lj2n z@jvv1#ELB={`}|)QV!n;lh7zkLc2N>RVSAbS7{9+8+_;&0Ux4e zBkg`BL6znHW)S%O0tawFw|<9MO?ipopcIsegOY$x1F2EC>5z5+V+nQ01WcjL`A{Yj z78j&2Vmty@M=iz}zZUcNZS7#6ZF4-(eU+e|;!UwcOH{4=-La_aTyCA%PjZVE#Shm> z-r8iZh`hCjEB1(P&hbNx@kepU5X@$mdlW~E z@(CJpT-<$2#HEkiHK#HXHH;GjCk1V@?A;+@gaBaed}NflDa$_)( zBz0=*fH@?^F+#A#;vzJSU{T=Ma&G93T(Xg|8rjH71|U+-qY7Nlk@%{0l$c7?lF6a*-CN?3V#vs2m!3kFAp zMnTnR6EVU&jr7f-^Gz;n7{J-1>?oiB2cy(SfLHVS=zL zaEi502YKRHc|T*M(-s@R+uDl0AXpUwKLhf?5OCP!ATJr-8ToaIjBt>rDNkfX^IZ`6 zl(grkz+FA?`C*UX>#H$E1)C^xxkN(*At(F-8{s-6BvKkR&Z4HJ9Y#y5x#CUQu{_q- z8LP)Z-)n+<(+OaeQZ%;&Z`?F-m(Cd8EcgK6%33s#xhb;M!()q=$se9(>8`N4ly{l3 zoh)3qMSoa=(2;G3etth|csO;dp;D3OlWNwnr+gSYUx1>QbM8bvo=S4hm6$V~<62DB zherJr(;6L6#Ia}pP&%ToLk6*rk-D;#GsdjztLa9-f3lbqqB@iUivWXQL*llm?~Ksm zM#-%tv%1F~z*sLbY7%s-^3_VZT7JOb4(?8Anr7{D^+M68z9#u2KF~_3>3sZ%9YOoLQfvfBHIYj4D|iD$5V#B!De-~#Il0R@?Z|G$ zIEx%o4#mdAvd4cw zTjDO`SbM(g@i(`Xn?Kc7+2cQ|Ez#=b+p-@2QEi#~+i1&r{LO6@mW5xHJ^uE#(&gPW z`Fy7UO!z9Rmp%SN+Pb$n1Jzdk@gLGw24H8km4E!rZCUz&tgW)g-`rM2PELihT=w{z z+saLpYOCz=x3&otV=SZo#+Km_4B4X)l{$MMsO>p!@lylI#x-N|__&e%KF{;HFV`?cT zzOJr$uCDnv)TMlpbiXp+q_3ZQxQ!E!q@n!p3a;(Da>DRC>|n7ngc)8FjXLFb{dVh+ zvJIi5aFunaR`P)!D8spdl>e5Q4S+yCl@YQ2 zC5wDSIJM&a`{fJG$emdf5>08&sg9};aWcLqh7bdX)jFU-UgCiYWo6DM4N`@Y|gfb*UIG z82N%dCqc6exUan?3~OcnbRIXi!p<7X9c9wij*9Y1xn6b%%W8aka{F$4_ks~at}ZX( z&&;~WU`;Bq5<)`zz!LvT>-gjN>XMhm?vi%o%wV_Cp_9VX!*wlPJFfHQ-6%uY>onVy z>uRgw(9$0p_>7%qr^-jrOk48HwV9url7*2I;^^$|`sC*1Vt6~e;p%#sZQBA3N87ee zyZPh=0+p?d=j7L~ebGC%6QL~X=*r2Uei(BwpAr!ffHJ^ctf*V=0GD${6!%K16K2(8 z%xB9#zSHh~NmX1)tU(j^Fv!ARNp_zy^SRnb&dzjwJXds?*4mKg1g- zr^4iAEbvR#0AQEGihPew9Hy^}JgL@|;uS%IuMw58)M4d|#aU31{1j zRZ@{v?N=`f9l_B^F;vuW4Y?1(^?Jj=1qYgtWIkV+L)*POMZN+BX(JPof%M4`9jZL% z_A@dm!u0O14WGG#QaV;hP$fi4e0u2M$#&$_J?b1WjDa|2kWjCvLAzfTE??BWS7j1! zADelcF4*lv`V)C`M!d?9ojJIXeEd|}l8)ta9U~~&-3v2>$o-V0qAJU?cQ9aTS}1kZ%k)svR-;$R5n|Ybpkg5q{1P?{3AdV^Cn!R@0twE`` z8r++xRy|rrei)&+qW}dd`EHimH1Fg4QJFW5VD_9)M!P85)3 zom5-f(HZ9)LffaDA}o7oI9P`2JTzOjeB4OxbWvt<**mUHSlDIE9A0fT5MpbjIU&jK zS67AAxCU!i2FulIcb*GuVdy1TUW$fNVigvoo2QjaJ1sIzrSo}~*wEGZ7!!&xLZ?C? ztS(br3ooqdG#Ux5ZH!Jlrb<_UR84yAeGU_UDvNO+xQ`(P2|r4*Nh9=&(JVE9Bd*v8 zJ#Sq?x07eJ{)Z~m(Yu%3d<9EVR0KJ zN5Dl)A<5EeNN%TQ7LMGulBbwX!S;nHFgrSKbMFMWiOn*^>qN`57*YJU)boDjo!Tmq zfJoshdiYHhLT8rpfy2MOgdmALa_Ys2Y?{boZV9q=yJe;}Ch!PF7Ng%wo<+t(~pa7S9KSD=#q|YU& zrC6Ui#B+3ThRL{qDja6ebvlQvQxUA8_wd7<;sMbepF7qs*#hbYQGj2>8)T{qbn%95 zK&OKhb!MBH3Q(>fqq&0%Jm^c&kBv04YOrNH>HqAz_ z!J`>$hw;{A43kIj@zOM`-L@lAa}I%1f_osWTaTZEfdi4NOo^*bxQoXjoJz0 z9(xlI4190(?US4f>-M$pv>z+wl%#M&W7<=@1$_~8i7dECL2j%!DwrSt>LUMqP}U>b zLf9=B*|iQ#tuNhR180f`)in>4>5Z9XJ~?%eD3j+ukDohmPg$ za#)NSVJ1jBK3tdbp>|@$%)*jmLbnJtifnGbLGtu7Hl>v>xPeN)&k2oRLm+eHQ9-^{ z6G&rj^7%%;iG>FKzGq88ty*JHYgVCXv{~DgyR-D<;oe?Sc05<%oqY-?Xna9tScf-c zp-J9nZ<;2=6j8)E@lRVcnO5_tvBSt>1rcFlnh=~khSft=56ssPkbM@LtTGU?J;aPq zF57Qrn+nD$A1x^Yv$0kxU3nfa(2A-tH(be3_N;->f;EZ@Rtd7kz)cdxRFp4GObSy< zYPA{#3SfU}P%7k=5)ZEy=TtDIWI)6#i3AH`%{^D$GRSHb0tt`}79yI~ii<8z?pV&Q z4W*7vF4>q}wYl;jDgwQQ^e=u;+wy8`WA*U$M>|&`A{4ak*mmD&+suWh2*SieCWW9x zRODF6zL4t+p`F$ipb;O6G@?7~y?0m>-TL>d2v`wC=}na00!R&AiUQJmXwo}K2@vX| zCL(W ztjT27Jw$y78z(#8L>DZp_ARW2IL$-EOx(teiZ3Ixx8D3QSVW&Id#hykO!sNANV~ww zt4(8g{%Y8V-pUS@f`{hUcKN7;)LTY*+0(zQ&Q`5w(mt_%K(~nI464YrbxC@uK%gO& z6Eb@v@`S+^AN}QdRe`sgWJR|q?-_xF^4?W1`I{y?Dn8jD9U`x}>cXf)S8?gHnAPKc zaL>ep8w|_E(KIo-6G_vyZ57-V3+5o9!x!9FlFD=?K{VdPD;UW% zYMF_tDG^Jh>wxl2OB(NN>l1oo0KX91L7kSpKe1^LF1LT9fjs{>4*al{`)kfGug`L4 zXA$vCSbK?aJluwOT#u27?&+(6J5J+xOUy7zf$e>62g~b2L(8mh9NlGhd&8;DQB}%K zCvl%1TkmXXB5mp7_%G!ABi(=&diSZyDsG-z3Z}+~>qA@r5dZ9Q)b!Ebwm12u1ouUu zi%XK7#;_ETZo9Vw>1){XVkqgl(30WEvVb7Cal*H>P}Y>co77)Qxk{E@FU zadpuS68nQy1^W0{tLo<=eSTk8mY%XlO*&O}i^0vGH0L#b4K{CkvJUeGMmL)a_3^|y zOIz0Baxbo;jrx9m%Hqt^!D^O81Bu!O8EJUV(xw4w4$W?uRHJF zIT#-rVcur~1*4Y8MXo&-RQ)!qv0kn@513CN$rZjGO1+qs^>X@p2IEdb1h90pN2a> z`Ytf`<72R<;MyCF&%J(V(reWgQQy}}ziWlk&4j3_15Q7ftCY|Je#T0cx3-6SYK11m zD+>yUY!&Y6lrjlTJFx1T--()j2??$hzxm+^;+5x6N) zi2z2+P`m_(|M7jl`qdsha=e~Q+FEki9 z{McsRF=4c={kB(21_Wni_D)A-S(rupTgjvNN+T-XTYb#l``44dzNqCXXLWhNTNd$T zfR-Z3`td$9)@w}E>Mnq+JFJep%dyeH*^)m}^?tq7h8lT9NI}_GAWUH3RahnBzF8cVQg8A7*XC z<^)6>L{Bf+SW69h2W@g@8WeFcR_V_SDtBvsIsqs4DFT{rpcUzpGCT$`lHUS`vYxyZ z4N%3@BD)MC^XLPAa{3RKC)vN}``O61$GCgUhDa|rz4f&7^$01=xmgt#n22IIZL-=? zBq@obSKh#+rm2ZnG99f%G{^I#N@9--cNa&5@v9l#uqmH&)8$b6aqy&YuCStR*11Ia zRAuC$WO^|#bNpS?n^J}N5r<-T%fv8k2_2WAd%d1fR68^e=ca4ZD_TdK?bx{GHaGkC z&=GuhyZ~^QI-5>3Yj$JKyb1%UKyeXojah_=f$~$Y_$}9i`Itv7dZe`JSMh|GqcP(* zw?|eo=7jS<~ z3D0+=tBKZgfK(qrVvb7UM*yAeB*4C!o^W7J>lddP)Hs~!%elHL*uO!u>ULl#^>_Fuv>#c zH*cf1d=Q)oZV zl~CeqOC#?!IHnqV9KZfcU3c_x>LU?QRK9K**)E>z_bBCN7dIsQF%YZqVx4@CBxAlm@YE{kN_;*A6Y;& zwXDSBWV8>G)zH!2`UNY_BB}yN5r;gL2yF;8pLEz;(uhatvtEz+->%y!3_BIfY&G_+ zO_AF!jX29)nMtavqAD-MbQG`fKfX@eZrEX#8`XKGXAly=y}*&h-R*5pUp`Swk%JW2 z<`uA`;kwU1cglJDr;RLGb2fhP{C{h+hrrMD?Nt4nMrU7LRn0F41DPP>aEzOd4iV-ueAXZsaeB z?oq|PS&t)2s7(7IY5%mow*S8pn*aAByg zIV3fHivkhX9E&&KZnGGxDh4mG47#=|+L`j|+In0a_tKdSW4#k<lq!F zoz)hbHMx%wQ0!v>>?(U45(rYfUUAt?^OC?*6JSWpfrz17nam7~}!{iHB zs`@H7a=D<@$Z}TIPsJQ96D6V@x3e<)1>Zz)U9||UU8>B=cunLYLvmeI#j-c>Eu&wO zvGUM2!)AyoGUo=?P@n|pW2+3hpNXf4T%*1H9>fau zipdA6|J4$%`APfPbVbmjAt}J&D@|&jvvy^;<;RDshZj}8=yO*FG~&me`!V;)n8yol z)^D?=i2@P419#EW@fB>neRa|TH-uFbAN}#_es@>eluVrz`FEoiIBK3WFKkzi*W-KZ z6^q#wt0of@ZM#$~xszh8{xZoDU8*s0AQ!x}1s8tz+p}hz?jl&OO)IhIaOY0$q_TL$ zKC{T~;*mF7!RY+zn+Rp!F{^uaIXy46LU-p9umklAvn;)g>OpgO^{$zEUD|nwn)@eS zZJk9$Q@V!7Y77fcFij=hn|+Eq^G1?c^IF5?&Sc1x)3YvvCQ^TC7(fh+A9B4JHUG+j zo#Jv5Y|>Jb-n&D3rnHQ{GrLXm68qs^`kHKEW=@bs+s82Ld>H5=ozD-asMRm9I{V$j zZL9Lv=&UY9#>CI+=(<}t5ID6uks{I~WL%PTyP9JoM%vgQfWR0~ZCqsIkD^gySZa;9ul?%zq_swUR#geT)jbOhOt#S$hc@S=Xp;7NR!f2E$9K<&iCKov0_k|{Y!!`R zDRXE=%;Teq@>UtnSS51|!CeYl|F~eFVMVynZ?sjzT8xSeyP8OBTgnwM4aI+594nwA z3tN3sG%!WTw^ld4-o66&Cmc{)ti-@+lg#lLs4zvE(D_m~^oW)>!CgwOn#N&ja}an$ z2db0AUgp()8E_;NdO(LSrgszflxm=NYU~8ha+36t&m7|e;gITH_?+lu zrDpo{{k&6dM)D$o(3})emWNLlswpGkdD;^HXnb@@x9%;?+6!=52@ z-6Xeu^eAnyNF9*a&7|60C+Z)afnpbXkTnw(`zP# z;0RG;HYHl(E&{*nBK;sneOifsaD)oAxF4>X3{-TwSFz7_)W6(OQ%cD9O-#S%IQGVa z$>@8VYj*Sas<}pnNo`eq*1qtwN6f8yz7q*zYEuU!y8*3UN1)&}U`oBaWN6zeGR^kE z<`KR+JZZzs1o~O8BGIw$*b&6koZ={;Nvx#HzRHrA<#_pcw8=0ZZ~SGh;laW=uipIRZWG?f{~&#ty6Hju=7;)&ig}7+A))jr z>%zt@4KvZ1Vcm}JdPmeAu;h~aPokLuh5*l`D=WvI1P*=7;$gfi##k6<95U+7CuYDg zK&o!t=Pc5H?X7#TwFe;S9W+^YUPi*N_34;3&#HgU_fBlImLnpIgHgkuWbiXk+lQmQ zquPSB+nk^ILRC_`5WuZuTvI6bey&&M2awOJUB-tjY<)Dpe@(oErdj;lQ*Vp3M4}WVl~R^qo6Xq&)61AnEzQWA3A&c|&I-A7;Y4MiZ7}<@q+TSy7%T zXO1!qa$qbx%#~kKrR3bv3>om%>Zix+Udq-QPRK~1L4b|UVK1P4ZhB|9??m_=hYFv@ zPWpAFvgNDP2l#`!O)!uDy$^jYQ<@Fnk{3H-y>0v^)p(IlKPzIqCgNpuBT*+R`>Zj`AoSuCehZNgBi6NB}4lvc#6dQL}WP3Ms5)mVLD*gefm%tncS{ zfUZ2+XA}%r(_-_2qIud~gk_HfvJQ1g;4_r1K-b6Q@=Ib8VzU)+{q)70mZD(ZhMGXb zh3?CDIrTALRJttCq)+pZ7mrFzy-XtC5c&DN@2SVyl$96OH$4n$&XXpIpy%N$6fa<5 z;>r7U+EinUGtzx2l+(cne;)dIcoRBapjVAos$3Ty>h;$x96&H6iM~GL@|VxB#zrK6UKqY6!q zDLFS_gSirn>nh)LRTl8~z)a}5Z&$`XRhuR~svhuto~@rNA^!sNc98r^;Z5fHg3)y$ zJI=8y_2SrfTn?VLvICgrcEiJocq_`$amm0$ZSb6`QrEmK2>xQ(QNN@-II zo69-Z9K2>0>{)xu-aLF1rVwe~a>(i1$dGM9ag@EFIhPfP%}xQRuJ|gkKrdb z?z8vyQR8Sfn!#-4r$tWEwX;lMo$h?AQw-wUQxF5Xm@;P4{)>?w8}&hfpF+7$IpFyT z@7kSpVf0f;)0v^xG~3)oqfE&K+m;hsw!vj7A=d!yQ9nP9>(3Annp5Cy5qx=SVbMraHZIo!JLztq^}%v;i5jlWq{ zn-_7^B+}#p1(=gCU2L^)AC0Nku2%rAiD4O>TGw;cmVYc8;&ba74)V1b&}AM6s$&8l zHKOpAAXwBjQ;V?Y-&f)h5){0Zf&S?~I4Uz^vrhYwoTGm4o1E10a#SyTxXr|q%4<|2 zCrp1*k|Do^&U&7{->s_=Hjg~?6?3lyN*GDCrnF$(b%KuBM;fX#A6PZWMr}`w*V}xW zHrw>`9>+Gy-2LU5%D(JRzQ5Y{^q6f8j*#~fIlPXSkoW)5)Y>iy-g4i>&&f(S@ZGLc zVp6_#uZY>#Hs$FLm(1dx77xw-@nG!Ctl6~>^au50PTZYl8E_M(9g_fWD~ZpIwG2%^ zbF!DBxwf}zLHZ_A6%}?hxP2TBXDjs;4@uwQ4&Lgbp(Ru9W$Rcr-OOQvw#K}h{0Lzr zDbL#l(t)0%!FOt7`ZkRm7&E3kz61Fymvg~^<{WaH?>yBttDycmlSB%+U2ngU149X6q2U3j9fUm zmA+Wz|L^r83i?}6GJPurOL(rT3n#CrUIf|u?l5k6E`0hso2W1qeREe>kCj5o^mii{ zhZ5^QlA7Zn0RtnbeTs0R5UQzD|vgqzG{{PG34i$Z2S6GKtXX3PgkxMECJt>q- z*Q)as+_H%DmVvyQ3k|R6%Lua2?l3O6W!1C*o9MqRx~)2sr>l%yrYY#DpkyXiomOy5 zH5VgZQI`lZXm?n_;mv8eOAGjP6`Lq86@7hI*gq{^8@V)6(BFlU8CrE(!hfo|i1Uh? zMv#Sfhw;FFR!zTV6J?;Hj{#M_+N$K`jn*Nss6O_!ts?!?&Q_aPXS2Qq!EVerg z0RIV}{>3ILMMaP33hTA%Oqu>=;g!!6r&XMW5TH{Ke`? z;`9w8mv|>VZzxgSZZjZyg$PHzZkZN?zsKddIs(+*S2p?DC6F4Nh|{UNZ--{(^@9 z&eZDE&o=#bk)OFrx%vyY3OO^YGe3Lx`$R5rZF2R)R$xTLdh&0%<(^T-2QiZPL{i6T zlSq_YVbPDvzZIuLVq9`XP(QBlR-7&gq~waceq7P5I6acIk}KN!aV59n^hugZu2|}G z?tGMQvEekAGo{QgC0fy!M{vu%qGT;2Vl|NO;g++Z%r7IdF_0hTmUEzFEhox1ke}q1 zbD_*HCt5McZ6YV%?#lDK+NU4abnBiONpb0w8U47HTldUK`bw{0^yAuY-LoLUlwQH> z$F<+O_lo3Z*_E3HaUHkrS-$^iZc#gzvPAOENS=a6E|Ss)PSj;2Psbw{L%9McA~u$P z%p(_1X;V$4Xe`goBbQ9MQcd*ESYC)nE}b&D_vWW-B$qp#O}SD-L=2LD#v}Kc(x#S3 z5hSn5BUebdQcLs>B(K9GS3+r1N7Mz92l2>NP_EPw5u5z^#BUewk zQcv{GMBbA}u9?!NfvC$w-k(PfLAlaEL~JVmmPhU@rA;G|qN#i&k6aIBcJJfd(2tjn z`zdXjh`LPW(|P2EDOZ|^h|T0b^T>@++B6d>n#q^&$W2nNG!wluldtBHo29gAA?h-_ z@3&6}42!$TLTKvC7 z9owyuS?`qj@AlgJ%$w%KkEZ+fUp_ehb|9r?H9yE`z4))1-2X-M)92VvyHAVO6^iyB za<8{U1{%IWlz#K2{L4rzTNfo$|MDOHAEWd?VYzqBNd7YRjWp$vH|t(X{{QXMPlMQ7 zhd7(^Y8KTSw2~Z$ve97F9~#kexVIWHUuvFwLO%I*c4M9Rrj!B^P>E>d;~yIFUusxC zAz994fh`pXz*Zy^t}$o0GWe^mKz zwf_f9TE+W+zZr1ZvHzaWf9~I^Ul@mXBu6Cm|IniU;PYRthh#svll3s_ziaXv`;Q8+ zkIRsi?-45w>=NI7Mer4*L52xfr@xH1vmy7g{Nw)NUmZ~@kD6F%q5I1ik1kQ6g5APmVYD+suA9jN=}`1?{fIa zqDVn^DRFeK8hea7dO*xgy{$~MX{od5QUVP_5v6^;BI_;b|4$?v`4pv*`_KNtj+*#{ zb=ox}JE{1KIN;@$m*Do#{_#K8{vWo^;&`{$g}484O8Q$q|G9sMQkAkmxa>bpN&l}F z{Rf}_DtoQ{CQ%S2arso8Ncwpt;3n9@IKh#-&*)TV=^iu93dY2=idL*afm_H zen2>V{O^pjQ9}`k%!L2W_zh|;5;2^FLPsLLCoQhuI;mho)qTQ(cFk`8W$bXjqHJ;X zpWW>58~0(Olr8Ag|1pOBedBI-+UFKeHU2x}A#A~Oi<~xlL zg92$ZOQ+!9!cm%P1_i2UmH|PVzkw^?X*?Me?nblp3jQq|rP*arV2WlL5nTBj`0zW; zEe3_F(Yap)|1z@pIK2VZy@F8{>E8a0zjgT2Acz3g*}#&Ebk%&Ee&cT){v-(A1M93{ z21U9&K2E>!w+??21ku1cJJ@8AuCtHRZ~U#pp9DcDu+9=DTBJ+w+mN*00q|B z!s?53O?;ew<8K}QBnZNRb=EMSB3(%zr{DNnhd&8|SYVw!?662Tz{lw~{?_4t4uXw8 zfZ$iKyG6R!eSYI_9scJa@N|L@0l^?kwEYG1xuMVMw_4N96+h6(+OomX(r%~Q6DCx| z1n@i~yVr$aLO>qcKQk`Y$d4E0PqB0Kk}cIBFmk+-$pW+MAJlYDG+8$tooj?wA0LGz zTp-E;fVuOZ-Rq}W#^~xG87#T~gk#dhI@k_;7Fb=gS95W86tW(|b99lCC3c_`qII!_ zf?TMrmMx!Jys#ZRuPi?vIlsUjWAip9CLDw|hwYIYR>H-LKJ4eCfuJEEQVi*Iv5B@1 zDN*k1*p_!j=WQGmrE6}M=&JXE8$w301^{<^!#vA_`s|mdI8BN9+JE0SbhAp>#aw=X(9nN{aS29Oy0BpaZouOZWT*nv40_^ES^EcttBE zJIzJb$u}p5HB@-)R1#;0Hw`u0fdP16kZ$C-v2>Pt?6TXPO%>3Yg%#QhDK-gtu{W5cup(pTe-25k=JHm!BoztAhYlHB~l7&MjhfV(igg{UobBoa@0WV zwa8J0?QRtt{`bgV)~B?*7R(vq0GpS}?(F;Hya>zw<3V2j+#n9VkAzI}(;DyA>aFui zjZ)@dxP`{3Ja}9kx^-CDi`y_j&S5G`arv^D+t>oz{>i(CB?P6Da-}H%H8CnX&>}0_ zpt|Hbj(2ODaf@(o1T|Ad7h{Jj=_zfOdfUmpV-EIym}jLE-BXjQeDew7#QW+ptxN!6 z;~)WmaA^0#0~yyseMGP*ef!z8A@);Tc&C%QjxXspj@3>VdwAD@df;#`1`&L?0X|(d z9Fc)q2B^Z1h7u~XbEGfMCLHhf8d|i=oPN$qhN7}=5tfklIf0B9^D_~*r7Ol97b2bq zoggm;(EK@3*obUC4!4IG8hC_o}13(j_ zyvh!gmE%=jW`^5`$Mtg&9Sd%-rx$y9_xWDS-wr$~0xv?m(C&FE7rVpE)?-I!lP&0m z(X4j$jrMu`-2To4A*Ur6ze9~7vbYmslvz~!BhN@JXMA7K02(v4phZ}rWLlLq88ZEW zE{AGJVcPOC4{GhOcB^wU>t=+w$^j3;G!$|#hz<BWjDt^bSrEnkDJg-H;7=DuA^oHQKk;>ja;RWixYWn7@Aaf9Q52Dgk(?htH)vk>9mJhpZi zo|oq*4!2pqW99h0#VqVZ-g*0Rfk~-$6@vj1^P`Hcn|xU;#SuVmZ4e@@VMzUp%La{-9N< z?rr2DYp^8UROhLxg_4rV6Urup|IDlNik%&FIa4B_xyIMy6enl0?ItB#bNPCM9=@&( z(1Nq?bKH1)#x`?VVi_iXYoTp_O&ie^k+FWzQWFGP5q1-SrPXIs6HaCOKjWsCt7}J2 z1GXNc^G02O8QwY{VkFB6>&MmE1-F?l7A4D=r2V}VdLNkNW~DxR2}|NXk_igB-@fcT z<&|{jEG%H6cS4CLi6`)6xtz||RoJy#jo$Zl2zJ@gG=^Kn z5qC~u3NG`4sbX0w+ov5Cc^20nQ|NxZ-oCgn)8~7r-C7=NMdorqI6m6~gGK1tRIV;E zGq3r-9K6y4XGhU?o%zZjGP@Xa3S0M1K7Gvl#ppYe!?;Q;8WMT4V%}_Z4Q&#_=c^KK zQco${?eZu)!u+N9j(Tx!;;q1w&pX{GUA706>gUv_O^DN(Q;^1g+U;*V)?ga5m%7+hMlN``x4YF%qs(3mkwELd14iZOzz4 zJ=a2}2bwRX(Za3q?7XAFB;L&JuvvDSUo4$aVx1;b=H+~N%>_`|wWd;%kzewha#r|zqC@t|?mCCw4e0Wz;WP z{gN*H4-WRIE62j!hqFUYmNL$8eKR>eUJ;A~3#PX@G0XyVX+#E zp_-|VZEyGDu*P*Z$2--wPivYiW!BXmHC_!Cj_A571A_v1ZT<)i9MNoQVwQ_{;FAHFwgtTp|20q+$t!e!Fd9+^xna27GDt5{#_F%-lRH@TvY={l> z8Pe*4(@{9ce)0kB2KNSvMaN^%zP$RdE3s2~JLb_P3wmT~koElR;p@2Cp2J6CvDODI z!BeUs+lxs?Cm!1k87F6fLd`1bC3!Q+wKAr4KcMr~_*aynMu}ZzXdehX!sO_-G!rXz z^c>Xi{0P2eKvwv?;7wbKxNYSL+$1(JW$7_i1UdSb zrFsQ5;N>5|W&GC1`lul4qa*60EV!R!q0{jwYNL;n-*@EZhYa@=@UFzM7MybPkeRze zhc9HZ>7{;k^V5RCmAzfti3pNYbtT#Ey(A686GBm^1=G0}_cXmh*Lz)fxKUMYv13cf z>#9=)V2W)1I6E98^n&Rk++I^A8eJ!uPHrzNWqxLGcE0YA?$5saOg3?WrnkrFj9``M z$GN@b?MMPm9N~C!jMYD7YA<(xo-iqGi|i?gnRDFp>95zNd>0^06%>qvP7mVM%0hL{ZSC!4hEGMa zw3tr7gp3gjsSGsN*-|jvFUr05e4IwQFwyVfx81GeJs&h}c|SXKh6cI_;^c6d)2r*` z)#2K6GAqUcspC~+=kh>aGhH@)P%+pm3EG{Pm**thqG~&YWXOuc$>z$lg;GDI!=q#r6&dSM>bznx>?Hln;Zh?1Wrhp?^#w7X{?`HLQ0V2f zRi3bM_tIta^Fu%JSdM}dPPAJ0H?b-sZUHPqNw~5zru@+v`YF3R=F-2WW;Rpb(-@P715! zxEwx`s^5A5-ESl2)jV|2%DsU`k>9)l;7VZUfd9#HizR%#5jW4RewxgP&sSY*^5;nm zwAW@XKGbDpOu6Ht$~MDd`!1Z)@Rb9GU0Hai`UoAt^#gO8n^%|rNWFCh?%FZKZwrr> zbgrxDp5a84s;5@bFFR_<0Moaj6Bl`*zcylZ=+-SMt$pF1m3Ym!St9jW-kG@Hq zigc9z;_!+(`$kt|anph2;j4LfG+zOy$-DjV$V$K|a_71;uzPZ8)McDryI>P)v^_#} zbkYq2c$V{k)pV0SJh#qg;1qiro1H~gx=_0wi|Y!+Z}p~z^v-WfWzFP`R>kmT&&>Am zFFUR`oQKYLP+|Mt3G2H!OiVoIC%$7O#{X-%*CYAMRWEkN$Nq9`PaowY` zu=p1NzA@igd?*7s#Lw()U~>vs^jd0{c4ULi&ZSY$sV8=PIaGs6w+?!r@7knah&NTp zWCx4QOP2-XZhs^^Cs@0q5jfQHTu8^Uru`t}vTTy*Y+3Auuqwg+4Bc*fhQ1Kb*5qjF zhzA)-Re5qmOVXh$6*G@vZobG#3!|$r@a)TeN9(X4LS9F||NKFLa zXJyS7IW!Cu4NOP=C^X_vl^YcBT0C(3z;Y>ZGw#EU4<5*-N1nBI+F#2oP2+pEu zzV?y>_qoqLJ{SFk63glnIACL^O*7*oxPT>VQn_|>POr!MmK>v&(2k}-abe!DpLbi% z2P_ApeaUx)YWiG_#m^fAe>mgRWF&?@+D5aHm)c|PaOnlegk-+D_zhmbu8R<@da{WF zt4I3v_%b(^i7I47TC$*@ud6MZd<5Zdpllc=SyO6&4ooL3pxdoGf#5say`{98<}E>S z&iCO-K*nw#uNZDO(L(kYOm2yxtmm}4FC-vN@RcqrTFN=|Q;u-x(7Ek6^A5~Ryv(P# zAiG|RsEG9&Mpoif*9jmMf|Jd0IhXD^Z)*=ZoT#zKnyi(`uJ`(U4}z}T?FdLY-t9wD zSMHcC;cKR_a|zUdOVLq61qp`;HczqDHZ`q_)ioj9E^qywJs68ENQp_Ao@v_gwq~aY z-I&ArT6I3f+C|Lms+B%vn(Dkv&cRPcIjq*Tq}S!lZ1|x!2)k6kW00s7XdY(O)2t1M z)@{{@9y}bFI~?G!X!D;8h8#NfXEqnB&*f~ZBRRuNJ7;0pcOa>t6k(e71Se7ajrR2% zbjA2sj{hj*FsWcX@)sGVbvYt0C&r%f#l!IX}Si{mH$1$pf))PNCEJvlQs# zhFp!Ks&h!?Ri}XKrBK)fJNQ}NiK~5;W~m*$L= z^&#B@rkI?zcu-$&`)N+6O$EIkj3|g&pHZLs6?+-6;ACcH*>i zDU&KFpUQr*&XE@szR=vOMWd;@(By^|jAEPFd1M~Ffy5txX`wUBbuvxS5abNBr~8zX z3M;bzsSF$p_sQbd?Z44zP*ZcvwQWt?FHwG-I()*L&#K1*-9Ltx4?}j}NELe4=pmdz zS%6`LGKt0%9hO_iNjFGjpq*OnJb zd$LRjfks)EIpmkVKvXs!$P7*#A`{az>^-h?U}&sK6>a?`#P6PG1k=55MKyX(WwkT( zAO&AqF(!Ptz3>oXHt&zh?h1rRmmO&=W<4}sM8&G;#d3RidTO0>vw^if|KWLD&eao$ zsE*D`E%ciif<^pH*$WG%D;6qQf*YQ;8=sx@8o|{&BYX|VKEPtQtnLA2K`BJ+*)szfoq@h$R4MlM3v?ns9I}Fwd>4^iSF-CB&66!d&+6eqL4~2G}AKq=YXeB{o-Hl z9?|bVd%HI|>vc=4Zj4rzxEp%59stP;?m0_`o1|>MY&Ptz{VrHnFgGrxV4#x3<`P{> z^Ce=9saD5D7y+4%@6^NieS5orJF~p4vAH9aEZ9J9=D%By3R?G2f4(3_Zo0qL++O|T zD169DU{QJ7b09l8B)Pq(I%q6y-}-x5nCf6Ma56Ec9loiE2r%mPoN z$rIF;-ZSLVY;ouW3@_alpy;4o)m-aiQ91 zcdAT+|dF z_1Heu-0#k>Sbo+km3{g~4W%(h-lz`2d9yX}UX09_x3rzOmgx-oP@{8xtr8vq2F}E! zE{Y+ZX#53C<9kNK)IfsnuZ=}7T`Ii0pOe+$$**rK?`2=cm1lNFeJDNH^Y=*-Xke|o zK!U*R^R^v(mKSEeqhDFtPl3VsM5f5>`8swHaz{!K&@donyK5eZz~28#cA2e1muAFW ziZaySz$=48IyZpsHe%sm4ZJAfU;Fwfk5DC?s>m)l*N?`p%cs~&G2e-K4-YnrQf?~OBS-CErGuKI zt^LG6$cJ3e>x@T7$Kk1zJB$^un&#Nmt0f|i(>!Fou5+zk_+uQu5NL}dX!@dFDgu9Q zxlEDCFUus{KQWISjVhf`*V^>@*eexq9zF#y4;&@zZcUUq>F_6F<=EbCr+S>`!M zlpQ9QNj|%q>gXJA|8^SoT*WY$&rGAd?|?U1`E;nW31GPLJVIR8l%XR5X3_TO05m|- zDALyK;4;hp{>AfAmmx8+=4ztU>u7om!PHNBd8m|?3n6R2vIX!}n>Ts;Yfu06RiP~M z=duMXDO2t3rY}MbILU3N)UOL<(+yzs<0-BMCGTg z+`h_`(Cr<;SoA#SyME54HKBmH4Ps1tbuYv-)X1Q4pj~!m?qb1R1GdD2%)uelR#CZ!DpspB*L0D%!G}eC z3R%cW$^r$NvfhIhr;7BP**r}GnkTu*yc@Qa9xRO>)*YRc&}8&%m@~P^!f!bVODxRM zbT=Sgw8Y#O6JKa?QQswMZ+{sAo3DYd2U4W?$q{Ca-q)OBFpFvxZ!*aOz|9%EmckoA z2=5Qf;^i$zS9Yzn{C<%~s)5?0-(r7=Z7SeMol@lckjT~Yx-)5C9T+5roqqJ#F->R_ zIMj8(-P08ak`6Xa+u$5>8_hs(EaFP%i_F?ZM^wutD(R*mbYc?zSRK@5HaLS*3&avX zBJ_ZAIIOsrZzx*`d!S1%R<7JaOa4P1nnUI#w>mqx*&HAeMUB}#lrK$od|1NKwn-3> zUYm-LZ-tKn9In`#${0|UaxD9mwng9UZbwcFoIrxgsh9UNRp?d}=_8;aGngJBFWgT} zau6)1`ec+O=li_w>~ZR?f}HHg(|ZxewV2qXRJt}R#Z1-^F2-0QwQ zl%s;FYKs||V7_R+w+Blg%<y zKAl6RK4&nvSk|l40LAuS?_g#P(JFuLtiWLqem|#z(A2z+I$1uf_3Dt;f}$M!7Numz zY3U>J=<+AD=;d?a5j$Xstw~Um6 zSUPqCSeHSeqHy5l<>~9oXh9bg+XaV|A<+1z1_7;maqU@i;)tgg?Sazt) z;IYW%I(OgFSY$Axi#&YwkbQacy4#K@IcO14>|X`8-c-;x7&c;(=?fLU*cX;ot{Wk% zWD>hdp?YUyo+uzCyA~)@DEi!t_6U9+*yUV%pf?{x zVLvTtk4d_XVKk?b>%?{(j?W%;cLH7~EX3 z)O~jK=>2*N6hm9q&Q2>TPOSd*5E!fxEF-;EEEnV3P@WUkc(`HAaj@lExa`}$d8AR7 zJXyh?6&`vah`lIny_oR-aM9e4|5A2`n$yr%W~OP+Cqq8WcNj_`Jli$MXLO>n z_3HlWj{IW#8FKS%TJdn_?9KvbG+AVe-$!$$*Fh~mqSh3Tgd0O-%3-lykDu%JHJ8L6 z*(vn(c8?GWZrQphF2bwC9r?>ZCx(y?gVH39#U`4hDGF0GN3$0rpTP)n2Eo|P;4{a> zAB#<}?Hxq+qLS2K9GP)FLF%nxik3g__p=2^FXf69JULjLB3TtFde#rP4RTS$tSJW@ zmzyJ2@#rIpg5rpcGotrr3`$L`1L{%^^p3RY@cn%&VO7l=VxpO-J9}@iiF%P+!KR0s z%L{rjTRR4)^Ss5Vf+mzt%IRjTi&qL{R5I4x6+gDlb+B_fW!ls=e);n7wt}a%^({kQ zhC5BzU9$a!-RPIs+478KZe%z;b0l<>HmhQZ){*lyc>a7$^3ob?pl@?bnec0Az#hgN za=tNR2x#~JXg6@|XCFTDNOK0qc==gS4@m{QYE5K@Zde-!m6gPT58%Zz^%t@s4GXIH zi`{k^SzrKR1{&gwch91v$A&!Im0i7PUu_3i*8$sbOY5<0n!% zM>7zS_82AH_VNbDa2tFtd=wlcJe*)G`-#~Dt+JC5*eZDQ=K1SHNj_%7jI3nI@x4TF z02*oAyT82ATXOO-g9*u8%B;(qAF}Mxs&cW0fg>}M^HlIPFNGLo2_jU8^O@~f=pA7; zrB%=wBrrfRB>$ihB@~>WJv4D(m!RR|(`^B{i>xgt*a&H&4wM&;+iNm}EzD0WC$R-~ zD3`RZC56&DPjPtvL(QGt%V#M7CdktL7aPKDui0$td)u6W?d6!cfuykS%R=s>o(CS% z2-hL2AP-kkz$6O31Op&+51ZW^A};E&3#Z)b+3A_K^Q&1HXM>| zI2h`;GaYg(Hheq8{P-I7qH28u2M!7f#>%fmyUTu!D;R%Jp5RmymhoXH!d!R7(xP0*Vd z_Fw0<54IoZGM9bNq4I*q-9C7{)SkNk5aY2eCaq3E!`bQs4wl<%bhu9_nL7@c%aZrq z5_vJc*Vp&rcjd^aEBk#%mQqR=uiWcf6FgchwdDY5Gkkzg%c4*FcOBuPWPa~$pB5Yp z?mWzVLCc}0ZO2&UwBK{coNyz%+&G2jlg_Yvby`Aa%Td2>zRaWA=QLxI2X~eB-OWQz z#IPx;(B= z`oq}dSd9PMel%RQe$ZtYe2_}Z`CxQT1;H^*PPnyX$~$&Psmm4n_Z7Qkx#RNki&$^T zb&E#immhwaCsRDVh_~V|<2fIl(t7!ir*YROr~0!epMLh)drIH3RypdjscqR+S*rRh zZ~Bho+)StXA+?#S)Ml=J^MLsL?GNqd%KT20 z-=LvQFJDYEORXijnz8@pzT#qIO?r{XZ{GKUjF0m4ylbm}Hk!<@7aPn^q)c0vqtPXG zg6D5Ig;^Q~vYtXLg}QHEq^E(>E9Vz`F->2O=-IF7qn9q{{a%ewcx3vzeN7Al(aK%Ilsr_iao8_1L%&ra>y=1fnMe*L!S(sGD% z{J%$!xEqJIR8Jp0%3FK%sJXqrppVk-iLGJz?k&b(zmDf@G3iz6 z7brzrK0JPe;PJNX@zJB)2y9%)^c}U8*1o+?L(A8`qejOe51lPnsEoi}TlCd@$j_p! z{qp4OPmOOHWnt?)9(7zm$)ofBY;hf}=09WZ&`%G!&Ev&x-CdW<&q_UdBwM!ZpKQ5B zVyWLRUis>W)WBBD4Ec6kYG3ibZRZ;+y$$%yFy_Ij3nqni>(1LWg>PNnt=@0cVz&2X z-CGApb&$<^z_9L}r!k4Krb9K3asS;h7pLtn;!4x@SD$~}yGI{)X^RTAzxK36Mt+~vj z7>ldteRW{XQT00BSSf>=#s5$92VU^?PLUJ?Za$44QpQkj)Xr6n0)ANC; zH@I|Ur(tmYZl^quUA^kOt@C?04tF-5YRzv=iV+<%^t3B6gG`UBlxfPZ>KGzd=@l}m zCvx1m%|iiJPFOlK>xrf%>UW*)Z0nx3)))Wbi&!HVmRBVF=HC}_%X>M0pQa%`O-;0v zH?+0}Q~K|dlqcuCInO6!w7kyg`0{I>(mN1hsafs+u--}YL;HX){CdKi%jD_TtKPB- zlqQ$Y9k{a?La|8TXF^kFd@e7meA927)!wK)vi-xhqj^R1wryl%n~T04(VI!rmT0x= z?R=14j8mSoJB;N~egRRA!+7z3Se%pT`gW4z#>j{}RV~jPy&P*a>BR;vb%Lk2SEhiB zwT|>6_;^yb9LBSEom8N&g!{cY^JWsiI{Fv?_b=VRuNoa_F{@lJQ=sZ{JJnPA-8@TI zszDwt3X>1Kfml0QOS@X>2>c29u=PNen^|n&18pH5$y(z7iK}}rM|!OHUlv#C;p6qh zcm5TZosVSY+JDdu#3NZv{QtPPT6}nt>fq@OPCw9qrN)~&AJjHaPnh#rq$E-qzI>WH zmLfl-_aLU%FO6eGp?yJT~fePv2wvDg_2l;W{>6v=Zfa;>j*c$}siiQz zfARmTbJh7v>U8gQrdRhb+WAX7t9|Qx0d5ta1W@pa(vW`5;I^F{5JyXfC z;)hwRkzXfJjTGHT;_1t;n<~FGXGsmfqgX(7-^A>t^iXYY6#e$M zzg>N8@A|JBOVd5r9nbUo9;a*bGEUlQoa?3B5Nw`l> zXiM>{gZCavYOTM^@8(GFZ{1gGkH)p)iCkv)`H07{{U5K}e$H6l#!ZWZ^;K5>)~(f9 zs!S`a{HHUWBr^Xu%?%L&Vbvm2270OVgW~vEMCnQTHV0_1`D2OAyzoX~ zmOnPaa`CafJv=vd>^_B0tvv=+ECZg_DJw25t+8FEIVX2Nx=CO)<8Z$i~ye?;{-S|NY zrKOPhROeUIo?_?aVp9Kg%YNmrsb}IesF)|qAWeQ5$*Did7vs9~?)3j<@7?$ct9-uSk*dy;IDpH!C0c5UkxmE^W3lk?eMJOIgJT_nq$ zPG&bdJsDZ5B0-P@K>!4STBGuki6HS4Ql$5Am*)&uY>|&HKRJ219_0_?5c9RNTL*h- z6L+YWo2?ATpi@4#iXT6Jg1t^5{t(O;OK;SZ)3M}uJ<#L)V!8k~snnXSTBF*o(Uf=( zUcl*4yUlv5>bCY;m?*`8y0sQAH{k|Rx9zr@)q2CNR^+^hX0`3Ql@^!x2CxNo>#cfw zkLCc6f{A)qZ8fN1qgHJfotq_&v%+p`uhOd4n-zK_>B@PQYV}ra4`gyrqWZAgYPTAV zdaY6~tm<<3!JDnIeaiWxGB9P@GJ|WiZ?>B<%F7fmf5j zA(6)$h`?_be%f?da&K8M%@e|j$;L~0r)J!(wc1UZHV`XMdA&_U&~~f!wx07wytx{NCRO^+t+iKQnC94Y9GU#gx$??_OqeHw82!QhgyG7hia{+o9=_v8PXDdddWlww>=J;noq7KCfFZBT5OEp2E*dXE9!2w zW%^5Pj6GtO+to&cAEIM7bCSFU9*NSiva`jkn@IWhLsG!!(&1<3y7Tgx{piUZ)H{S@rQIO} zE6q;bT{pRmp#5KLa({i{qRvwC)S^aT4cV>%BYs=Is32vyOvl2xmSCT2Q(cOVR~NU@okpyqCB1`rXNi5TZ2WR#ZbS=?!bP zFw4JyeFHzeJhIl(XcQG`y@y0G2&o27veYDagITcn8!ycJ51dj)9LTq6!nK-PXG7I} zaCZ+i4&MhPx3T)qztgMT3zy->FopOG$ZYt7&;ZJiAL2zyOKZ~ z+IewJOsqs3NQV{!UT-`DeDg)3=jqm)WXz8qNqVc1Ve^DHv9PI;sQwWx-gxlXPpPr` zvDQ!^tcLy|9Qn7TE;O4^s%O&={=7FEE#U;6rF~>B2#NEqoL}LTkX#zkzdvY^z&Mwd zD)BTgVbsk*D-E|KX{RaPCS7tDTIc-~+>+yW;p=u$!u^9;)asR1twkIO#KGboDNQMH zZ=;rKo3zy0tD2Tt?e^wc?#*<%U`;DA3~r4WDk*AiBVl~coZ1WJz8!fYub$gKYI12T zQgiDTkz<@Fnv^P18A#J4IU5Hn(9#<;fDI}^14tijDp;-ZM-3ma(Lxo%*YZbh1;*(%egVkCCX8$ICZ?#~=+k>uMC*_(yft1^B@TYu-iLVM% zW1X9!PyXKI?}Tc+$$G5FTLf zuP!Sw7tQYV->}oV(hYtQMp9ZnBgou?}HHu zrIY*|evu*UwP_Q|4;iyYI%X{~Z5&8BnmN~ncw1|yjE5_rHJ^o6>(ur(G8vX<9`@qI z5M;DlZ|?2sW^cUkK1q4aRg@d&KK9 zs_Q{Zt!db=vB6iiH|Xjzy_?PW+1wYY6IQp|TVGB<Byf zcsI;a$Fx=JP_#z$p_xRF3(&Kw^~{uX?K9KD3Ix(e+sU$Swd}5_?A_i5lVFh)l7GOi zFQUXx&(-9zKNTb&>S9Id$#R?|tqsOk&Y?IdbaI4o_BJQQ->vMqjW&Ei9>!s}*=knW z4G0p>#TGpZZrEb$Exc}v&jQ-G`!-)Zbu-6VA#%GMjTAQM z?iL7X%XxQorS8v(n~#&15FifUyDH+C)0s|2Pl+A?Skw!5Z?B?z(Wtt$TD#qjdeLsT z+=}T%yV|ILmHeP*BdP2%gC7!W66_IMA%sEprF12b4B54@> z4Tq!EMjKMr%zDA&(;JL@k4^CEw;6-kJa_WM`b{!b14w_dl>SC&U29DjqMytVxbWs zTPF-0s~c5Pk80poQAeWYGP|OA1&pm(u?)r794Vwzlr>f*=Y9sXZh-VjYLJ8Vzlt$lYnW4#@3JG$t0dOzOaWTNba zJx*hq?6Ghk;G(s9r2I@QDtet-NHAr_7E(cSbW&Lo`e`+1AqLV6d#a@bE+z*~!UVAl zIR$JcVff)PWi!a`zcLam{7gVdgPQpQ%5NSF363?jXE?wrLpeg5C7>gmw)t^!eCT|B zaPiLh{PgIQpZxXeKl$$^sdm@b-;21X9;@TiBgZ*7KRw+)i^m6?Pp1o8%Z1uh zQ6EmVPO2(95m)OKyVk!iCvFQ}f~SGwK(Ss2wHkxUW0Clq1@*n`0K>Je?nbC`oSIv2 zHRAYJNWbO_36*NyiR?Sv(q7b(HaFH+gKkyz&{WIR9g>180PVKj_FgkK%LEc*=2kj2 zDloX8PZKeztid6;&Dv&z1Go)qaNt_!&vz>w_xaPH*UP!YiBP9P`xnRIn)9IF|3pX! zqsGk$eL5t#^+*z*=YL?%0M6o#{q3Jt-J0NhFsN9Dkz@Uxh+h=5aWzz8VcOpLYi7x+ zRZ`R9ilQ~UsJbCA+^r-^CsA6%0tjr6vkQdz+VgBL1qG?8r;}d9#4t!}M{!Hj#xK7* zrrL0;EJ2&3e&M;^&~^<5C@Dq8%h4jhT{08*2$3la>{Q)5c0BM9lq5P>0=OPuZDth0 z9s;iv9m8SaJU$xTkYe1m`@6y6_XS`1{4htx@OkHVCwScR43{^0lvU}Ayql*!NGS)A!5S z)x%($gPF}n-cwJ#i{ghkM~_6Lobq|Q;CKtC)^0Z{mA&TI3E^%9j9i@0^Y1_2z)j>K74MVj&T_qY1XX<_NrfR zV3Xn$Wf`-1=hOP~Mt2!!fZ<9hnU*T-GT06dIzRrX`t#$Dk{YvC{qaYFh|}n#biO@| zav-4g#eDh@&@&U737oYymkZ%fV6BTOX%G%ve@ekbIPWnhS0TOWz}Rb?D^d{B89%8# zYbep+^K_Afplf1`lJ8`9WS6qU8&*_$u%4jq*qbc9(RM~5rEG+YDe>uHs)S}xD06o0 z?7zEydwzL*{r!(Wp1?Op!J znfEmFIOWCe;4UbEm4EONvg!X0#=~weEIkfr*x&yvoQeEl?`FAJ(0&#SyZd|pdDXi3 z=9|mY+EqK&R4Sg4j$^bcL|QWJQ4GkH70&9vLyWcDH~tfexWf>+PKt3t3#UX@Q{1Un%9!SxO@ATpT0d-Gt9K-J3Y}w_)_*u%UxZjw zt?J}Yuk_AYh?PFpIoWG^av0 zOV;>fhZq-v#0_b`s!AGGl)0h3@?=~+CqVAaN3oouGp;BL5 zO@&*1QN7IzvmJNy;#bSb`PHt9?YddDSSezjcXMw%M!6Gja<_!{1Nh`drBtj}`c{2u z`Ev8cHCivMQF~$eV;yx^cr!*pUjAk{oIqxCAhDuRI(b@m9}up|-U^vwR4673i&NSX zM}GK`fL2s9Wb}%*r2DZqfB#&;x88inE!p1>=LoVIZd&)ba;HWVd9I|oeTy-V)r(>G zErRsH)k{^wey{?Gi6f5gAfh=L!TywXEK z05}+$FDD!>Tm|7r+;>*`<5`hEgJs=VU{zcYfASEPC03UxKTBCPlGK$0-Vzi9?4tUT zrFR)De1twhZi>)EJ)gy+o|ki<={&!|f()? zE0%M)AL#8*IYJf&HW+1|sObX3Bnur0 zR|X&*Czz=VnAWrLbnw0lCsgHhDo>XalIU0rPJskNG3^f12!unSZxhBRX+g z%~s`~`~M&D?-f!f;I8jtIph5^zQsSAy8e_l1_wdvaqij=K23(HUe0q4kTYUNGQ*rC zhdH0e($3z=<&r08@OsMS;7PG?2BYc3$G3lr8t$YrJl?S*$(S)mze}_&mS`8$4>^fp zuH@YKL>Ulq0+uVhh12h&K);{ou+8W@q#7hQ2qaU@&<}$gM;ugwpl|uZV6nyiyI%?}3Q}ySY8+%t9M01b!VtdT6ibL79XkDsql;3T1_pHj zgVSh*YK&=g=|3OV;sNJ6qW*f^Fb(~i<7?-BI(@G@Mg<-MFENfKqMZ^-h5bHycp!Mh zns23=FUvXst>mJvTp{$b$rSZI8i6%Lt|(N~kNWqSeh`(2&6ZU{H%M=ARfdR4WV>P{ zj24+J3lS`q(xZQ$v3QN*ib=!@md5^gfIL5a+{KIUuiu`Zb%mU3&zc!fAMDH3zp(c7h+(6+UW1?>PuNEhGsXzJwzU&F^rU%d4R&Y}l>q ztAoqqi|g*~bjn)C3p&O1b-n%JP?EeLRo$)6u}pH=d(gX(^iCZ}9#MdvR2H3j7}qq^xc zJLNKz0D-?f3(mj>aS+w^A4#b*IcrzfzmM0y_q`!+x1$*DqDbPirw%&*En4TINF1{6MuXZFtU|Kk?^!^sS+>=Fdzy?QWcWvA>c$%s^7-X45bX zXnQZ3wpPq}yicnLC)F>jU~FVnxcH@F4P)P%NVasH$!ks<7RE9L6%&);2^ z;4^-TYx8*)qImFVK6_qN>Yprt{#ArYzN@;49q3o&==CgdnIhYxp-3j2c-i zsNS5`<@ko!Cbg)i+@A5Cq+vO@JUTqSzM`MJL$Q!MA!1xkmm$NuQ-=$y6s>*2NRg>_ zJ7ggma;%RGwh(l1!vlU0JbApwPbXI2L4LV+k>F-ID&~-SK3oBWGeDA<^Ta~3jN&B9 zwponQX`-_^E9E8zkJH64Gwxr{y@w#AL5ST32f6h3XR`n3O*3fdkXjIy`B^RZwKnKnzFKZNC8t(y5{J3| zFm(dtqyq!MwA`EA%=ycs{ln8El1N7%yr<9!?`eLR963>;c$|sc@m$t#?p#`T7PXnP ze~-P#{X4%~YgQ`%D$&AZY(KA7&ab}1A3iJ1PH)NJO9RQfoNOf*CB3nyiw9Zqi!vEG zd70M2CLPjqvpWc0*egX8*&U%Cm|17vIhDm{O_#J*t@@zpZ=+reg86*8I$OCQteq%U zAPfi?d12L=fJ&y6g|`B$@jj3u2gigs=dRsXYK-z=;8hak)n$V}5^qj;V=SvBX7sJN z`*Qpxl;@fFigKdhzPuQXFeYm8i48-qRnehy@kLtB?N4~+Y_@R3url&&L{uyW%u(ia z*@*3O)}##c6Ee;-t;r_Q73%v}#VEQmCo5*phQEpmVqmQajE`wv!y-^Lg|UR{xzx@N zc|%=OWWxiEHRLK1_c53r0?FTvL<^!#PYk*umhfK0LfJypyZ&W(O_B{Y^~lM*W%jm1 zW>O1D<=PKt_rc^*Dx&RyH=*q&RwTnZ^rbTxqImeF$U5*~713w5ydeQZ#HP>@M^x-3 zYZH^@a+f~xY(~<)X2>helGkQ~m`sV}<*vw6=#Orlym7-74MBBa&P|9cK=gwAw3F!) zj)Hkrg0Df8^kb589CO&lgD0DXDFD4_Bsp@iPa{Y62h7yG=-ho#bl~bst1rh6z4rQe zc?P|xwm^&Re=i4TRTp?>Yko1mmHII@@uEePQ|`_Ki-Y?Au{0~E>9C%XP`-Q*0yEt zPtXcSt*|V6BXN7$+9&=(Hb5Ll?9y7@{dq~s@7%w|l?nl-_BR7aewU~k=v~SvrDa2@ z`FG(jT6=ssC{;7J`T4JiV1JjR@&DBG%{tPRtc=+5&3%^3ea0&o z+8;vYi23con+I5xp?0z~C)hZH^~*Uq;WX)8m4Z~uU0u9AKKt(c;`)l8tKYBQ9iJR> zxxeJ4X2B_q^-|;rIOepfo8!`l$CnzmEH5A`7gN1agkM=|Q-eLPuF97V9c0&g?9IHH zKkspXJFgxU9QjbyRuq(%x&4!qSXZdT={|~ z;`QVF|#^(ckve}%LM#Jl(JSF{{b1%U)cHoH%lWltV(A*E^C0DfMm>T3X~G8wf= zkEelP0A?g6xamlpdW*-erqlPaIq)BJdn=neRAn;S^JmMO#JEs4g7aVA3*d02 z-Qhz(6~{4f2yvSjGk%n!CE~tLqM(?1*}fVkU?QN6UG!Q#N`ch{SC!4~5Xzy94e1U; zE}hYkF3z1X>60*q4m=XSrgyQn)%jn75@0)e2>cK1Lq=kllp5}O!y$bRktKYH1 z@YwJk4c9U74wd>?!nJym;}+=%klWhjIaO@jh#~j&O?CHptJ(9740<~DmKTTwA;+bPHBE? z@2l3X1W6npR8DVYT&#doW#;aG$;Y6H~Pnuf>b+uh}Bzbv$t`>W}m}HCSEKGti_7!er}OvW{d8vJ)Gg=7-2V|Cu~ojmHV@~rKdg7U(CZT&pJ;U;^MvFj89M{H&H?dSW!`pyXoxL1Z<{XPgg z5ikAB$!aO1y0(X)wW#{_)Zsmn4_Pr5d@g8%$3<2M-3zA_HS{{*MYN_3YaWdFm^0rp zXCo3b*G@(A1guI6HB2}eos6)oFxj)E zc;rv)>HL4Ya;5ueH+E3F%S5i-g=s(LisHZIMZu12NH@#LaOB6f4Uw61>TmY8q2%iI z+lB(Pegt1aCgbW$_bomj8ttUR<-BRs%?r_Z5?7Y8#7ica{QTznP^dK zF%uBa@JSF*OwCD4A`Hi(y-Q-JVm;Uvk=0vR7HB1mioHpz6?syR3ZijY>nU&9A++|j z?XVewpbV!1I_BF}NR1KI$>}ejVx+i#6A4KX4NFpSESE7Lf61Tje{)2w9HhZP#xDUm z4OUl84F1L8>*t3))#d;4a?#g6pxdfTFkdNMck>Y_5wf3j5TK3b@R8YZ)>YT`o9l0| zVk3P$3oX30u_C2CH}nT1U$qvXek_$oyS@4_~P+cvtevUUBanoOA z)5)p7nZ4F_pTFeemgxi&fjHoAM7#-$QRZ4_Xf~$GmXy;z5L#h!`$Rep0s^N8IQah z>Wnj8E+7lrtAi!o>^66$czF?LXv#p9Q-8CCTV>i>FWf3XX2{i@4lyZ-5lo@4kES){ z6s4~oA7I7$gP8rJMQW-Pz!hCGKC}8uHaTfS+Io7@urj(8x!-=GZfSrj&~vh1kKM$X=SUZXXkNA8lpLnQz(FA7h|hZvZmjHo#K~m)4?d0LJJYHqab@ zX45*`NY_(3gLnqXLx!Wz3zdlgM`6>nNhp5VJ@%{PIG^F@RJ2!p6*@$2=~+?kN$@rA zJl_ak&hF;kkT)QITqvV|)`_j{NKq>B&2su9Rp{GdzJ%9r3C_O?N1;RU28K@+4Fk?0 z3;zr*^AGUZyQf)S?srVn2fBJv@A^*x{Tn=B3aC;)UBGU< zlrzOi`n{jdsZuhi^|tesie~+9ckqCRi{jV0oB}gkeZ9f>?*9k8H02m97rTs7a{6!0 zRgq0XjBqFss&)Kn!jb^gD-t#Z&Z@B8q3_KH_q%)tD1pc8>3li1YcFSE`EEMBBPo?} z!4u;Fi^zhZu6j8AFd0p~Vbljiz-9+j?R&54ea1Z1)UyIoaxjXQ4?-#`kQ$0_NekKz z`98*1zrn+mG0lk|qMB%ZwN+ieQ`c|#j)gk+Sn6ntDncEC=!PY8wRj{(T8Oo|Iih9z z4-lpTD^B!uqC?%}c6Lnm5V^tV?ChvExt+gp4SJP7xOi7o0WCN|0CvcUgr7tVok>W- zbAePp0wBR5c6Q3SW4;n)0(}G%j#n~|8i_)G%Uw#s=9aIH$WM-{0z7r+b*3_nEyOzI!{2b=O<>21&h&AlY zaH(aAvkL@EcXYIL$HYB%5b)d?(mM{U?r>yvheN36R48>v#Y%T1a=N2Jt2+`V-9gZG zM~6>$5H+3pq39#J)uwK2%6XUsW8uy#dIFMKArC|@WzMpt~ zV}Y2!K<_8S2w;W)&6U|h)yd+mID6Qh`<#fBNgs~A2$yrS1a=&*N4YzhlUQ6wx**yk zdSQyt!hkkW*S{ zZ-#zmVgg)tGcWFf2js=j;eCe|H(mJN*cwH3E03F|Z})s%Er$ull7}C)y0{$74ZNZp z8P4oJh?wk!;S$#em2+i|egBZ3g=n1C6q5lCnQnYU#`0W1L>mdN3Et5i0{t zaGEC|#7nrGdxbT_eZD~%c9%wIPClF&*&neR3*2Z% z>_Hv|P)x?&d%3;Glj}qoEHKzp2Uj!+t{0`5cvz00%1BlNTKJK#VSMIH!U>g^f&e;> zdCPqoOsDf9XKYdtVwCMU2nVAnLYEQUD+wWIh+C3BzT@nN&aQLl-vr*I!+zk1u;qBO zMd{987)9r9Fwp+3(5ZAW(uHcKj2bot`_doM25NzPBH3UCIDfPjpboIZurf;^l+jeu zvuU2lp}1%#!vqp}j{ITnQ^jw~0nS`9NFdaKil{vIN9>ZN_ng(?<#IXNX>*#(=<>v9 z2D2rnVh!`S0z6xGUlUjK3+VTy1oY6cIxgOE0xuPrOguwL;U!6n${ukr18<@DA?S}b zRo)dPzyeXzP`(2YEoMY3nJlyk25e!%G14T`h#$c+{Dvu)osfNwk>*dB5vy2BdK!4j zuz^5N-r4Ce(yB4qgC~$zMpkw+|Ivr98VfTLwM`jG8Ny)@}x#fHGrsog? z2(O(yhnY$bL4a6od6jK8_?tg0tU!?ao-rnC#-pbiw+1DcB0Cr(#I+L`;U${m97wz8 z?BS+tsVeL-{kKE?-(hsTfn*$Khde!C0#BtPFY9*aKSzxgk>ViHGFp_&>1h96hgaud zBy$p*LOrXJ8gOL~;&9B~mWD$++$e&A1OsK){USX>!dRvzxO%98ex#nMDE3iF)Tr@pvgo}6CO|Ygaq63G86W_4^1%-S6wbPM!%dY4LvXtMxrnU`S=>;9}Tl9L<&0Ra1KK8h67S ze`FLY6SR_3O!0j;zCY%$PAEHuDbIl}`H6ssyg}S&I?>w&NhDY@7Fdaz0dFk6+rbL0 zj3RGXj~;l8K8w+uP2Ee&P7P^g`i!NebJvsp$aWnq)uR;^lYAbt7#XQWJbi;iMHUAJB>*K5cXNo)k~in0i- zue`|cn>TRU>6NymoVjVgub16&#bKvz$0B`EoIsvxGqJ*?ma}9A6)+^vARY)GP8a8_ z5+Xe3b~FWPYPmp14O1$o8l2Jx7*w#tEjs}V9FW6IjFPgVR^2$$>(@lF)N>+OY#$zi zzNJJLl9y(okKDvJxYO**<%-*d;usp9ljp#Ngd+z&%V(-lTVo2~_6GM$t(6en*DOM*@d8#NInhpm?PGVo;fP@<}vA#At_ zrd;6uPz9?a4)&7*L62*S&Oi>!IFAzK?xwWs8(rV z8}rpG+JiyN9YE>y?GY^W9nzb0V5u-h{?QaiJ2%*p)+98~0%%_5=&z3KtlCO#f%Y_g zW$lb#_pzd^0Y)r4CtAq|AEtcPuvQH4=6*y4 z&&UKkuz4j1s#P0_02~i=$&nq216tBzq?hl#rR3kgYW3ewsn`eZ_?EWcaL{t$;z7vSSJ}L@{7Hk{VUnOPhy9-GW@YNc+b5zW;{M8R%mT&nt%V!!YP_%`S$i#xQ=E6?87_+jfGp#P$?_jrAs;?F zI<$P0J)UP>%<(2*Y&kul!h8sriX|tw<{}!7$<>o6%qy*KEaz&}k$WItS{T%&XD<=H z1vS|f>Z=RHahJUbt(;BSc&TL-HP-k>ECMluACP!yp@VQlbHU?m39gV!)hQAP!W%3k zJ}&VRBedbg15VEZ6--0dK+nBf_@0n<2AkLoOFyz!i;BAq^P5lZ#W&x}$Yxd03qGW@E3t*RG3FY>jZY>elL2x5`>J_qChU zfm!F(8gMR)7H{YN&uKHbAxySBaSY=LDLN57f*O?_6zgk8aR!`960=o%>ezb}`=y2u zu&oukN+`0(>HXizT*AmT29njR9PH=_Lf)vv;s?tGMV<1E&4&^--kePYi=<6{G9~PY z7jNALkN$8=U{~}h@nFkE%|wePDYKr^1fysO zqlmwZENP806;PHm9YR>Gh?I1E=P%%ENA?f)SMXO zjbsk64{+eZgHxP>VP)*}qJuobcD> z_Aib_k_%_v2et?)xl;Q3-iMp5K3Gs^S~uR{Jp?0I|LFe`W?scb#u(};kr?d_ZJ+|t zjRUckpe*_(@O%hY(>csM%dq&2feuY#up~nQ2`8q3O^gkBCVBk$8s6W*;kInI)AMHp9yOgeK@+@9}TO^Yg`hR){Gua(_;KPLAxn|3S87Um?hFy&rv zQ~d`bYVf?zwf>!02WOi4%b$!5$5y6#okv%Sq+){2)XUA*Dn@H7ArNpYcDc`NGox9Q z;-_g9`{B{q&4B6b5V#7D@uOpM;l$AW$*^^d8R6S51K(!3mB|F(O@c?m{8sb4W|)DE zr^u2shKwbfjEbZ_RlkcoZ z@wN&7#urVI6IQWHq*74h6N2qP7ATva4bWRJyhpT24DLA}NhgOJ&@p5N9Mo2;U#2rO zUMoE|lv&VGx&D*@Xt|bRB30lY=4E9)(S!pWAa{10;gqjv$OKG$%nGTI%=So|FqrE3 zmRbgH5ebcA?Mc>({NMcf6owSZB^Zk9AHg)#BImG^xGe#wAQ-~jzeV^5+2UiP9{JDV zw2)!MNRWw)+A7!`l@6GWraP(NNY@Nu58yZ!a|TgJM82Nl_kwMnce}YikmoX+a)hBb zCb@lgxqlj|$g7*s<2Lr@@5Mz@WmO#N+BZwkN0{NJF(CQhSGy!lOeoPj_y(ZiDGOqR z3s1x18pE}qv}r*=8oe3860$1V-57gMSWaO83!yjh2@EJLPu3^o*mb;S>XMvh%*CBMtcF{YKSGd(Q4Cp}jVdrYgf@xbmp4^kNN z8n15%4#a{W0_eq}oM~;s%%nb2;)p^G?^U)%EuO^z2uQVPbqq$>dr|8OIY6mjd>xka zVySd`a+JYh--Px8V`1bhFmM-|P^T8MF=%dfzr?j}ELmP@U?$oojs;8mSRg6={%Z-1 zQswnyH&B2b!zVkreb6|=N%lF02`ZT((+@m06|;*E1Mh2$PL_;uq}P16+G+bE<>g{T^uDYf=c>VVB=<4nH$ssbclQaaGs9M*5 zNW!9rr?2!V-eN$?5p(^j8v*F>%$HeQ;EYamWM1e^N}qelb)!d zM*5BL2unm`SJV$k4#~nLN8SZj6tAeN~2=u#Nki zMJ#Qv{ll2%28S|nie=jk9x29Dtq}LA6K|-WXr|L{Hmeo4SvgTm$E~`RMzz(dqlo5G z^=cU&Pr-y(Tcc7Zt^~${0V1AJX|}4BR55IWxbwJU@7S)w|fgev5q1${_?X zG{jcwM~mckDk_w~QAa@%KOV}xx-*1GnKqqUiq5;MSI&F?DU@W$a<(2B*+Y|%RPL->ciEN_q|BG?64Fv| zqXQj^HH@{-#6cv)Ol6?HU5-SC2z1(VCO~CLlUC^=XD+*E=`J=rg6dEjiRNh=64`Bt z(bsZ_T=>IPCQbwkquB~4`&^`P#vCxB)gVEsnGq_z^_Hz{fm&s|R{y0Be15#`KQ3z9 zG?fxI1F>6cYF0204*1=65Ki}+&5AC@M##g`<@u=;DkKC?(N-)oKPMl5<1Y?T`kDqn zWmr?F8~bO!zcr^>e88}8_4`FUkTVkX18*1R)nG{UqJJzWYT;~Y7Y~&8#vm?w#0JhN z=O5-y`_sw#S6JTpi`x(zJJ`9f9>eQ-3G?3gJiC`-8*=a@Z%{5*A)e!LUe-=`o3j>$ zL$9`7loiekoSxHfA+0VZv`#;#IGfv^e<(^ElrDyjD$o+!)>i)2@LNgv$ZNN{jcpkJ zGuRyuLVo5g?rkQ=j7>z0l+}s_5j_xUNyKt@uq}vPnF#96I=Rb;R>h=VrIa9@**b0F z!X>R`sI-SjE}}YWT0varS4S9Ga6zIXFJJ(-8Zo1<@pUyOp#}N{(;B#(ai*ym8#UkR zh~4n(hxZYEaMSFIlgD+Z{;P}gl3T6Ut13zGA3&lqpG0j+%)mo=reqDb)@nEF?jH0R zmNn{a5G6LdzP}YPnH}sfY}p4={AvV;FJgxWU-?T=O{*J(-+% zE)8>B_?Pjmf>NeLP zGi>w56bz+7u!;Mhu*aOXWg%mERv~^7+K`w7#tVt2G8X|o0=KfH%Hz4wl{sz`XLSIS zm+fSTSj4facK}`*WggJ)5S5f;|yZMrc577!sWT zX7T}T8L>fm0Yo8~Y>+wQz=AQ#yvt-GWt>LgkD#Oiyi#ALBe-Ey|{31-EcA&nU#04b9P z&QOfct1zYbjHs{zeBupZeIS~mH)Ojki6>!nqAm9$z=gD?EpBa6Vd!j4iKp|hZLvPd znQi5#R@}vJO1fk9kegQ)mK)}JbCn;L#)pJfFNlby$nN!GNFVxKPzhs6rd(zVXb*`O z=6Rgd+cpDEpGMdPLw%86j}O5zM*wk!Mx8=T#Q4ria}b8Ki%8o<^0!XuN$w)C7R_@& zn^f6C!VLq{46pWiOyBz=WD?1!3Pyf^! ze37hY?{Jp57fkcfe$#Ecb+_nPn@hJ^uen7h+DN+9y-KxG(}m<&qtmDzV0!m1ZU0a;=WLhf&kjdZXQlwe2=qRjc`%72S55iOGt$ z4AC8@7k1kfyWx60)@r5jYg%TvOsAxOTT5fhS{rO@@y$uOTztprGZu+}fkog$5GL<; zNVNOgfZd0lqC>P*l3#-*Kh0|Ci};y{?3$748#K?zot5b9 zB9aOmecGu6f&$3~>5V;76EgN_?G>q{sSU7Dw+x~ofSufuzC`x1WTXi6nS_PPm9o83 zCjKJ17AL{r1>&#@JM|kR;wWT=kt>;gd!e5cctt`Dqr3W2aPAKtvW4D(kNsH{CiURG zzsQ2C-q?_J;WTVrI049Kg=tOf!JoOk_-W*jl|oGncfIem;UspyKuNTSSJ zQSDwJP-?<7)giZJiIy)HEdMDg{-Z?21iSh)lA;mSgl?u0=_tzCP>5p;l^B;v`kTsd zNv5nsIC@MnLBt!oZoN@y*V`muM0~K@thVZVHAo9Kzw5S1wzHmb(Y<=RO_CCGE=UW) zjPOl3jQ++CSIToMwh&vI8%-h9r0{Rl;aw5KUO$TA-l()13Do7$hM0?Vwf$k_O)8m) zxV62i+iErv1L-!ajaEH@Olz;Q*Ggd1-fPx3A4rzG*i^=PIALQ{RIIbU4qN!V*7^?? zp3afMo+qr#Gr8&;>c5dHNolczwRBM9bNZ( zMf1H$gf*2{u%RRTo$>_c6V5n1Idj&~uFem>>0Mo49_^npME-sF<`O^6^=v70^dA@d z2j8G&4Soce8b0SmFs<;!_xpJS`UYEnYGYM?Bd~3OJ5V+m><$FeXg#KEVv(s7rZ!P z{Yk75ky=?V&1JZeFdAp)XGdoJ%mTw8E{+d1+IpRf*gKv1>b9F|wkS72rJOw% zlwax&81PQqy&>VSK}bV`bO&l10eApoiCE1S-&WK%)c)H z>+du<-@s77q_wld4-PC0`8pFlU;pp#j8`(M;}_kJ`KR!rRfa7MD~(%ljxQeSOqukh z>1_7z@1K6W6kc_On8NFY|9(Hbnl@g|{~mZP1~Wa4^Z@+rzYSjXh`xXq-{*S4g#K=L zHM8;h$I|_BXwM@yivJ$-NO)QE2)zD#%p>8|%*N{orSGP+f~gcZG~7nyOY&MZ2=X+H_uE z_pmic$;?&i+0ofYG0)E*Zi}rB;k%z{kq5sOZTfQrX6@JmMxv78cBN2Mf^v8J=<0g^ z)yeVI+oQv6&K=Nos||CyWObzV2X&;@YP#u;w5nydUar>aWw%nv?8w2%`PK2+8`X*G zUb~g*M9KYQ`p~Sj8hh*eP~UJeIMm)hsvixv=GNEsqg^x8Ru z$*0bAoPjqV7GC0O#K#?S^rP-k0J@sIf9!f%^g(W~-{4_Vp=D`>PhSAXo zv#$Nc|-0hN|Q59t;)s_)c?`A&rh667&x5CVW=j+ZEGt}ak+%g|qVn0K0 z0eso|(g~0g3UG&RgkCpCThHzMOS%Z_mWbVM(eK^XSh@zp)BX^Km$~y?l7wm zb|zK=VlBk*w?l(F6_a+Sz;tKY9`e^$y`yX?F;*O0!dU*G(cLX8#wP#9!@j$?zuSTOPmtz|ImU znY|Xc!!U1sCmRNML|0Z$LGW z6YSOb`b-(l@Fm9V$Av!$voY4Ka`0hpj;{#7>~GlXZRFh{b7$}9k_gIEp*L)nD~bGY zF#$WazBhn<8XIv~$iQYLQ;rLfv0K6LWr)PF7Abz=R?B7x610+p3eO2H?C_!?2q0hUlTbsf!w)uz^35~Z4CP3PapSlgt zsRtKJU_h;J;{fO}7%#`pV(v}CallF8NHYu;Suv$@A7|;YC{&~xnn!WZ2nO;3lg@r5 zMKxXBug-$OA%86=CPH>j9=EPrL3G2#vg(~R9jdFe4)>QtV0tVAr;m&*E?lc-mR zH<$&Bzp*HJ{{bcPoZ7d$O(Kg9^I2~pzTtgvcaNAh_>Kcx4&}|iBe~QIm*K{+L~Jsk z;u0>x69PmAvS~w3v{Dup;<|w8INRYNrQ3N2ar5$p!LQl0_y%Am{xxeOlzyA zJ`3nizs9B5*t(C{m7>9oxK(DjSSvj2n&7ajLc>6A$pDo@s}rn4G(LbSLHEjp-sOTf+=OTLw1K z9F6E@i(OXwo7nVe!&MZuNkeB{P2!^^k}MhF&>w_&FXAr|*xfw_cs?Z&%@~V0_!@52 z=%i4rH36zh*`;G&>UK#u4mrdUZZrS~6Z{*avVWiu8?et}5L!NI+Ud%&V|NgXFACRl z{_W9a@A~-kh=iw;@XCgNIF)m^b9qQqW}GlVhGcim&Rn>0;)LQa_#di}+FYrR}md#fA| znw?c*)GD1GoHLi5WZh!LNQJ={%~EGL3JeO!SjDzT&735m1}77rO$YZ$SAmzM$|xcd zsIM~T#`i!QPl+{MYwtChwR*Fn61vICQuWK`3!Jz)9oK@e%BP_f%Hd*u%ip&?|GxD3 zxb*qZ`TT9?^V81fS6iyF?P|rXmnv?_tvc0er{Tg#y!O^*+=~NhlZj@|gDD3&aI(F{ z9XH3-dGnanY==7Y@KAg6M`4kppv&s^KVN|UjAX+W$Dm2fFk+a*B`bbn#lMXwNgG+=xeEV2NyRH-3a{?w4{Gz45=67!Nu5vS66@)bKicT#un?6o4SarJsx?Y@lU zO_8T?o+AK<;XUnGi!r##-EdqAeKzToVDY07(X6~sPTob(xvo~-M)(aUTbjfqTo!)i zG0fd<69R`sQa#Px?b#ySg%*YR=vsy?_LIPHcimdO(yFx@wIfFefn4rFugIL0Z~nE(Nxzc$5{&rD^qf#M3BBrcc37Rh zfrvx9e!+bk*WuXX5B_TrUtqiV!<2OOIa_~;@>KLfoxxCw_5dSafY=k>b37p2gPE(` z%WK2)s+m_kplNrDPPORJe%~lMt)fF4{a(>=k*t#5;L^TJ?~qjho?md9a;b<*Wr$d* zUbVj0erE8A7P$ZMlziBW)WHBkI;4i!?kVmSg~|rv4STF4C?_0i4kl`7i3dGlekI$6 zcD+$^-FNu6$^RhI04@_6Z<}a76kC;BGU|?^q#T1NoE~|Z(|EQ?8R1fLL4VcI`yPG}h6ya4i%GJeVIQ5RTKB zmHs17JQiFIonOdhQXRgKt*>lnL{O*@)<@0$%+yafQj|ndM~n@gRdr^hXLV|ui~1^FH*nbY>NQHAOX39 z1VRx|DgYybt6FuVYAQeZaJLfGtgWsIbV2H38$#0TxqmN*wCvL(3y&|X z{X)PxJb%n5aUnS#D}RG6n#Kx>~kBo`-VV@d#+?FkaTp}8+ROEB&h1~tntzbMft@Q zW_2Dw+yWV)qP_3{!LcWS&pVsBEHA+$JRIKec4x$t)r?E5JW4WK_~l5_>G$(@vJ*4+ z*J+&M2f``7M8NLYL1CivTTLg5V_AEN+-clF$sH-c+>!SLPhEuG5e^6SbjM=OR`Ys> zX#N)39_giWLdUlSj80!79OzM%(4<~+9Pi*vsA?bEX4YDZKF=T1j+Rs>vF2vjwtv00(GHjvAM10e|#3LoyLD3d$p^nSDoj z3i8bfzVj=`ol2WU!hgIj99XTUP6P}{GS zH9{|nUw*a8P&|RKPB#0;o5qboyL{zfvlr-3k>foXQcp zQqp265!}`MuVyhnyYq==8J^wjdzu(%ZbuxsGOp!`nkSUkaX31$D0#0yQogPsCCYs0 z%|2q$E9@2YAW%^qcmk(T8En93)2rp+UJn`V2}QPTD3(4B?<~zm?gQLBtbX)A3E|oK#V^72r3kLNJ^rz zxSynjf^<>4O7eI~(#ve~1s1FJWmE|Y7`14rfmk?3(tsluXQQ~@ZO5V&``S%DqKr?o z`etB3;-v*=c7Lui#DU~xm*t@TXuIreq0Oz>>PbXC$ndNFb>W^Nrz-EkSf?6(pXrWQI)~Ic}G0`rF2#D0PIhgP-txRiPHXS2Q@-W55 zq(ELJX{8_iUV)twRRT92f>rb$=mydu=%f7BTmWRtB9{q&ZZf!%^1$-hPN0LOXG@<_ zoLUu9V$qC4lc>ZS$a=4cObY};dQliJFvuCwI^69PU8)j0!ir+ztwlJ1~@4fK8 z-*ax3!Dzv8RHB$(-W`$&EG$hSj+qss6|7yRX=kh6HS&}t&} z1(E4Ec#PTQST*}1Zqg@Sy03!3DYsFc7>zR%Q=c{*gu#iO{>Y)X9ai@CHW&m-X7#~z z;ttkn|J^v>bsU`@)>ATMQDv}&O-!XB)()*g1P~tYr;9#kYJgF0>`lBomC<-=iYdcY zUx#d0l#$gTv`_RAn-(G#-ujtLt>sM9L3h2MR6>?j z+Z7x6LI#Gp0*fbZCTBgIv{-f!utg|~oD+Q_qLcz0(_RJ9CfuQTt(UdqS$eKwO8 zw4lq3SGa$a(H*EUFa-7sCMrZF^9L|ybF;y0w3;KSi#(p_BDhi^Vu0FebqnHJ6dPkP zvB(hUX2t1HMO?-ii%B@Zhr>$M=ipwD>aCH1#2bY%l~}PNNGH)Y;4IYT{3c?IB)W$_ zt(D0_1q?)TM|-T&nA>I^?Tn_5g&3s>xMZH?&BJHef<;`|33Lm|p<+jo2!J<4MkE$+ zWy=%6o>viX_*h+0?zmN3tP1Ux*k;*1P_6aRa`67C7>m;8-1}fah?vGJVyV(sZ+t-_ z!?0mqN~VOeS)_?$4yC#x#it^Y^fWNh3}~vTk4OdiXFzA3B;C|E-ekt33k=%9 zhZE?Sgtv-%B<}=Efb7A-8n&$6`{_LR8&YSD9Dlr+5%1)12FA6v%U^kGoyQ$q-y}c56>q;Z@1!Gy% zI2t7KH$E%YA;QJ@6J(e!sPMSYgvEI-YR(tG*Xu8yi52AhT`6d*f+iWqnpN+`F>mE- z_~EP$$)v)DX1+p%pw)q#oM!^!Jr^(Ui{I<@7tciFqn=r^?qoUcCp)fQ|34GTC}L3k zXWwrModu7LU;R&~@y&;fw~iG9ll^{U=#oFIp9MJm>Q6G_&kR{CV0b_MUQ(>~*stW} z6Jm?Y&%gS!jCiVN8;oe`eZ+5^ji9e#@#_Qf{Ru`q%`dY?bnMN-%n>Ih-5V?(dm#zR zB;NuM7*eYZU;cSVJacQ@c*K|Mch2Wtry5`P>Q64K{3coE6@AnXh6^~Jfj zOZZx_Zm_7MPjSLe`p(F?bS{@{K%Atc9s7R$B9TE&F1zyKw0Dc!Tv1AG9Hy4xK#jxX zi}S1F@0=Td;K8>6t+MNi+*QNzt8SQzOgZ*uzvXzR5C;i?2_(ySG!l|E()sE$ywHhHN;gj>JVxBxR3Axy%j%*yR`5~1 zCuie2_a8FR$9$g+E z;3{me=pA2|-(9~hwJ`|)aozimi~Zik$^P~0^UKrgw@0T(DCW&()YWC_=LO=6Zy%rb z4$jYBAHV5cyxqUz5(uEU{oUc4-kZy#qwAx~-r@fBe(&)35-)dYh;~Q84gH_GJ{*^D zHF?(#$g%zA?ELhocX)L5&Gq?3@9OC4>iGPucYKKI7_}1pH-s-Ed|`&Vv4eM)mq%yU zx*iI@gX=5azq`1)-oL!=9sQL`T=A`A8ABOMBF?DYZ;rmdJU*lDNP`;uU$4&?|CSmX z>i6mS;ky&=F>MYZo}Zk*Iop?EiuLH-)zM|@;l=*-TON^n;uX;dU}<)EjdJ9N-7xXn z{ES}k7x`(P-686-T~9p-C*Dj-C7KN%CcDJ25MLGVxjP5Fi~S2hJwYAuu_6k%zC1tC zj-|LhHZ`IFwes|flD&3O+uCJ**6dLdub{_)Yh`Jpn# zTfD%dN7xTa)kbqb_|Ng?>g~}9W5N9G#tZND^l2(GgN_L3w{xV-4Bs!Nv)#iWoQ=Gv zQ}HO=y^;VqjO2Iw@2=mTUmjn7pEX_O@4V##{#rt6=+V3VH%F#dczAGrdU5=pW}#f3 zzdn|MS>7xsi=`Ut)AO?wZ~lf7$r5RnI7P6D#I&iMPjB*H_2?Da*ZrfA%svKBK>92S=J74o==( zgAc@L;xS-I-yWYGo_{NAtvN{O2Pvp#@cR1;Szi;H1|7$UXNf=` zzdk;?tbqqQnl#oeSJz>FzGZv)v)ldTH;?{=d&2CW|%` zQZI&IBR#RK_`*(!>UmUl{l#GSad?OSmjp(~>Y4(Fw;f$nZ&uct zyz_!l$6LHF-OPjGo!>#w`=`{?)rn5(Uq$GvI8FFG~OW`KwG$9;cx&qM^F%Qf|E&qb3DMW-9a- zkmpE3^!)Kui!or2&rxeQH7#*7Rn^P|?H$Zlv2ykFYmxRUv4GNa$K8twbo|&Z(lJ6Y zq_g3!;y^Z=VwsgW(61u)uMVkf#S3MZ;8j+VdRYg-T%G1kV%>;mu?`rzx<<2HQ#Igl zOyxPgXhOBL{r%JG^+&}@)Nv9eW@0>6ViE7(T_2P`LciW1*y#E@8|roZl7o8V)+()P zd#_!omFq35^s~W8A%(!VmbVn{_N6>mQ2SSi#F!Hl+!|`uiuMwx2OBkRhg{fubV{;3>S>_eg{Pm;hjJCDg zz$%2`Y5J@6T@Lj1FMZf-e#fCMt+6u!!utJwicC!mBxSeKfs$~~b9plg1`c1sXCty9 zyU^qbq|#JfU8S=k4=UTUa3(9(lbu{rmJc#4=}V_Es*hi)=Y){*A{M5^x^B-m|0E)V z3aRA8V|w705$q#_<;a_7E$ZY&&0_k#I4)y9bJyGnr~1+%ugb~PnIOant`Wf&NX!71 z)74!0CA>J!<<cP}AaS_^EgvzFJ&~ekyLF zTEHrfATp;=XlNEeKg|*Z3JM1>Ho#D@%uuV^!WX%@h@V9bX{_~Prmq%zu%^}KBlHtY z6RidE^G^MZ@$aY=s|%X>{*+rK2dUZM05FLKE+H&%2EaF3Nl;nN`PMASH7X(Svum~} zX$HVuGS_`hhce8{Jcs-$$ptDmkE46sRwTjqp$T5Km_E0N)5l?aij>b58gxoph-1R} z)G1laV4mF1|uPU*Jw8XGfK-u?`>4%9H4((vz8OLSp zm-mvxGF4!Mfw0CQOvYe~ov1u>^*`QGxxpRlVk`{oi~1SwX7=H0(;U8vri&Pry;0qo9$5CMiI0?9kj1vq~BeFE1#`U?KM;efSd+T!u3JE3ZJs@j5&pLo95+a2lXc7lluw(y7=8UJ&e|G z?}^?+?cV5T85s&9{7u?}M9Kpzh%A)naR5<|*!|XG@w8=*eLrOvu-E5PTICy`qyHf= zpE>HMf)kEMHk${0!cs5?>@foOv{gX3=`xg5+;<3~#laB!{Zh5k?@P{tYDF`53?5RZ zsRLHDClYv3gLfvB~rGdLaWfAew8J3 z2Jdhod)3hH8VIS2eyzwwajwX`WN?xgpjHSrJ%1Rwp|8GcBE$HZ=|ub~T3d67n`Jw0 z2r~$6PSQa?N)i(UBO7&2C7hG_5`%F0h{<)K@rUkjrZ|6C`72EcX{3K zcbq)uojL%SR}}$9L2=5?J5jZH=NNE?>`(`^!*PYmjDUD&b8Y<; z52v!TZ^k_upPdl_A7u5LVs7Be3Ccp{O*~{Z~ia{RvDG zBN+g7aFyDmSX?5d08vpRM(b(R2C?~F->FZB|MB68^Z=O_*f;8Mkai>?n}0>TMzfE|#1SVVsXykiotHQw>8j zn#qE~f>Bh@*2TLJ2;gH-T2cst3Z^5Dq5Ksv6s)RE2~n zGD~blUlAld?g`{Nj{CKR;Oavxz3KmzbW`t(_4-sbN>;_R9wJPCL=`*zezczp%25ik zSV^JVlma9%67wX>5EgCs6iW~~iWKCG3!RSU_JZRp8(Hn_7^}LE;8L#a4 zxPr%PDsRaa(IMSR^d+&clvBa`B)F+q+Bwv?5;5ip0Wlg^>jC_Oj?YN$(g{i9LEC=Q z%Kj|ozzQQJIBgVr&aJi`SS^X)goAl7TOirHy#N&{#_>O6PqLzucabEMJ_@VbR2gE} zG|KsHgS$JOGQ_P^>(0&7!r!3H*Kl}3lT@e3H4}~AC3Kk8P;@;TR#Lag;1Owg*b03k zwN%0oTkwT3h*%0z_hzf|AV3kqbVxHDTUiv8UCu_t<0q*OW6FT@)%{{I3p=~J)X?BP ze7kOGD=NdI z{Z(Dym!G~54EFg>a51|V(SuYscp`WqqLZoQY+wWn7CAKVh%e5YP+zZ4<#K>$okE zXHfyian(zc21FGtq^OX=W-L;L!&GIdV#er+9+zC%n~(T&x8A5X8qK0(F}!ZAjwcaOcU`yA*sJP7@~omtFlBaI z&Aq*vYryccYNfVLFs21>`F8D#VRe;kTs7WXHWv^hn!Q4dDdbD74ofAQXrz`sp)s3H z(!85EaE_f|$gDq1M+Dcy5ef@w(QkdIs4H7Lg*v*3t=0IdTQeN>vKx0z%koWA2iX}2 z6PYH3GbBYETtla0^+&)(a>H+EEq;#*4pfLjWMQlRCP zijekhIWJ$_5Iwgnm$(KKfd^Koa!MIWu$b+z-j}T3Yh||Iz-uw(gxdbLPyM zGiT16IfuWL&}dnHBzi-D4`mPz{LnlY2mbP+aBv-JxErzai8JU9d4tYET{)&*8K$u| zi%2WNag)@TSvpJR6~K%9*_krOQXjk09oznGFKA&Z5+45BB-6qcaKoAraE9oFOm_9f zrEWTr*oAEwcCU;)hLi1tz>Ip`8`)mc*r`|bnxuE`p>~4AN~$T+IwS5~pLF7bTQU{` zaz95_u7urawZh>4n4yE632vGt!&wvbuDkf&PLFil;kvosC=;X%aVa)LhSpZGS@>w;ShD$HD zx5dT|vO10pop2%MTtQ)dTIF2MH0Q8%v66$siNKxMSjtEoU_9lH9CQ(tX8|pt@PK_s zET`0%ni%D_WB8KJj4H0N#sbnKyC6Jdw8X#1od&JeX4uu}xykr-WT|q5&M2oB_S4RD zN2?D(Bv@)JqweL`0}BbPtioSo+XS$nx`+(+iic_0%IWFJNNlf0WLE*fKK4Q#D04*A zbqekcEFxQ|Y!O7B)PCV3<}~sHrFXeOa@gg7^)<#dP6Tvumw9#d7;M~OKvtbp7_JMu zA`7|g9L(jqh>h;#b^rt{DL2B1=nNULj^UJ}R&ZMA4e5l9@i`iD*}mMC@GR>~Rj<>k z#4>!)DU^MuRx|4rpR7R=|lwSWcN}ua!|fVX_w7zen?^I#n~F= zh(KomJj3G40d7F_;x0Q@ah)_HUvSiP=2t)~7(dmZ`{7NcYGBZL#0+<|e2s&e&24d+ z+!}xtP7Jf#KR;*&X`*60rn*3YHWRf)b=a98(%2IEk-ghsvs5%QVao-cPl@kAWj81` zf_!P_Gq1OKXG7y!m1pJwGdB#$t!pn7Xa%ZQE5!=xeIrnO1eP?=C+T3cx@(UlC@5!OKHiMqSciP-jz*a)omS;vO?*gtXR8B)imqAzM~WqbCLKi4&~NxBP}B$agsCKtOMJV z8w<~=B{pC+?j#B|DR~!?RJSVpd|Ko*b5xRbb8QWAMKtZh0S*k*5^?SuNq_N%*4bMbr`uRbyQ{6YoSBhfH;%0q~%7nDin;x9QFg|q$HhaX41g` zE{gobfb%1dz+*dUa3}Op&JmbOZ`Jlp!;>qPfthbVJG-;6n;Mm-%kNmYce;9FZ!iT~ z{2Yr%GhURj}mD6tn3mMhQ8o83Ns^phJcSv9_QY+a> zwf$jdxE-7m(GEg`^R;H+An1)sb(c6ZKuB{r$y=o{U0tOc3FP|__D`=!gk=itVU_mP z725TFmU8bolWRuUw<2KEpp7c=Q6+Jmt2WT>awZUKlq_ph%KnKHw}ttjh${}OB$E$o z#Fw3$q^7Qm^oWxi8`Q{~694f$m%j1u()x8h9IB5hCmM#q-Hn57WpT-LD7z_(ik)q2 zxG{1wGFMYLGjmT1fw5TbI(0Qr;=#h@v8+%oB+|2GlT$@DN;%qqHv|!2#g{^Boz^MZ z&>Wot`Qq0_#42LXHck?yXf&F-W5tjUUF|yscx>aO|6_;MEq;9!#eDk207S?Q%SQxp^Dh)Jy&#K3lBTJ5}pPSvMN^L7tjWYCG=-p;XkKlIRJW^Jn-(8&OxDiWj1_X-T_%INFZGrG zFYlARLh5-^QaRbBL?Wr1l$==wI$AtI)E@b%ys4u6e|ewmmH3Hc2ozI-|MEUz|A+Nz zMQ3?aS68=58HfZ1GVB`-VI-B{zr0V_|1JzsXTq}s#ByL5QXGL2{#7SuI>dy|QKV3t zH}U_`s*gzJdC9KfH~WSm!-g<~wn5^Qoe4Q)k}q8r2%Vyj~I49Zm<|C9q{Q$!S9|bY*ziu*mkL!Rk(`JRW98XGL&xQ@&e*M7w)EYcJ4piH0#45OIgn5cw*9sRN8yd zh<32{noCLn)7RJ$j|BD%D9C5g0yWH`@vNtKn(bJdq_a&}&}|w#7sOi&_QYpchXSb3 zG%;tZ<7KqPYPbpE9Flu9&aRYr?%eVU$F^rm*vdyBH8>QBCeXz*tXq51g{d4!8r#Ln z-Agha7R9crZldwCLRK2Ct&k?qe0n??(uI-NLxJ3>Wrr7RL{PJE9KFa*CNd(-dN^z= z%Q+=X`bR_XFd9uf{$L#IlCi~1pW;Hk6!5o*$J4>6%`DDl18~C?yDM(9h#Rfz-EgzL zzd9i)c}Ds0o%6F2Mz0FM7BnEg$DD^}`Pf0x2J9W|oeOmq7k@th$JWfW1LR4$8rN8< zB0D-CnUpGFafKC;D={UqQzhm*Csa*d5B+=1nj-s7Kv6M)`1Y=0P)c`Yb!mAK;|Au> zWY1ur!kNXh3oF^>Tt0g>_jiX~atoTl#O`J>W?usoR?Er0+zoZ_in%W!JPd`5|gUzKOe zrjvV|gaaD>TbnGVP*^&Q1Vkd(f0}ZY8XJ$2(bOwdIwM%;*Unc9RTJa8Sxx&eVy$78 z%&H#4Hx?`&bQlo_b{!?vRu7kmDRi@|ayt4&XO_cHxS> zV$qFr+rB9H0o{}hvKu+BCN$@8rpb4#NeQs<$*#P&`(=6({?t;2A3qd4Qd6@EGdb z^73GLe7^}%5V0tR8TU)*a!kFtfH;fmtgVcq69jn+6KCsyn(Yo@!>fq?l`8BSv*&zV z>YBliw5dtpH2YvS2J3jG?9re#RXKCqA{!(g6E-cQS|%d$7ZTz&gdnv3q$wdbUkf;oV7t}8ckSbOl~K$Qb|Y2q3JKC-n0 zRhxi?Uu9ZMy<>D`O&2a2+qP}&*fw@-+je)yc6N-8?H#LQ+qRRA(McLN-+S&j_x@aS z)u^gx>POYAXG${F(_$SR9kpdZm~s(a!YV5fsM#J?U#? zrE5W|lm6%rX~O+oPpY2Ux0dKZdD@)_OC8HZ{9~TKFWY=SUjwS z>Erdi8eQhVFw0_J=bqM|>h?Lv_uFjQP~;Vp#q8F}Qul$#FC1xzn+>WZ@``Hj{-ax;aok`LbB*R!hrGTAYC0gi>Nfhe*O=ip>)G|G~E zf;d}L(3|)EfpIe@k8)4xK;Y;VQVQPVXZbChQ{2+CS)ojtlxZQVogCp0{Z7F+4V904 zX>`V^2w9!ZB6r=3cjIr>8)L6f3WES!)mSyOTXMi4pH6o!$8;_i!rna42suQCDz zUZLc*YwNLwlCStpyWQ%TwUrkspqi*Tf zjg15W!#=?{zyj?(@;GfYhB5*EJc~eZDFN>BPEJcTI9S36r3d#~GLmHHqA)E2jZ%&z z)@orJmv!rLK)_D=I|4}mS|jA()@pne6St-wAC*=(bWe`z1@>659ua3FXSQ#M`d2?u z48O#h&J{$noVlO=*s)%w_iWCI2qI3KOw)bugy`5Q`*2g?zv+gh3DbVv+lzu?FTtOW zUwSY0zqE=sX+k;IvKd~gRAR39n6I?IFF5Qh=~j8lW_P0BmC%7ZLdLxRTrk%iy;rr>^Xp18a~hZ@izf z(g+KRMO;?^Re?f@1KOb@Q~ikM5dmHiTW|8I;N`&s%kXXe8z-)A+R>tvj$+&x@WZ!5 zslQFm1m~docO?Q;_xC>BUQ*&DN5*c)n0uPT(Qca`o4RK~q~L>bVz>h^YHbrk_ zSz?m1HAGov9Jy|u#Z`INmYtG?@PlE9QNy-ESD^u?43-jYt_$Izg~WM8Jne@RduxZu z2r@o30nF_3^oAXusWq3tbkbRZzJH;=PZI7-1nR@9hEfU_*#w?iw_JvhbeS9RAz2&7 z3?RwT&WT{G`bX8E&ZJyr3;B-gL>+&)cSps##knI=N9s5w7=5)_XixdZ0G& z4-Y2rptjl9aj-SXm72M9J|vkWypS(vK1U7-t}$%UMG7+zQ0)qD1vZb1jO$-FBYq$1 zNWjvrNb#&LN6=T^s;5#GC{Y!ct!Bzu-=ojF{D>UD=|yV+bzd%sz$QB02Rd2 zry5YEGhKC=$UB@obpRRY5;P>49gnQNsYFv0Xk};>2c-U;MU++b1^St2O7IW<%LZA- zyqqxa6wX9?CZSlxdpvQ7w$5z*LZRfx6$Mn;?>0cjHJhoM5PW}i+E1<-@h(3$Pm z%&B&b>k>Bst5{|&qyp6my)3-^nE3d9xCF&`>C)9fn@;7Z=Hk3Cd=ovNwdNVYU=-)w ztg^+B$P7u@IiUO7rVmqv()wK@o0)F4%0uTEFUJ!?J1OGTNoq95M5sL1?b3?66iw4Q z-na9^q)}^1p>PHHG4@&e?tDMU-fzq=tfDqz9-NR}wK^Oj$R-@-ko%AlnB(@|-W?pu zd=~R)%T_uRfjBkqIk=ytTP!U9><-<2k1#HJ*I7ZtYOg4+k{jCR_x>&UOsYV(Fv&_Q|XQw%XWSWvgN_Hd8N$r`5MwJ zl9%S+CPdUoL?#>%U2KCw`&H0lv>Z+aZXver%kE@_L1hFLjdt2OlndT9E?kb}-So9p zm*vM<#bECCSpM3SDtgRxY>&FKp`2X+ffzAGJ%>huxO@e(MPg-ZNq{`kKGPC}CU*Aj zYJEVB0cqIc*!B3dU-xWy;^DJ!gy#ukZwKTT!?iL^N82FFo%K;-iZB_)66-JpB%dLC zY3_hAXiesWgM;XOntbTPOj@M6R-kphPJlfO!6RbPpyZ(kQ|XIL1Ww6d!Gz%54U+ti zYJEfMYO@?hwfNlL5~%$@Y_^<)+UpPf77!d8^tIXfw+})Wx`V{?zm_=~-96WP`3>zv z9VV?`!IGXQ6Qz3K>ssorgtLEK!Vjr#JHe2E2QHsOGUW^^gsDi)Eip<~TJh8jLtD-> z()-$r?U6}ef4g+tiXgiatk*%HkPsE|3M+>{% zXG7z1H=TMiPih@JU@D{2cWnvjc04 zd6z8=3&}oI7CYzEa|71=X<%gfd}q6d6kAofO1Fs z8nHO_oM1J~7>~{*RbiYl9iUxtUh-JR3gs2%*7L24kwQ31mQ@ZTi76?hamY_o5Y~d! z;gLLZq+g^^GMZtk4g_*f5jDlQ#1v4re7RA zdUk4VY*^Op1~*TCyScu`QX$o~6-Ig`f=w$5y!Fwb4nJ|pEmj-LtJI)oxRK4H7GEP| zT%r+IH8bKBq)&;!WgR+ETw0aSBbCFH%I9Hvx4MIzH0hfU_S60I=sOt?%}naW?DJ4xfg1i>Y5J}xA8M!#37AGM!Ln^`j)GHZ zDyxi~EsH14n=|VU0=9n$0bDv{8%+pDxi!~_h5`2Cun{{aoM)OSiIIFh;K~Wk2INF< z3|Rvp|NC{fP^;}jGo4okM8sEK{~IlXEr0+&sTZa# z9Xc$?=)r?Y{W4Zd4w>KbB)ym>p^%Bi95tC93FP&abP;Or@orMPy0h;v%2{k#X3#yV zNL1zCd4&0r;6CG`5kpQ)n-Fwqmk8$z`!`WRQ9#K}oahDTFTCKDmb~V|0%K(7LDM(Q ziF;)_QbKK_8w>14Xi~MY7HKA4^Gs6RA_~oqa>-N|ywt?wJTxmdAUsxf%jvB+9obT9 zlOGiCU^UTtNcP*v_V(a}*)csE>VrK`TF!Z5&_i)0xtdW9T4_so#`S8*eYlAFMEG*Z zHV<+mqmdq>0-i*skV{tJAL;Gt-aD={xeT8Udspv|NvJ(jIgt5aN|Xvk`VQ>+2HRcT z%U$ET?Rt}f_XHKK4`*CwBEj8$-Mm*iPeSo@MC8d>*l&7kX&C?Jg(ahi2;$$|I(02NN$JH-$`qhU`_K&;LTI3q`$l@$|uWnnJDq$jPGsE8M30tIGy#)G&T6#ZbWDZ z@nUKSv^RIq$Wrs8bED&J>52{}d-dE?WMGLi{HEH~vi?)(ndhLb2sL(Sy1DZ}|AmXA zCx`mqogtsYG>c%5|3p&9bMA&OKNn6t*3wxdka_=o6>sSu?OrHOqtN@} zCt%I7F+BdIYmm=j7q_)>Dvh6dMQv_o4qoF+p+~+ZDe-LtG+|c_FEpZWQ&hGR3fvZ& zC5k$D1tjHQ0y`Ju?i9{1-}S1=49oVHB|vzM-~=JBbluFgZ2Gn^6fiM1lUckWqwTR` z){gsG4XUl7I>d{iKXELogQ0U`+D@5IvH{a%LVw8F{rqA!0II?rD^$a)X+h zcDj9>%`swVow;F`)833Cx>>VxXiLsszl=tlEJ>IDPXe<7~$rYBb-Mm*k!y zs##$}YWnnG%9DX}%oB)_!3Q=M7TPj!e~dUXz7PSv2+0Ql1`6~58n=J=6^6A-c_W8c z(T4s`kl~((bySA#^i)B?IE~K6Bpwa#cnT`?p5oEa6w3^&wSElc4>w9oHy6KJYo1Z0 z^i93|hiUXArlAF@zoxGJ)96vF2@WeLGLa2ZSDJ`2Y?28mZ}F{^a1>TQ27V#V8g7-1 zF$QbaX-l;$>O}JSII{w(qt)M2ov^9I66aPZKLndI?_&l!+M`c)^bCAdt5tf-HT7(j zt<@H&)@K5?=az!9tq!c2RGPb26az|*)rceZv(qnp5!a>-UJeDlf z6tyT)`D}mbe#ZSE8x*wfyteX@wX6vpxb7X>ZsCn_!me!5cJMdhPlEre`~~mc68KWG zMjDwY$4#MR$lejmmtnc0+Zm1dioaf_tRdW^*Th9YAbNUJ=cy?&>r(AI-nP<-?kLM0 z&mGbgGO+FKdQ}OuL=^CsKNF4FExb1Iv1iG{-xegkY_2qVD37+c6QQ0{uwm-{C5oIs zm_S3!v2`-CXZ|62Pc;4~hby!r9>J88*Cw$#?&@E?dQH#vfNRT#X+3b8Uz8>zIzv{m z*%{_+)($odyH%g^OD7BxxdZ)QFTXBJC2=wQ1yT<;+jZn5_qZ3)F5~cbOH(MT5Cn(8 zn$i2XtK}3r&-rzL(J7Twh1r*pl(R^)i(PxebY^s$^sZ zO=}w43jbwnQ;ZU?Yn#kN&3tczKh~c7GxQTt!sNno6wMcUjr3p90;TVzYl;vA7->E6 z`Kx6|3z@*g?UTw@Nh~e$(DUYY{XHuC*r=?#ECt`_tDf|5fy(-W(`|0`qU`tn2wxzq*=TEfKOe>(@;dUFyTYWsXv|aj?9R zIR3?}PFdR7e<`P88V+xT2zw$%auV=;?b4zY9the!{iR&r4xp%|NgJjm#x}C*(YOaa zl)h^X|3Sd4Up9Eq?C#U|E#P`M1P4%fk0_!&3~Z4nL+u9a zlzZx7OyZJ!VSlu^+1O0%g|-&u)n%%`qCsTqbcfcio!PunjTps@lq3(R4ioBi7Sv?i;E)MX91#CljpBd^StV&!D_yci^&wXU6xLkeU5crmCV&OF#l7l))~SqOSWVWK#+U+D+g^X9gcnvy_y%!J2ip4*HR3>;3D1XZL0)mdv5eyb*SrA;ncxZF5geEi-X z)PMWX_CyB9>7JC*+m_qno!ruAfc2+04uti`>pRF<*sSrl)wcIMZ1IgK{5KC)RzmG{ zbZObm*}9cv3Gua&EUm`4rC%@LWPijm>h~nWUL|{q%9NwsP)v6p2e(S4#e}T_QxjX> zT1zv9UzFrRDmBpBRXanp>G|%Gm2*j+y*CB8_wBIqe~xbJT7`zGSuhil1ueo##|mAz zL9vxuGbdrMj$lm1anpOem0hH3t^-(aD-qnitx#&3nEB%&M_AK(?dBA7&e?Tb#x_5S+ebtF-{Rk*p>%kDS04PNB;!X< z$Hd#iU_i;ElrV4 zNn7iY6{$O`z+@>~K+w)47HJjT#S3?YEUgltmq_y(d+LKj z-c4*SDS2AlM6ZLTSz&JG<4morIA9q8o#zARlvcmxI!OGA^RI z#z;ZjLYYD{Ch*G!`bGwmv+t(0ENXKQ0H*zKQzXJrIg_gJ{ap_4Uc5EbdU)>`Mz1iGXp0<%F7VG41oX}RY^uxhsfU5YOmCVFn z>-!@eJEOQsvyO!)Lb0k)ViJgZy1Km#`*kEC(rz|X7)z=mvMRO17xtdEy+BT4sc8v;4=@OfUnj!%Dg{XgylA6zuJ5iq;Ke`I8`mU{O$Ap>(CSY7BO=f zcbGSDK7n5VvRIsDbw_YytjZ!l&cOwxc?Ysf; zSQVHui`Mk6Cpuv))Xj=kMUdqIlGUEw@*7!&I z_8Za$){h}5asGi}(A9qQI~L<}7jrXgrqH3o|ETULvHAXa zJ=S-6`a6JG)iyo(<&Smx&PC+1l5vJ4>>e)@~Hr+%M(`#!_MW(!@w zmj5g^9EA0^g5JY(4mmhjQAXU;w%PVhr9WgPmh8Z! z5p+`iZ^dr62~xybq}sH2E;w}j010&cap1PyFIdGhf7U&>oiOwhSlnC1@u{lU(Wck* zjwXz!AOWFAqgzii=SA68RrbSO{8FC-;#=gN>QvMq0zHyp;b{u|tL8J$&h%?Z3=+QY z>uW{5b2i||jdZ84)~6j)G5Y_5KLWTwL19L&8LCv@OW_~;onzL}p=D=w3r zLW<#ciWhjwP&n7xt4wNI;fAZ4jSntY)2)@%X%i&nndUp2$^K67Fernejt?=?Ff0jz z#(q-ZY#g_KuDEM?wQx?(9Gt*WAID?yIe=pxwNj0x`_rr`LlQ5hFEt+s)&0=m+v8mfEz}SE99`1dVVK`Fp*@ z3;3&mR%Oa)b%_#!88RbURD^+IR;2bnAncA&G`@wQO35}d#b_M5M>&`2-Z=}wy6#j^`BVfB z%fM!6(sO?PBDpMHPj;c2=!6d47W=BS$IeCY?iFZcZRK%yhND)Xz<{>}Jx93EKGnqN z;foBUZfnRbCCEyCR&-Gp;4KSJD^X;kaxor;;Qrbt3TQ#;PUt!c<^p&XQyC}hixNl; zIPRfP&Y}CuAGv4k#`8%v#c-x}UUt?e=v7%&n9% z&T1&g!ya;6X6c+do6r^=gsJW@6=JajD4S5W9sObW(GKCE!`@HBvNc6Hw@1@#!zB@q z_{mlC8gA^SivHOB$Z00U=E$irqCu+rXVsZUUvKG~0eq(W#Q7hS_(K1f!dRAi`@+@TE(HVPi z!shhQH(xW(J$U%iLVUjRm*#pCpEmH9|1R4WxEp!UQPApV!?=>-0DN*BeJi?dn-0H zMY;X$FRa?{FX}1u-dpBvCg|TS+e76<26+~jss)(daK&-$H@wJ7l#lBUFz=`2t3{w&W-f6S~~)Db!%jo8UVg`z6m38-&7tM}AC z7>uJDSPVry938Z#B#DKLEsAacq$wTehy~H)G=r#tDiQzc%uk}RrZ>*$c%Hj}6)6Zp zEK>gUWdK}WOmB|{iSb>xR!)!KBuBKP>+)O9#Kn{sr(~7{B8M6dCYD=NR~`rv6hpEiCAuFo8j#nLErews%`U7Ja%kyDcT>6 zC%bUF*j5{B3+PL0${lsy&6vh8lOLpU*Estu>bXyvJugy#@s z?l~G5X^)Mqcxg;?J3~=lgxBgowq?uqO%&r+v}$S0l(qt9YjMH#G&I1u9n%<)?8F2V zKiDe+Z)jH@A>BE@RnPULiB6S2CKPX{5W$ze)W}zBgTtqy`rW1ohH2BPf_GMBv?%{- zRt7sQG%>s5v^WhZJjNPJGA{)J$3rblO^}yUlv4C4G^=1?el(4dl{ZC#ifqrB>+ezE zMv=&}dHbYc|K|PkYPkvWnv?fac^5!sN0Izjg%ONqB<0V z)npn)XK_>^wWH*C-$Az~Kay%IjqB(OHd{<&BoRzF@`U>*1wTKJ^fxLor-TODm@ua$n&zuFsSy5ZTpnE7OXJPQkvnP3>(pscMCgS=l z+MA>-5OpkZ8KXDr$lcG!q*{ndI3mn(!G&Bp`IGR+V9 z2V770)F+D&ih>L}1SZ+|XCIB2?Tt=-KqU&$N9+tu%u^UUMm-k?#fX2(9EU`RReZ+o zF#gOXc(L`d*WEpE`m}zc&T1}sB}M;dBu*#UBdg7p?5)W6UJki-w8U=a41oed7UWn< zrbNoQbWZoNr);F9zgUW1n##yJ=5~0QfnZeu!8L>Q)Prt+IJeVn(by}&Zhn_oo*bd8 znAd=+;oE%>YW~AW+Gcy$Tbp5{#PCO}ojBJFYJ@GC39J8o;Z>fJkEq>21S-hE!e&14 z-pu{oy;h@1Sy@J#zg~95&q{-l$BY(l`A2|)Kc0X-w9sI2K_mN-cfA-_b4z!N5Es>0 zPKqMEzCA1U3V=yO#P@kTS~K*`&OF9T%bGUJF{4{OG)w`JLwGvVNU_AJSdR%)n_DZE z+<&5MIct$f(T&lTb=?BC_8B$|i(87HsrOVeLG5TZH4U{`Q_v?e z=*a5gf;9WRd+B>NmRZ#!M^$G|bnr48AdQ>+`O|@K`tw^ z1GhftMU=CkqKK6B@$Y!{g)05xa!2;6(3NY*sD`Td7xaPn2(4CPCiWfhaJZ2JjFsboPs{x=;y^;P%t3+H4ZK(3hsUuAU_^d_$&+U z91NI$mw{f9g03S*)v`5K4=fpgcnq#Ccr^2r>EV2T@Zhqr`XMg>xVz$MQ!=tzDXIYKG9T1!5P>RRrVwOzi3Dq zH|R+j500Q)Kb46{0bTK_Oi_81RCKH_B_X-!SjNACSvvn4TPXV59^-Xab@&PR>Q#24jyLh2u2$xlCtS6qS$V_P{lw)!{)=D%1ri+zli+U{jtH@ngh4U-bt^)84L zQ=tCewZg(xK4&GW{Pe@`r;>x8Yn_FHZ53bIT$Rzh_Og`iK2iRsB#62EF=wL6{~0hS z`5c>k_zU2C5T4OoSM{aMR36RiM{@jY%zuvP0+2@#(rD%*WfV~VpGji=XObN+8ez{F zxBn(cewSz#dzTn2A*boSg!en0bYh6veF_^Ee-4xW_7oN_CnoQ;f*uU_`&win_iHji z<=5o%q_4?$wa77S?-Gg+GfGcwY&39PY&2M3a*$mDEsCeQlBtXZChRe8o!L+p3$mjB z=cKPj=T2(MDT$y)`_HflgPe`%_|#h^8Ihf_Jx05I;mdzAzwf7^r$=G4o)R|Pd&>nLCJWc z1fL*=KS2zCf*9^_HCFGwmoOS1_H(_G3@W^m>=Ci0agTK8adQ&c@uD8~E>MVy6Aga?n~@6h zvn8U5`0mid_lH7M{SQUG{r`2wZF0ul+^-nqm0vN|-f7Ua$Wgn-!@}v1N8!78 zM?b*44h5~8yVlOi@`1K>?X5uK^Ucayq7^8ehh))up)emBTlutLm}HVxP9Uqk%xhyr#QAR&|_)91JEiHGr96<}Lu4;Tbrx;V=d<;ig^=r%n7S@NP`jq!&q1xYmZ9Y9t~c zHDJ$VCNMRsZtd+QEuqO=%dLYezwNKTO0X%@;~8Ddj)`Hue9z%5ORPpgiF9Yv=2%fK zk|CT$lkS7Ct0nv>6fC#4}_-vkOhQcW63IM1_|<56(ZN;1|a` zHqcyAPU5JFhou>7G|e&;KoW{OR90u#<}g!0kqs5DwEzd3R_1U?`^C}uM`K_0<9wYD}7>a7BGpcs<6y zsI#oa+gb^ryt`>~3P95Q2+S@P_ADu}J;k$CJ+oC~Q~TbzUe^XK5t=n+(g_gpd_PQp zbYb8+PCvPZOtGfmhu!d0PSIsEX3^5gg?7T_HyzFh$T-%Zgr}O!>-(uB>SqCwsqasj?Nx7qKqUL z_J%QZRdIM`2ItwFx$=8t!(sMQsfWkG^?H>~NjUlRmXp8Vb&4UuLKNXzHp^L=1KSY=|4e{oKq29=7Nsmn$H>qFP_4e zk~m>s>fRIu8Zs5v-%I6fb?o{J8lqS3QERdltI|M}$sQe1Q>aIjD#pthL{uVTL z+|beQkXzv)*i=5SC2iXFSv)TW`HiN;s7+3clF!=mKU+Z@OW%etd56t~o!lTa9-24` zZV5nz*;sdY?MivU<0l0~t*dmZcI5@;o-!rP)*u2mDsAbiLv@f|wYGIlF>}je;(;Y{ zQioNV0cOsKGbMMGzGW5XGBbz8!FnyQA*Y)G?}2_{SJY;tDi;VftRHXefP$*pK< zTiY3Sacm$PUzQ7AozZCxAIE=^^w!mf)`$Ly$aW$X<-e$^waQS3A5A+6LcKO=*Yu8Y zvdI|7jp!|$Rb}div*9)zuJu?g^?BG@03|&2Mmizxf#a-Xk z&uZK*3j$I-C)Ca8VFq$L|6JwxW{l{bo)2xu;xIgw2Cfv>0Y_>S6 zl2>lO6k5Nl)rUdsG2W~j_wW82SG>z;TuKYOU;N%!IBiK4(qqFy|q|xM#BaLn)Lh3owAr&D3 z)70p-q5Fe{dhKTa#${nmc_og}9AcQSv_l(vUAmC&c~V{x8R$+@W{v<5*DTon=-Ckq z^DJh(O3EI7mc1G|wVI~}dX_Fais@8!kq~GC23E0N&4-~LW~(STk}7OT95Yq}!G!8C zt5BFRhj7+x<*PiSb#rmBvPbZVK=|{r zwcp_I`Sc-_nMH1*eB1u-A>{|7L=U21Hei*7?kOPUzn!FPGHO^UA=zsxKprQ z;;>FrK%J7Q_KG8XxtB`4vO|B+D~Mq~0Zx70tmSAzCs= z-!CGxaHY20?Y@*InFY2NDA`-$z{|w9|9#ESCSfAgvjxM5&z?PHq&0G*TFO~;D8T^b z%!-uPN^nB$Qns5upA!^GupNMoDeX&Z* zx6&lHVTNp>oG^k+260AbrQct8O^cV=@k+%?eb%-7Q1M1zs&`ZeSKOSY`0h=o3b%$; zPeVNt0zkkfKEhSHym#kCRC-)lY3@jeIwTuQ8q#{ZXam0PFJbFV;xhZ zk4s5`#OjE@Obu2YqMqJ5KsfUyI7){aL-}9?#Ljo2` zp`1pQ_8|G>_-0p$qA8|w;<`msHRk&TIp{ARLCu-m(@l)Wgr6_a6b3V!l@`J?7TspU z#wk$|@Froo*O=XH7nczu zYS`>L1Z{;vAQ=_5yeyj%W)Yq#4M$x)*iLiQo8BGZ%I5UFV4zJL)a(vHn~Hx{n_=tv zP|W`kdvaJcJj@W|d>GBhQ%)z_xoRmE^GN4ZiZ@-(Ik6hbZf>gMTP-aMey31_ z%ZuTvF%9`*r3`soO*lR|12iCYa))$yGRqUw0Bx9n=R|A zXf|>{ctp{71HCkV=L6pA7<46?zA7XaYL2l6R#mfGxpErLTy^w;i&EF@bSxm!i(Q8o z+i^w^%ot(hR(jVVji7C5VS!pca*-Zveg9AAbHPdaxy7b6%kcVkh#q>_6f3q|+*uF= zTpAwHED)mBJi|bSL>4)NX>p#2HjGeLyuEUxH{l*ya+d@JpZWkdk#KYa#=njgMpZK7 zs_dniQe+J0)Uh!MM&^r>D~3I1lt+SJ+KYXLiEQxLT!ApBZ|hjGH@^xU!B#5GEg{`c zrwvK}B4?uWiZUkW-x=V!iP>5!+w{(jYcH4aTyaCMr7eNx=(443g;$DDtW-IDj@CuH zkRI|JL-Af8w)Rxxtn8_P0qmeT8wM1j^<_i?6>2KD_;No;K9iw&;S5{Y$QVLMR;yG@ zIC);JP9(X?__YjJ8He;@qd_s@U){S%EK3KZM90Dn#T_eI0x47MDh+uLzSB@W$;sAs zIVtC&?Osl=aJ}l4*Ze%|zH<4Zh$>=9 z1rp|Z-xgZHa1R?NAYDjnbON)qYK4f=LNup3V{60KNwk1{GvH#`Ds#xML*#dKq=62Q zxB>#p*j~(@RMcOw*Zc4Pl0#5On}3{%WouOry`c-S4Lp7iCsG?;QV{;9(9cf$JoNaT zeE%0dtK&61;4i`Wb=1*64uWsxy<_`xkOlv2xUy*yeq_j7Yq6ppp?@DnpZmr>Lf_U) zTz6pz^a>Z}9!=tDXu7}(++W(v04F`E!yYxYL@A6aW9p`P$24C6|0V!h*+~!_GNU2wy3nD4TWI~8ka~bp z!D&EE>rIu6VsiWBNN{hZXrsd~f83Ya2(kQ*q+{9|sl2vX2g_)~i!K|wE zZ=AV^*8*CmYqIIj{J&|2!x!R+9a|71WKo9hrk_ED zIwx?J8VaSuPdCna8X_3nD_`=j z|G5OTyo`~j47;k=mHGnrMcQSDV37&iO!cV?Zn<_@l`eCwYa_@oJyqhW)4K3aAGN|N z(P;g00EGR^InHXZ`BNHWR#jMr>AvXe6H*?pCH3TTh}h&f0aRD)1hjcROYZy>=}@Tm zH|TO|VvXeP9^}EUmD<4J?1LDz z7QWcb>CiuO5$%m!)5i!^p{RZKs^~S#@WJK7l)n~azw6+fG)f3BC_f6((cUX%PF}Dm z1BUA$%VuvssmC@Z%C?I)2irKq2*)CgTHao=_VHf>UXi2A&G8xPy~pI3b*6>X`+)r} z*qMjL1T=3-_P_b$H`2E1c%Df|Fq>(-GMtLAuS&)t<+)GkF3#?>O|;`>hg$7A%lBij zJ3LQFZRsluE{O|d6tuY=j7&h`ktQ59v}oroP2H%@{u0?_>h|wPhj@*I8xtI$;^Rej5a%t(JHPr@ihiVFIn@!73@QUrT) zTtJ%{7@NT{TRChf#gG&j4z|rg2i6^jh}0=M1uRyk81B^qdFD$74L4f9pK_TbECs>1Glwy83AS^Yy%SD61r{MiU>4mV$XGGG@({xs8ybVVw^{glF=otOW- zY-)cl6P9P*`_SZf55>i6x%k$Wq(NK;4Ux}dR^~ddcpGLY1hEb4wOdy*RDkcGTSZ^Z zt}k0-^?u2V7QE058T8}i>;v^SSrtNlB@Sbh z{i-vQVjJ1+pmM8&e?gYp_Jyv;8+j*M%{!@`snO&utLXH|$WmBe-kV+ovNX3r)UEHt zI6}l^Qo8}Vdrk4HC%%5q%P@@J4vH4BgUNtCRB((kIt93uuFEOlfG{vsz%lT|?RV|zqy-|{~ zuFLnKvdaLv)ghOgG-&u3=fwp09=+*46A7Q8QC8lQHp9h|z1>VE~8t5@GZLsYh&qmniDgP@A8i$(&AK3++6g2dLd>w+h22?LAp zINpSl!8*WK_VLws(PSZOK)i-Hd~a<$hT;beNwZ&x%e!=SD|RJ4Jao~Ottf&CE<=Gl z?dVt-CCiZT=bN%NbShZaGnR(;)I~0A19%#b?p#VGtv6mJ7i^|aXcK*+uQFIO^uH?5o%8rxo&>?{sixE%oOt})RjP5L{ zkk7SX#664&iUj@7a(&yg$@3gT%iVD+tJZTSsvT^-hWVcyuwS&A&`gZ`v9t78BH4O! zpXr2B27Isa@c(T#gH-anvmTjkU|{sq2*~_N$(;uF$OdVrwr?6zg!%242;VA1GzZIIU;wu&P^v?>-p91wGHke(>p&-|eTP z-Q45-_#?N_3{h^M5+Ves4kwbuEkDHLp>h+qI9-rN%L-T3?g;EvmX#e$)`Y#i-_Z8B zv%Y1T7R;k3r|5}=`i155TN+L-e|IA5UU2yX&HLO~ob>Y@-{riJE-Bs`NYg*olM$6h zeKT}0OaV zU7B?D-VcKjYtltmfYAXojum-LAWE6k5g92`QOf#erMio6H_e(!n-1!#j8wGJr~~#6<$$?5I}l*{YCtfW>ZVP@o;y z+ORuC3QZzIFRnY{24-L_N=w$<>Ke)7?wH~lG-JMHd_^uQC++k2`YtmOTr;K zt%8xTXRik&>k6=c-GJV(s#1}g?Z03En!@^MDdE^!Gh)-WfEPDto*V3jA*VgvEyB1f zh74xAq1Wqle~#`9=`?=M6{}bc0G+LYasUef1q}dMWHg*U%G3wMC)ah0(1Bs#=XDsR zp$s~n(eN)S;=@CYglT+ZHDDXE#7#{piHP#7XDRGC`uD{^-P{bj##p9MB!(U018Wc2 z&60R78D%`BA%->9^{tA@@6Ol^yuEJJ*xh9cq->O^DlRDwhd}q5<{Bu?VY}^)o%1lA zhlM33v6leB%;qQ>-SIzIe`3fr;ozD$N_-)*D`ORB^gi6mDtHwcMFYSt z8MQ7f&ZJR^+1B{NL`S&I^#rmCr_x2Jb583FYqae0FC<@XyXIbl!gm^~X6X}9P z2C_A=_5l6A%P>P=BFEsrfyV!W{Vm1+lJ$QrmH46m_a*xL$e|xS^!Uf)Z{^VXBM%)) z!!w`Kpq5n*3_U%S2V z)pna;d;ws5uH8Pu@qqW!ykDd6^YifY|9^*e5W^2vAJJoAO$-JNd#R&%O-I{vhC=6&D(BZQ#?jH>{~83{&Ag7LGr|HmDO z!+TzQ;=&)?JllTj&a>OEUQ53NNm%>)|MS-Czwyuo{U03|#{tH;1cTG_D+OoM^w}#^deZZXIjCv3_~`_19Z*Q}>5ylgf8eki+`{fmG7rQ=_0 zw=;jkV8FAfkKMY|{^0+ZZ@=#)r`mt`qHJ5x;tl2`)fYb;#?0xjwA<4FBmMb@?#IpX zCtkh$q1#`%*#5vToo>JPzn^LgTD-}cYX8s82^S3P&)KiF+t2y(Ll=&H{=2^b-$^`w z{MLmRe&przZ+ibPp8BmnxOwKcq5ZeLzB=)aSC!N6_|@vTt3LcZr5pbuE#58B;(tlB z;5_rBZuLL-@_FKSL5nvxkJ+?1#HRI+cdP%=S1$bFpS|=s_Y*B%INN?3(Bd~d^fpZVJk zIDCfTAb*GsANcn_=RERL2WkJ@ecx|C_wOHSdvTcZ;PB>eJVb53>gx}+e-6gtNgw_8 zdA_b4sQuM{_#y@?( z?Zsgpa5x!&Lkw_;a2$UA6Bn@k5MP&{!r}cihyN(gybyEjnedb0^ZEq*q_6+R_uDQU z{?5Sx-ail5H7Yjrun>(=jPCxw~lSSOj#+vgws>OVt$XGWTvKl;v_XMf?{FFrxC z{r6$Leftf^X|2NcoA$*uKD_1~^m#a9HYqL%a(Pk7~WX1n{GO`b($Z^=F_X z{0ZRjK3E%3=b>@9d8XZ3zRYa?>qGZ<#Nq3198LocCjxMY0uEsh4o`f~*HI@M|M1Jt zd;!HAX6e2=Uv*{s4jhM9h;fj3fyN=r=Hw02?YC|}oAgK2V^N2ELk(~M zUG#O=JNhi@)}<5Ataqcs$S3~;*T>jhug!hvuGcKLKmICd90V`Oa}wnO%t@3BZ`rmY>C~?(C(fVz$QNF`2>kGzFFn-GdT@x|@r~a_9qCiAJA3P= zZp*bnUuWZhIK14$3w%xrx$rhI4zM5iO&Eta!Z@H#|N4!LPp@AAo|JKTHsEkM;1GS+ zU%mj||IA%)xcbSTe(mywPrf$SMqaq%R|GEv%t(TQ8kiS^!ziy??#=*-AY)%Hr=eKxxfyM!GklKGf%uO#2)1UeG*KxhX z*7@&weQx8f*Dl}p3B=)6H!u8&ET83Z@bSWA``0&-7wmn_sp3C=zb$ZB{>lRv&V1p* zo8kFSc=sD!K2P9lcHn%Mc|puc;sqFoUiM{seP|p4cmd}m;|0&0lz5>Z?c+Fflh40* zXk8H2JQ|c8Vi? zHq$bjiP7KxtQEWc zpWi-u=l{Orvb(>1@3Zdu_Ps~${_g#xQ{H*u>regIf8P7#+yC?4C;ss_-v5)o|K;C! z%*)@* z*?txKF!PtNXS&PXhezlyyoS$<#|#qxG%2(Nbtk*t_@;+3)^q_0Ky%YNKB+g4e z`N99Zm&>W29wh#_pSuib*>jZd64*D z$M?jpKEPgVu2UcWitWopAA~*ezVCd$JqPb_K8QZ>J@8Woi9g!94%!EKKA_!0^x;zA zU;0O8uM>Sh+hwjpAFkm0(x5(sxjj?v1GiB=;eaUqC|}c`$a(Q8($5pt{`vcDyASuV z{ZqgCz~$%DJ#FI8&+vWWqxaC?{vTd8ibuPAKFvu#8MGDl+6O3)I^&WD#>M=c;5PRV z??;gS`(w9VfB9vgqrVOG)%$VZfcsd~+r|C`VQq4IXBqlX?9hirZg-?{xYs`pDKQS8 z@s9)A;P9N_DR;6tjb|o50kZYczxBD-a-Av8c}!lXAMqQt*(2|~dG0ddEdX{8T2COGkO2@=y%_eJ&*fm+&kjF z3HNUA;QJQbzrBUo-RIEmO?~*6E`9jB;69-J^@_g`)~*A!=vB&#oy$1 z`lpI9c-JknChj}`h}&X>O$zsZz)P$T+s}5{%{%qs+Ae*_cIiW`OCO#LefVkKhsS>O zI~P2<(j(sYlDYG^XM8WWbK|}d?ab7N8`&Nj_wfS%Zhgpi>BFf$_2DOeo8|)Uho1OH zFFE~lwD0EoUbKh3Cy0-3ApB1Q-WNLd;h(zn;mck6@VPF1_>{j7kNYs`8qdLVjz9Uu zQ=7PFMjH;A;{N@|H{n$?*77oydpZnOi34dV+MSC#Xzdk7Q z5w``tCtxmsPI2!q!h8T2S90Hw{pd3%C*Jh#Yv%vz-`;ix_R<&Aho^s>;g2>8_!=}C!N2%x}5y_t>xsOw{nq}MYewFx%210 zbC2l5EI$tl>O++KGGHHuKSB6U+<7b7K>7I$w}}VMg-$Y6)-R|J))d*P=?u+e=N8n5 z>)mHa;^$Y4#9y3^>Y}_-mhd^_Az*mW^jC7c&>^K1g~ho;Tq6 zm*@kYd;F^B3`+iaMNzvWdeg70$h_q3L&npGBOm_fx1;>O>(y8OA)ZeWA6?{J2-3CR z#LrUSD9$oB$Lah?KF^eYHs?b(p8o8={hBBEsXeQXW)hj+c|ObpLS?|SVr^x;Z6uO&WuCFi3{G#73y zCy<{{tZ?5C(T9`NhX-AKNdG0BbEdg(&!JDhHg_NO0r`lZyWbu#7xvOGWL^7W<^syr ztI?(*^+DLjDzc8UMyUWyWy0&*N5FZ811uy=1CfuzL$3IX0 zV?WE!PF$Z)-vWt80W$Sc*bfIe7cK?<7p-6PFc&Tb{)5slun(64e_6k{^Vf>)zrXuk?SJ^I z541n}y43^g7nkDvLYAo)zV!|JEaktx_0I>^FSyP4i37#|*2N1#*Y`x35f6%wTAoPp>{k6~8xc{GTe0lG=&_%z1`FlIR$Ms_a#s5{yw+j8@uGgJw z|LsTK*#7D#-qybT)mLA%t_}0x!b_i@IKl7d4Ah4JeO}P_r(e4E?=+8Hxb6Ck!R_IX zICKd<)Q4AJ`6iqT2hp{G{^$Q!?dUw$XD)^BhVOI7E6!X4I_jG~`ie96eE65=&jbD! zf^_Y7-;%xWoiCa_5B&4)x83mU*SuxtXoBl92g1AkAPBAYp%=BkbLi0H@b|Zz-;Zh^ z`Vs#7(0+f@{i;VD`jNk5CxYnngqXhQ7Wp@Tzva*m=5veZH^=V~$5-Hg=wkaH^!su6 z8|eIWa?)bXT0i`FKb`M?V=9S)-Z*IRr$c+@|B9=rr1$=JBANN&{qIZh8502;%I)bWW0;h(#Z5fR*{M#}p%{p|`+^86WW=g}@G$_6? zMU3K+lsuh5aQY_3=%zyYnt|;uVk|p~t-@L%8dgm~K;8~KEb++g63Og_8is{2wOBrA zkzgh)x*QSXHHqO_cy_B9@uw13)l4+5YMN5ml^M2a=$oUIa(w#i%BjWW9MN{NS}6j> zj7jBqZkD~CpPR`p#uG4M@*G~CbG~SENCev|?Fv?9kXTJqk-6lmLNw5eu-%#d_Q4h|zD_t|XG#gh#*NL8AKRcZoJlaCn41s1 z!RRP-p5EB7W3Yt|Pt(V4h@#+0uV?7P+OTu}3C^on4mx%;A0Fh%BkwCP4wUO|l1I>q zu%Wow1(*d}5}a*=#Q0yqZHfq0Yz&=>EP9SnwL}ywQO8}x-MYUFZ{O1wIYN`*7-BRQ z_-!<3v?3zOQ5W7E4Ppg%J5rn>DH5Ix#1q$UY%H{H@IY{K%ZWY(l<`H5 zOVxKmcJM7fqAbP|M(M&(S`>Wgjt_(ai@F0L<-?&YTe59w#A}HqGsahyDO<8m*+dKZ z2iMCXc4nL&2gF{7dK&lO(xM?bK-E45)(<|a#V_4ZtCX<~f7JaB`S0~O3J9fz12q*O^w{V zH=hae2e6rcVeTYFJVRZ^Q0_=(#(6#-2##7QLQMv&W>FB`Q=KVkk;DfdI4EC@oPrHVU zND)5+IF-d(bz?Rb2Y%F4Sys79hrKkl=V?sr4;Z14t<{J!ro?4fa@f~$Wd~-aODwWB z7-=dsZ(C#WQ9rhqdB!c`;BSYS^oVYZA{lmTFb9-+UDt-L@>v=c5q36oI7uH@AXrbf zE-J=VK5rOW5u#S}Mw1nBcoioQZ|9YUQ&=kDlHmXz6pDbiLbvg}-fMxxQHysQwRLmL zXb6#KOL0$VN*;@nM=SQyY*bRI?XZn@yvvJ)DJkL(P)EMHR~=x`yqE)d3`L!1ivcA3*( zDrM~Ew_raw#o(XYxK03^aw22$f>4MTKc`+N-eDK$owE>!yb*+mrCNIIP~@>gSb$#5&Mi;n`Ez_YJwMMXE-tO)rlKX~h$wah`Lo$D3`;rU z6gi^ASj9PQd_k(|EduB+EUo~`OVdl)WgoJhW@jnd`A)vB*DDq1(z=wJ25H-J2R+Z6q{zFB7?Cg1rZeyV08WvXb1>9P@PJ3P^{s-+%|vYLGpSF zRy=pNo|9W#@D{`7k(|MOp zOmfm*U}2$1eJFCsA%`>H3?JHB_O8jZRybMI7c1;VIj1&xSPTzsc7QM?<}bZzcIJCYJhD###2;BHOJv|4%+Mrt$Bw&Th==dvbMD=hGVbsIZrX?oz-B*({g zNI(CXwNjFgH>j+b6i_aT3C%bn#eE|M$$q22pMO3e>Z+WRB2Y(f)R9IeDltwn`?r^Q zy~4kAS{6s0exvd_PEBhps|$uQil zK>fhVuO^j=sWFQ#?b4womEv1n8FdM-H_Oc71;(ar)ac8!EOK7YyR@IFBxcwlwuH>e z=A_OrFPhb&m3Agq3CWp!@#s#*Lk@AvmS~`*H7CijA7rsM+vwXRDt>(D{C=?7DGw&h z77na6 z+`)v&^1Je3>e$0dV{^A~;~C{03^loaSDu<`_OK-oU<*qIAM9X9a(p~1Uy%}d>&z+H z>X>YkgrhxdvWEu%mMt7Gmf6vMy#GB~-vFjPZMP_D$0TPMvuC0kT>DA*fVE@cx{r!~ zDazM+RxFwo_<#MS6U=4~S&7@Tt{Tv!J)hL9G{Zy?i+-Z5)KDW@#T7a z+_>9j{mm@i$-A@)p-27mew)a-_bOK`>&;m zxek#8y&?>FwWsmyYiwz~_#r!*&l#>W10YMDYqPyqOSvH~? z)-nab`>^=m7}!*Vk>k@2PKSJ-y!F_weAicR&00yGH<7uFFU(lCXIk@O}?BCh)L@8yl8b4ePb! zwTPqZAWJhWE1`}}6N4+-!;cA!Y~ja-O?Hfq$?_rmp#3iNve~>Cs{53e4TWseT`p9z zOMlr+AHu>zDr90Wae zS6dy`tKA;z)%9J|CPueD-LCe#q&C*K%`0``!Cj82&2(K}gwSXgORlaBjGgh%!=mYb z_4;pI$`{(Jh@lbff1I{D((>G7@8zuo-XG1h-i59h!BnCCM!`h0}Xb(4la zQ*|{N{SQ()pLIS{A{#5~0UVOXQLafkt>tsJtV@PwCn*jZP+1chep9FMYxHoXDBmyi z_EB7^lP}fj$=P3To_%qwPLEG+1za7URI<X3v+w zR#6Ti`eVVHTk#d_qT+RrMWOk$!3qz&MMo6k0>_SU3@7K12T_UYsxTprM3%;d`W-AE zZ6d>=^vE7r`pPDALr?`)9u?u?8q{KPW%;Fu6?NkUWdSfae#WcDXzO|V9F$u zwJuq^AZl&-D2t*R@;Y=Ow1VhDGflhvMfQr4ima{@6IcS%xzx$sn$CH9Z=svt)G~CF zX&+W#lCtU_4_9mH_k!MFfKD5Y)b~7Ot3x#Uz^BtOZ5Y$&SLr)uEoy*kn<+bAJE9)9|-@cko_UW#3W`+>ac`0fJ=` zm4nXxdrv@ml~emS4G$LE`(X&d3`4NrA@PA{5)$Oryi->8!aw-&!TAnSuZlG9qq?E$ z1;LTT}0FOtof#Qfuln?OQDx+_TAx4z=}bG zR=*e8riNi}(9UjlBvQK*nn!(8v`iP&LuSJuw&D+-oxB*V6^t|_1?7XdsPl>i1kmhs zh{U!0Xm(!D(Q1@2^n*=p^2k$(Al2h^n)06NO@z%MDE}2U2)4O334+ak0JGR>L?j zYL#@*ad|`5yXc3|rAbY226R1{q*wh!58&E~E628tM~wzv{bqNDERr~#EY+M0Qc8}m zDT*PDXeMhunIVIF#_}S>LX!;*2uh8^Q@vn5rWUNem)EvoNiKL~rCB=gX}e5RnqkXG zr&C8_9%()nA{)kHA~!`@MmOc!z>G|hQqLQ!ia7=dX(?#iN`&J6EF z3y`mJ6>E#u*lv^V`!)E@wmj%q7H%t}mrPdP;^0(Fn#WnqqZeh1S#)%fRMAlxt12Sx z&@qkmXc!_{luv6!z|c3C8GKB>h0QLkG78j_WWplQR)0i_!!?cE)(cp3Dr?DW50BD+ zUXR(`60Y*9jB=eB=$A$=7-&Oum_T~ov9?n_zqnQIGyocF~yr+eyk?CvF4HLi`Vkpakh8hxgbT9D+Y}dY1GSz)5r!vx|7fmVGS&Mc}NAG&+7Sw z4#pR(5AQw=pHd@n?x%P6-p}9v^x*D2)`m_`m&wy}clkkCkoxU&M~j$HW9L!%x?Y^A zmk_;|1GE$Po4Y>CJcMop+t3P`RwGhC`z1!d*B|uA1k;4QAQ9sefN~qe8BUjwI8|{# z-X8f;qY`s0;j12C(U?3=BG_Xn)Ccg`Ak657bE4m>%J=F#%;0J#SFEX?cdaFImxava znsBM&V^ic7>6!$9q%R2EDVVdfLDMFo9||Vf&=xIA%tkk3V5Njf5OGRzgNALL_$?9( z1p<+9rl1@4zgXm0DLHqJO&FC6g)Ca~9j2ZgZD!wW1ADxj%0&`=y(IN@rDkMf_!JNc z?|^32QudV5Xp?C&nL|mwZJ~w$HK*=uo2X}TEKYQW>3TMYG$BgR$6T1h#8O%a{e;ov zLXhVdt*(2WBn$O6D&c#xLF$sHMv%iUS#)Va5w0qu#mvQy*R2YZ2^|@)V_Zcqf#F{A z;P6kVikC2v<2tsn_MsfSsW1xm4ZL9H357y2KS_u`yn4iGeB|j;-Z^3-_#f&t%5d^E z3;v8`l4yUkE5%-!@-#^{Y`_$I-q}11Tdx zc4^El5-6SiTUsHJe4GSGk_;6`=FSK*pmhm@LQVdzWlA0W%P7rw!y`COqIf1n+0l|;`#N(>D3pfYC#$? z({k(}=)9lc2^uiS!x6hGf@x{zOYExpGMTQ&@|0J<~7jvlu%%`d>jETSbSn{@uE?>M3m}HT~y{w z$v7g}1TMxjS}qE<&1uYzN?eraVFfR_8ygh5#Rnz>#AC6>Z2+f!37e!Dus>$X}WS4k-Q zUTp2u!|WRkNnF}MiAK*ko*t!fF{dd(AY+`yt4OnB&P0HN2%ME=y^4Ux4t=P^Y|HlR-rIwJ^hezZVq|BGz9skvs=*jUh;aX`s5n z6`wR1IPAsi6fXE@RoO!u%&fyWm$P|1LSR zzQn&37ytLH=ZO%vHuM5Is8+BasS8#>WLnJfO5=zyyb?}bS;OMcn3NXQ}4Ush6)((!VeL_VD7+8W$c&?~y^^t3XT>djDC&d+HUr1?D2k zO_*DLC@I0NS{kKs~|sAueTMJmFHzjV=pOvhZVm|dZ1UVx-W?jdhwX0f6s@{L*p(z)rB zPv)%>k$fS)2ccPYu^?hB%-@$qy|7Bi!5Lm&VDsy3JP%w5v#LpCv2xuvVMf^tAsZ&- zI5tbwP&_`MdL@COp{pY%_@~t~GCox?G<$Q0=w4Vbe)(b$7%6ZrDqt?N)o)fjpsLv8 z#2sujP|g9p>!W77WF<=zLtLnX8he9b=f$V>92+N2yi=G#nVrJSiuZ_ELsuHpZG7<| zqVknBN~Mcl6MfktH%p?igr%^x0}IYW4tZD5cMGh*`E|nTai)#9h<9f&q;!E#Z7*ic z{iC=(Nrnw5L}hl6g^?y?MG8$jqV4m&YeefZYZ1KbMjz2q4&1WWoSQ$$+?p_|bYqL6 z$s&-|xJZ=+tgJxMXL2vCdQJ{ZffcCdSmhk5KVtxiKO`V9Og{m&aHSmiQWe*A4U(7C3%bWaDriQ7bk@dfyw# z+v&6s%CGBhZ^!%xYH>C+ITk%D7}}&o>pc~TXb=x>4viAgR$tiQ_5drOx$|(gtBAeo z;hEI%VyI3AofjW3&S=gCVP5ZIyO;mNjpX}i@776ykJsN;c|(umkUP~<%h0Zj4{jKk zLNRvC8HD##-FwHyT8}1w58}lOi@rmG^)<7qZHxAPNHuwF1Td4L)=uGnq*k$fZPF_r zFcF*X+2U2-$A-DWU7paAJKX(8ZXGGE#KCpok~Bwu^x8G}QrHx0N%pv4C1{&SF!b+o zF*uL2@g}?H#iC33$g9vS0PSjW;-x9m2s|TFURS=V9Ej`1TC=-^>-?U1cj#5sLZ2NS z&69B&1q6M@R5OP{aSopf9jz_{AlBEqg>NqfFAXSm#P>w3lCfWlKml%lbb6 GSReqh5MTZP diff --git a/gpMgmt/test/coveragerc b/gpMgmt/test/coveragerc index 511c2626fbe..566c9c83169 100644 --- a/gpMgmt/test/coveragerc +++ b/gpMgmt/test/coveragerc @@ -8,7 +8,4 @@ branch = True omit = */site-packages/* */bin/behave - */python/psutil/* - */python/pygresql/* - */python/yaml/* */python/lockfile/* \ No newline at end of file diff --git a/python-dependencies.txt b/python-dependencies.txt index 9e63afef528..e00003d485b 100644 --- a/python-dependencies.txt +++ b/python-dependencies.txt @@ -1,3 +1,2 @@ psutil==5.7.0 -pygresql==5.2 pyyaml==5.3.1 diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 8a195a39856..22c74e7a856 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -192,7 +192,6 @@ bitcodedir = $(pkglibdir)/bitcode with_icu = @with_icu@ with_perl = @with_perl@ with_python = @with_python@ -with_pythonsrc_ext = @with_pythonsrc_ext@ with_tcl = @with_tcl@ with_ssl = @with_ssl@ with_readline = @with_readline@ From 4f3957361b2048dafd39260ce16eec023762ce9e Mon Sep 17 00:00:00 2001 From: Chen Mulong Date: Fri, 9 Jun 2023 17:41:20 +0800 Subject: [PATCH 2/7] Fix misc python dependencies in build & test (#15732) Due to the chaos of the python versions in DITROs, we plan to release gpdb7 with: - Use the ditro`s default python version (3.6 in el8) for the management utilities. - Use a more advanced python version (3.9) for plpython, so the users can benefit from the active python community. To do that: - Use `python3` instead of `python` in the build/test scripts, since `python` executable is not guaranteed to exist after installation of python3.x package. - Remove mock 1.0.1. mock is specified in the `gpMgmt/requirements-dev.txt`. There is no need to have a egg file in the repo. And the mock 1.0.1 will fail unit tests with python3.6: ``` ====================================================================== ERROR: Test Suite Name|commands.test.unit.test_unit_gp|Test Case Name|test_is_gprecoverseg_running_succeeds|Test Details| ---------------------------------------------------------------------- Traceback (most recent call last): File "/tmp/build/94afc7d4/gpdb_src/gpMgmt/bin/pythonSrc/ext/install/lib/python3.6/site-packages/mock-1.0.1-py3.6.egg/mock.py", line 1201, in patched return func(*args, **keywargs) File "/tmp/build/94afc7d4/gpdb_src/gpMgmt/bin/gppylib/commands/test/unit/test_unit_gp.py", line 191, in test_is_gprecoverseg_running_succeeds result = is_gprecoverseg_running() File "/tmp/build/94afc7d4/gpdb_src/gpMgmt/bin/gppylib/commands/gp.py", line 1635, in is_gprecoverseg_running gprecoverseg_pidfile = os.path.join(get_coordinatordatadir(), `gprecoverseg.lock`, `PID`) File "/usr/lib64/python3.6/posixpath.py", line 80, in join a = os.fspath(a) TypeError: expected str, bytes or os.PathLike object, not MagicMock ``` --- gpAux/Makefile | 2 +- gpMgmt/bin/Makefile | 17 +---------------- gpMgmt/bin/gpmemwatcher | 2 +- .../gppylib/operations/buildMirrorSegments.py | 2 +- gpMgmt/bin/pythonSrc/ext/mock-1.0.1.tar.gz | Bin 818644 -> 0 bytes .../mgmt_utils/steps/mirrors_mgmt_utils.py | 2 +- .../input/5_01_normal_http_param.source | 2 +- .../output/5_01_normal_http_param.source | 2 +- 8 files changed, 7 insertions(+), 22 deletions(-) delete mode 100644 gpMgmt/bin/pythonSrc/ext/mock-1.0.1.tar.gz diff --git a/gpAux/Makefile b/gpAux/Makefile index 52d0773f375..0a63fd58fa6 100644 --- a/gpAux/Makefile +++ b/gpAux/Makefile @@ -142,7 +142,7 @@ endif ifneq (false, ${PG_LANG}) -CONFIGFLAGS+= --with-perl --with-python PYTHON=python3 +CONFIGFLAGS+= --with-perl --with-python PYTHON=python3.9 ifdef TCL_CFG CONFIGFLAGS+= --with-tcl-config=${TCL_CFG} endif diff --git a/gpMgmt/bin/Makefile b/gpMgmt/bin/Makefile index 3c29c6be68a..91d17426b89 100644 --- a/gpMgmt/bin/Makefile +++ b/gpMgmt/bin/Makefile @@ -83,8 +83,6 @@ install: installdirs installprograms core PYLINT_VERSION=0.21.0 PYLINT_DIR=pylint-$(PYLINT_VERSION) PYLINT_PYTHONPATH=$(PYLIB_DIR):$(PYLIB_SRC_EXT)/$(PYLINT_DIR)/build/lib/ -MOCK_VERSION=1.0.1 -MOCK_DIR=mock-$(MOCK_VERSION) SETUP_TOOLS_VERSION=36.6.0 PARSE_VERSION=1.8.2 SETUP_TOOLS_DIR=setuptools-$(SETUP_TOOLS_VERSION) @@ -93,8 +91,6 @@ PYTHONSRC_INSTALL=$(PYLIB_SRC_EXT)/install PYTHON_VERSION=$(shell python3 -c "import sys; print ('%s.%s' % (sys.version_info[0:2]))") PYTHONSRC_INSTALL_SITE=$(PYLIB_SRC_EXT)/install/lib/python$(PYTHON_VERSION)/site-packages PYTHONSRC_INSTALL_PYTHON_PATH=$(PYTHONPATH):$(PYTHONSRC_INSTALL_SITE) -# TODO: mock-1.0.1-py2.6.egg package should be updated. -MOCK_BIN=$(PYTHONSRC_INSTALL)/lib/python$(PYTHON_VERSION)/site-packages/mock-1.0.1-py2.6.egg UBUNTU_PLATFORM=$(shell if lsb_release -a 2>/dev/null | grep -q 'Ubuntu' ; then echo "Ubuntu"; fi) pylint: @@ -103,17 +99,6 @@ pylint: @cd $(PYLIB_SRC_EXT)/$(PYLINT_DIR)/ && python3 setup.py build 1> /dev/null @touch $(PYLIB_SRC_EXT)/$(PYLINT_DIR)/build/lib/__init__.py -$(MOCK_BIN): - @echo "--- mock for platform $(UBUNTU_PLATFORM)" - @if [ "$(UBUNTU_PLATFORM)" = "Ubuntu" ]; then\ - pip3 install mock;\ - else\ - mkdir -p $(PYTHONSRC_INSTALL_SITE) && \ - cd $(PYLIB_SRC_EXT)/ && $(TAR) xzf $(MOCK_DIR).tar.gz && \ - cd $(PYLIB_SRC_EXT)/$(MOCK_DIR)/ && \ - PYTHONPATH=$(PYTHONSRC_INSTALL_PYTHON_PATH) python3 setup.py install --prefix $(PYTHONSRC_INSTALL) ; \ - fi; - PYTHON_FILES=`grep -l --exclude=Makefile --exclude=gplogfilter "/bin/env python3" *`\ `grep -l "/bin/env python3" $(SRC)/../sbin/*`\ `find ./gppylib -name "*.py"`\ @@ -125,7 +110,7 @@ checkcode: pylint @echo -n "pylint_score=" > $(SRC)/../pylint_score.properties @grep "Your code has been rated at" $(SRC)/../pylint.txt | sed -e "s|Your .* \(.*\)/.*|\1|" >> $(SRC)/../pylint_score.properties -check: $(MOCK_BIN) +check: @echo "Running pure unit and also "unit" tests that require cluster to be up..." @TMPDIR=/tmp PYTHONPATH=$(SERVER_SRC):$(SERVER_SBIN):$(PYTHONPATH):$(PYTHONSRC_INSTALL_PYTHON_PATH):$(SRC)/ext:$(SBIN_DIR):$(LIB_DIR):$(PYLIB_DIR)/mock-1.0.1 \ gppylib/gpunit discover --verbose -s $(SRC)/gppylib -p "test_unit*.py" 2> $(SRC)/../gpMgmt_testunit_results.log 1> $(SRC)/../gpMgmt_testunit_output.log diff --git a/gpMgmt/bin/gpmemwatcher b/gpMgmt/bin/gpmemwatcher index 6569015bc09..ecca0eac168 100755 --- a/gpMgmt/bin/gpmemwatcher +++ b/gpMgmt/bin/gpmemwatcher @@ -136,7 +136,7 @@ def launchProcess(host, workdir): # Now let's just quick check the host as to whether the python version is >= 2.6 try: - subprocess.check_call("ssh -T %s '%s python -c \"import sys; sys.exit(1) if sys.hexversion < 0x020600f0 else 0\"'" % (host, py_string), shell=True) + subprocess.check_call("ssh -T %s '%s python3 -c \"import sys; sys.exit(1) if sys.hexversion < 0x020600f0 else 0\"'" % (host, py_string), shell=True) except subprocess.CalledProcessError as e: #print >> sys.stderr, 'Python version on host %s is < 2.6.0. Aborting' % (host) print('Python version on host %s is < 2.6.0. Aborting' % (host), file=sys.stderr) diff --git a/gpMgmt/bin/gppylib/operations/buildMirrorSegments.py b/gpMgmt/bin/gppylib/operations/buildMirrorSegments.py index a071aa89e83..1eb8b6dc334 100644 --- a/gpMgmt/bin/gppylib/operations/buildMirrorSegments.py +++ b/gpMgmt/bin/gppylib/operations/buildMirrorSegments.py @@ -565,7 +565,7 @@ def _get_running_postgres_segments(self, segments): return running_segments def dereference_remote_symlink(self, datadir, host): - cmdStr = """python -c 'import os; print(os.path.realpath("%s"))'""" % datadir + cmdStr = """python3 -c 'import os; print(os.path.realpath("%s"))'""" % datadir cmd = base.Command('dereference a symlink on a remote host', cmdStr=cmdStr, ctxt=base.REMOTE, remoteHost=host) cmd.run() results = cmd.get_results() diff --git a/gpMgmt/bin/pythonSrc/ext/mock-1.0.1.tar.gz b/gpMgmt/bin/pythonSrc/ext/mock-1.0.1.tar.gz deleted file mode 100644 index 4fdea77c71c352e5f83c0acb813026e4cd7396f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 818644 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

-Eym#cOP#p{AK_sy8lIHfutk(;%Io4ro`HqZ#x|55S8Ph9->D5yElA(=Z z{59Pl)CXTD9B=3oAs&XroAAb4${TOP8}Gmy@4_4J!5i6;Ig9XGvj`fC ztg)jxo=Ak{kd%yjEXi^4}ulzeC7>kEh#>*3<2WQvN_L z6K<|eX7M9O)KBD`pG)mDoolW23j_Y#?!doN1HYAOyYh7pir>+V|4^Jdlrg7G%9zup zWz1=_GUl{-8F%B)(T%q#v-VGE4U3Ltgn!F2X}(jL-I;%Nb>=tKCe;5Q$5Ce%!$V?p zVKM%nAl|i1i$^u!bR!wMLx#=F0cTH%!JOgpMBg-O-x+}cr#i=cX4Qm~A|%>WYU+gh z{UTu`J^J*<>?&#%Mr#uP&7$fP#-DP0Q{{h~)%#<8YnnL6E$e%TxSax3)9KIoTy z%XqB0%^GXAF5|IAKDD8+*oGsqAGx4^nf+K-1qLt-=_8CF1F7twvb1UV;4&UMwp9>^ z0HPNVhXUd-Kpc*tLpCk}Zdc}ZOj;0<{UGS2SpDPk;Rp>sq*MDN5T|G z!7*tJbEuB5EPb`d4~hXrF$jvepqK}W`Jh)5B^lp zi&8dHMn=lP>#sCek*3*LYJ2+(n(YA1c2t^;gJwHHv+>Yu0yNv%rP)NcX1g$*UCHDm zO|!8s&9-v68(m%O#tlrS26hML_6ko)<2seP>wnL#?rD4GaG z3^M$q7UQ}P)DyIs?6<)F9qI|H-q=HWHX7^sDeqarnk9wr*x5op&&)UdYPq&)|0u_! zu5m;=a`_-6Q)tUKl3M#lC%Ov3+Qcgx@Ox+RTL(=oY78uY@~uxbhWX+Wj;DmRydaxx zldA@F{MB(+v^j~1HJWZuS{sGU<~_<{Sl(wQxAkU(+?%*V zIIk9pDu>uNqh(dYOm#MV;hjRn?G@b}ywyy&O374hPQK_}ENpg`MBJ0nh9d>Q6hud} zh}VQ_%!yqp7Bgga^^m*|R%CwkCsZFwq7S9ehvuOVwW1Hr$D{vl>(SqaNB@8hYYPpr zfW!F!3a0}RPV1<%kij$doo;;7O&TmBG;8^`BK!-Ev`qT-k>7&MnvjOh}4@A zskb0fZ*@iLZ5*j`>_VgBc6P)aWcE%iMz3|nsNDIymWPM9iyOL|8oCGg*H!7>H2$lo z{(WWIfiU-DN!$+|9#A?w2pt}R4i7_zN1(%_E*(~vS=q>4jf=;a#^VIz2~CexE#oaW z+*2JhTItBM{Nhs03&5iluF>XOnf%sbGBSjaAC6~Py(yAPP?rkFD6PZ};`z+;hZj^7 zyoe}x2~qGeqTm%o!K;`*JZQ}yUc>xhbFdY!vj^TFE#B0gF7(^C7{If3w7yLR-_f5g zu8RcTMXbK3P`(e89{}ZtK=~0+evDXs7P0zCSvxtMK4q+H2*PJtq`sYDj^NDH^f_1k zf~tO5)?PxVuhRH_O*OvBFbDb;Jik*szX#7B!1G7&{0TgNcJchhJqP-gLHU5tLfD-Q_9(ZxNeF4a)4P-C$yIw%)!yZr?;ORpN@LfDYVRH9-&99X>5(WclMdMGq2gTJ~} zPmRaM!*e{EQz{t!r*<;sL{d6KeyH>E^1WPL^JMYnpj1MZ&ep!`mAO`#bG(jY?kWvU zZ9Ek-|K-urr!WXt@)25nNEp^Kf;ordTjJ%bKqzefhV)5z<1tTzk)+vNKrZ~r|Dwv~ z6fK&F+XSj*7ZS-T-XK&ZhYK?8as480&P4HBwPDgrSJY#|Xqwi(Oqe~AzJ`Vpo_fPR z6x@U|JOxqrNoQGdWwS#pcG$Hf&Bjwn5Bpw}lxKV@mZ~T(LzI^z$}14%V-e-sm-AEc z5$mbALpeVcW&g3`LhQ)lIF4dxC#{cZWyUj@qH=50nLx#NF4yLB?f?@L(KB~Zn0E!{ zNx-}tFi!^N-O)3p9f^2Kxiz12H7=$y>S+XHy4FD_l(&~eW(HT8NmXW*yOYSwPUBcf zCHE+|5BX;9E@Dp*oui2E1)_U{=sqC2FNp5vBD#OMb>1eE1yRM&s|ip@V*qdP~xQA%+6B$ZEPQF+GX9*Y^}A!Pngja6%AR)=xRlcPF73OSS_VuM{3h6ee@Pbfz;88 z)G;7+EJz&(QpbbT2`*A6mRqR{bMlBY(m0(- z#m*|voWkpDP&!9ZIv13dfzo-Pv>cSqcTrkVo*{+T1&r`QGJTQ8=*)IUsEfJEB~<0o zv=QpEG+vie$t%j&lE~{ykXxz9T?KMigWNSBcP+?W=OTA~d3%YxZeX}K5{R2LhL^h- z&XjkV|LqTTaWmV$h3wx75&j`tx20)+JDI(s+&-L{X_g`Gg#LFa{qKhU_dx%9q5mrA zf1gYL`^&8}M(OQ~2Uvp#3Cu&94{mQK$~@v>uJQ;~dDInU90?y#@pAk6&UU9w z;t9}wQqg@1be{&@XF&H^(0$HD_j#tfO&VRxh^0rf>K)>B!ubYpt}@>tX2oTW8*M{h(x`2Wh0Qj-bw*8+zZJ>_SGCwi zpJRC`R_0!p>scOaeIsEOl?VHq<@ZB5tXVq%X&u(J&Vo(8IKyDhL~3MmruvXvXT&?P z*@+F=cjZn|WiCPM%0{S;wvV>PZH%olON-e~xZcBwc?6QzVJ8}WR<`!28Ny3T&XN#q zFp!JPA+?LJDHTnIo6T2jkJOi%sfi~Wy^V1pl@ds}wR7b@CyjT=!%1-c+2YO2 zFB5O6PWm=F={xA8@1m2whfexFUM8NlUM4=k%S2O$jT|82L+(!>QJj8^INkU#K4D2; zw};733DKJJ_7@F5!{GS2()|nQ{v~w(3c7y{-M_)$_&Ns1Z_C?RH2jW5`JN#Bpbd$i zx`xEl@Ob?9bt>^AbNGok{0tfY#dv>7i-2DV`fvJl%r#Po-w^_Ts1WE-feot_*sxlG z4XYK{uv*~^fh{Ur*OIBWMaK%>vsyuWRx7kUtF9PWE|U=b+lQ>q%*I1(x-gsn2J)^I zT3lGWMu|sv@K|C#R;S~uecF~bZNH8D8sq*(R*BSRa=A zZg-8h%JVd|SIP$9K4L-r2}cC+b(U1{(I%htZ6*BbZPqn=r#a{<)7~sjC@Vj9$$kHr zRL331L9#VatIMd+?KGVb7#Fas*4kkdhZ~04r>%>7_T-r6}n=dUM5Q>X% zL)dis4x&dz=AEk*YUe6CXm51Tt1~3g7XKLpwwKb?>ZJ%5RS6~yYVmkzEyX3x!5Xo=|{JVOzl3Bt2Lcs2-Eg76+L!h70;RjXnSBi@S)@2wG@T9Ni~ zXNG;f#NRh`ihUTtzJy@E3OhsQ-*0OFvedJp!T=(B#WeRHf|h|JIJgo@ZCA~uDHorj2RMa0g>bNelO+i8V5yS;#z z9Z=E!tK5O;APbebgJAApm|FyMi(&2%bdY9rkV7lld6heiL+5aUaD>)97Pz`c7vB7- z6c$Uk;!>)3WQD!ftrt3qRcp3~gQKbZF%@fBLp~N{k5goi2iX%q_C%0931m-pkv*lN zy*1=h8T4rc;&hGe(G~5jlApm<&ZH`5Rk&Bl&rV}_4wXE&qTS0NmVw`Sir;eZJ0JX3 zfZqk+ccF{lMHQJZgSeQXUP1sa)!3a=k>N;?GycV8T={aUe1#T^?t)jQF^3#QkB>GfcG1DM|EVtP}BbH~fg4DuE-c&o;6rHf(z4t6e*^v--6H*-5R zb4P`}(%gQPJ9X9u|DUv7*~NTJ#uDaG*klNCSA|TK+09CmDUAArxSPz}WBys$$@~Fj z01)@m4_C<__Dr-j)x@J!s#ZeWXa0CUalia!FGt!1qPr+v1|qgeJseRPAw~mudM-o=;HmPT@Kv0)5i_ z_vB40yXjyP;wh^7w5-}q;b4T%5c_9|eK=MZmM1u?IMZoDJV(`@CyV$>k`OOQFV)t? zYg5T^G~uro@mSJ`)p_=yowgqFqWSx{c!}D5S(dHrZHXe&tC%e3Cd4Zhl(2LwA+wv- zRhbSp+c09aVH54E#Hp*OuciC4s!}2Qd#C; zGo%^uhWYQMmED_-<|_M)sd$sx?k;cYXs%L89>rT6Ey;MT2Jvm#;1=fZMVoksq>F}P z4Jp$XRWd7^cvt>xQzItcBg=I%_f0a?)GXcye)3UO)O>D7#Ru${u2nLbjrnY)3F(Ja z(9;--s$w6>Vp~*p13tN9+64WvEY}#BS~-YT@T*KJakUy0aM{T3cK70=g&P>1O*$K@(p#J;lf zrr|oVwfv9nCUHF&wizpfVIU6%M%19eioS(fLqk8J)(u{wE|U=b$I5YgfNXMW>O|p~ z{GuuceIq8FS|-3PZ zv?Fw^%CI67=mm?p`KV)j@$SV1V zOb;FDlZ)KRH0h^Q)sfZm51G(9@_`K%+y%0FaI>PUtBLuRgyyd?jSDYPSb z@()UJJ)1ICN8Xoz$TZcFN%9Yw?>h3cOi;bBaUSK_j`Wj%$TZrKXXGC;>vd#~{6l87 zj#SD&Wb*3BQ2B>UY8~k-|B$J=BOdvO%!M7fM*bmFY)6ihf5;@(kwfJlGW&MqT=S2V zIku!~%m+=9@*7w2OlK&$XV_SoAJm+AnA5@GV=*1vZY)p#MvUd@;K;Ew)N>adC4aaR zU5GvwnU%*%8=dV5#%PMTF;q)NwiygLWX&f_*2r}J8{vPH=sVXR^yl)Nz%TogFpNY1 zmzt>``~@39^M6GJ1@w1uQ6c@En-`?NgSmypxq0~=%zqaY1@nW2!J-bqyxd^0u!A?a zF$74-KI!##XbPL7rx9(pT&S)o99suT^MBUg|B?SK+SHzx#>^>N!Xy7FM@>)5CfSQy zHeJ}VSyp9d*&C8=%|@bS^Mx&2Wbq+o-KLfKufo&yuMAPyDz0pMskCcENx$O)zV`s?Qi1KdyVokhB~!*rKKk~QJ<=7 zFj{&odslag{Edb>r+am7F7! zLQF4|x^ys8=v*U(28`_j;sflFykVQ#9)>~l@EP2s5de$X;#X*+45 zTLv$s-A(N^x9!waWiQ95U1z?awG3I<;x*r5Lc*N4s8_+3q5HKAbKe)yGTd=lM9X#= zZ;EIcpc%)s}_!1sk?J{9;r4*W5V9&?&Y+H=6v1er; zY80XFQ=y*M*sF324)pxS-j!YSFfVA_s&X?KWJtop)wu_qL2ltQie3y*Ekp zi}sLJS159Cnpi8krlNKQQ@etwU6oin8en2?mRLvj{{$`2x`JsvHnDDWpeB3;v#>&A zVRfQ^v^P?^!lLxJ#DGGVXqcNP21ff8t7wZ{v>ToeAt`E(uQ9iDhh`Z3z{(qQf{e^t zb(&kt$Sku_Ci6r&vwnF=s`) z;cNrAYP81O5ffo^ry6s1VvAVRPfzV!WA2g|7|TU{FvVlene3HSa?fP$n(!nfJ~d&t zW;hZEn!8DOYCFxkaAG3H58Mm7J;#p;HsGdUHvA^9JDE&GJ(>QH@oC_H!r5n8W0w1F5L z+8{&)%Ys3>f*G*BHxu4^enUCF@!)E*qJ#bc|H1d+GW?SqKO~FWKhrB3z4eK5^k`t? zbb1*sB94Ou@eHVP8mTgmWFeWYxzjDYOHvg{)bh!X=q^lp?X)XX)KLjpG4#8HIiu#TU_|y^~T&k6B zhZmNy2Kc%qnMt4)q54=xCd%1ZMqN6q(p;22gwluF(rvjGnSo8Wvo*;4s7p#3bd^n` zkYM6F_K10iM*8lS#O9$u`@=9;9uAy60w{bWkohQJ@6kZZwG=Ink+l48X?3hL&~csS z@eqkY!-MHs4lu(Bo#u&Ph9GTx&){OYD)S^8hXg8rGAe%xD1Ry_e;O!%Iw*ezD8H^! z{!FR7tFE(T>t}bG=RoUF?+FFzQJ-sRF|zmqFle4DB|ERvJYO+NnWTqS%De#Nx-c9K z(3j>#d~uHy>|zk{5|H>(koYo?^Ky`LfRgiyye<{$tW9Q()}VQ%Z2qcF^J)MFMkjUF zFlwP!PO4Jl>T1nvq}1mrB3V_N*MiK~A(q#JWH*4IH-gAFfs8jx8K)`{Z$Sgy+G*Yf z$U%iy=@z*iYq^QJ__PI27)~fay|iaJ_*u2m6Mv>3er6-x#DQ(8OfAqJI&{m z+3$y!g%UqYX!H4e;?N7Jp!tGS=fzI*B`{j)BCiLvY-PS2wLyuSuT1WW;!TMLsABU~ zfaW#pnjG`>1giE%A{+zl-URL50`1-g?cPZQVmVOmUF$kRVAFe@=KCO6n3fI9U$}6x z0C4C7n?ngC&WC97kD#%Sq3usVkWZo6&vfE^j>P$*)BF-l3$?tb6Xz?er=5 zsO3AT<$EB`K&aw}a02M@W2gBO)ghnzS<&McYxMqW;*r^d7QqN8_Zu|vJ2dtOwEZWv z{g-S}bb-5$q<~+@MnzY+mZ(`(E<9cF{V$xR+9`ZpVK$Oz@gveAA-Rx{Mi+i85TF9H z2QSj}fUYQkw#e9D$hyGD0uG9{uS4n%B|vZy#Osp4+M);ibB7wy6Fz6wh+gn1_2>CIl0}GHT6@EYUc*t)5jMS=hjgV?3O2(kvCK#|-~gRrg)ApV zS>&SjnO_?__%#~l`;|Il;BynC*e0yermRsFYqS}Bu1ORd>!w&WN;r-s#2a#Hz`t-; zpfW(U%?nU%3&nx)EXtM)`UIAGD;8~Q7u6;zs%?W}ZObg6Ht<$AoobU*Guv@9lewAg zxtS^4%v7dY2-=utQEfUlvV-1;taXM)wV8@)q_3DoR2#gA$i=0jEXIy3)=q4o*(~nP zEZ#0mxowzob8O0SO}i51YEa4}a&@p=yR%$-uv~jGRo4TdIxVX1 zg;MR!RGr6E-AAM9zCcxL@?7jkOkHnLSr-=GpM^Mpg*uSUc@PVGFblVUiJE1i9zsO5 zTRoI`dKgN3xW?1H@_2d#mN}AfUVqVf7a}ZLjiv^Tb;QXi>nSYjJlIIVBdIp$NXi~N;ds3R4uLmt5+emmsc}zH zGS$$MiyOhZDallF$|A=Gs+1&GM4U>L*9TbQG)1k`S*tVHif1waXR(%NGqr{&&Yy!% zHqV~0d=wJrlJ(C+w9aR=mRIE$kYk;U=0Tsh5Zk$k+ri=15<@C3W>>mIbEQkcm0*0K z3X03fn-(>OvC3c0&|kr(xRQx?6`Sa4Hpw;YP$#oPT}uw-X!|-s^?KCy2F<4~%=4)m zvCK`3$fCzG77*fQ+pSL4-0BvGTipt7rBu5OKF6S2-Ok$G!P?!)+T8`8eaWrvCc8D` zP&*>^xd&yvmu1CoE%PeByAR9U&t;y+4LMHp;=~rs;x|gQ49upaT|?oPSO)0SV!%@N z%HhLD;pB!|5ua>@WpqI}(~UemQbuPwX|FakFs<(vuknq`U`8Vd zi-%IQKd_}Elx|ICaq;N`1-$w}<<$={s1Gxh9%1|+Wso0Zuij93_2X8j@dU#6B*Pb8 z0{FyJ>=sXJZt;xjVXzYMEcwI$%_j<0C!S-8pJxqTV7k1>n!UuDyv)vUA3MVT+}KZ^dWrqCKvcfxxge4XL%7+d`zf(f*OCy8ZX}_KBL%spB;NY$JV~!)x$oILKd^azWb^#wqTJ6!Id|*75X8Tt z(!XiM`#g_$zhjv{v?2TAfg%1ZOuxSz^y}i0^i#@pm475gA^kia($DK5{d^wM&kvug z5&Z%lrr)rF+*o*sD)Ar!-8`UOcMoZ|G!+Fs8kLOvNjX?l5EMN;xSOvhHrI=rg9(iB zGI@|$L9Pwvz+rJT-Q56hkknrKmKJ?+1$>38RGIP&x<4+7?;h2ZJl+~8m8FF&^&O#Y;BDrXxO_pxvsJ<1&`=#u zxEFch84Ot*fwd3y>e)zBGMmWN(-qy?8+N;ObfVrK)qPA&Op#6`5fptql~$dw19S%;8Wn;D;e7$abSey+6q`dDNGkBWB^unqAK z`-O=pWx&E5fyx-jp$yzc9*VGtyu_{?K4J77h z*utYS!||xZmTde@8Jr0oyBFR{{u|f5EL=IUwFf)qF?Pqiq-u(ZEb}(3!?sMNNvzv; ztjlCJ$rv`t_T+|(A>n#bsFQ&g)^%FLdR}crx7@%O)FwD!f4?v!k0fgpY)V zPRG1pDBXELcjWSwevoOFhgy?(B83*gGI%_L_BVx5`z(9ADZVqH&R!Q8kp=PAj zU=3HKDV=U=G00f7fD21!hQSL~oLQ;y_7@2fCWV%bUf%)V&Pl z?q%^B68kY5_Gfk+z@hX&X3as&l7n3=SwJjt%A!;ihmd6sMO+Tk7_(#F2K#F-Pk-j&gJyM?=SaOnyZfl5EnSIZM z324~VVa$t!wxXA!R<7PIU_hI~TUoUXJDy#ZbT1O3S52ywAYTnAs7h$~@d+e7D%Yk6x5)MJ{4<8 zT*2U9$;P;fJ@;xh(lu<9YdKDx!g1<4k2OuD3v)d|eFH*rqZXhp$_r38VVRp5wvDYc zcL|{qx7dN|6fIEQ>IhV~L7-B)-VUFeVxYQ%)xDF|y^Gbo8$SC{pt?r|s(y|uq8*Me z?j^d@f+e}zD(Z|^xq*w-)mg_AdibbV3{A6&mjJ%!leA!LCRl%luG4a;d3aG@;BD{ zch>q3*7{HQ>_(*gOObK_9#6ZF6hL(GA_iT(pr6NUFDqO4V_vVDXg;jL@3r3)FJ^in z0$yTKiPvUPH~DYew&<)wboU~SR<~)S*Cv8q!mEduDALnQVD<76SiQXjRv)jEBCB|j zA_W>;mGD^&wOie5a|HBta%2rG)0YugQ;$~;mBpIgg7)v{)$PBQ7dF$gK5N70IJEyd ztkSxyQh!!y0DSf*`w#TGa`8bZTFC3n#ZOVWcr(8pSr3a1=3h+NJD!8a1lj2 z{9oa;3i1a!EH0Vhqu*gHIn-L4F%*uph0O!m1Y9X-Z8B|1&ZYTlItiIt%Ouk6sSut$ z1`P#``EbZevay4I$Ft$IWgoDIS!NpXko+1t9hhstv*J>CketyGYK_e`g5a!%h=eAk zXzy(Ut|sY7=Wv!h3!7|X>RLfK&sMv9inpQQ6*Czln9Ra<=~$`*k8Xw<+GD9K?U+cV zL%FsJJbEZZCtu`f*DGm=d$s|jmP}fX33GHn9>w=aFzCQuT^~yD$K=pXKC33}heyUl zhDXE@ub!qit2Z|5dpT3zfGM*fdq*j=E6fxs^E%(y4E3rvHX9)^%9$9uuO!C5NDNUy zu@{_GACN_qnTN5NhqIYSu$e2_%p=LnleYvLkMh!BY`ZSY)23o$3Y(*mH)FhZ_OTq> z*o1J{2!mZSPx)<%Emm=hJ@B|zi(g_h?rO#=tg0ESag5dGjMWy5)p+hGpb>y;OX?_K zkD*nqm_W*Ig-vg*^%0w@KBC#0?z1 zC)&p)rI@WcckBA`ovD^xu$DP2w)N|-4mV*HYq0EYnww~mOw_WTbxO||>silwHn5&? z*3)q5*=W0oeM?*uiJ8ErlbW(MmYZ0*B~bc*D4;fzU~^Hh7RKZsm7rC(k(wM$p*(4p zXSh3fE>1?!R=BG$m0bnfHN$qzvR!j**LmDkOah~}lTnvSkog302dcC?snpEUrM$dE z02H4f72g9(?P)W_nt7ZG(swH9_hRYyX6g4~>Gy@tu`y6!KltZ5G0VOh#Q&m=&LzU1hh#lp>lThxY;R^h zUw}m}WIjVmH6%2V=ly~Vl9~q$YhqQm#9Hg)v8qrZHJsv9v$$o!MXFyw_riJ?P&ybK z0%>i~vg~{`?D$ki7Vc1!2F|ZOGCmcbf#xkBkN!X*gF*{4;GorxFckbp)Pq-?L5;gI zTWclu=2sr%0>a4TTCznI#1g2*q7?pH^%EDl<4Us%Bo`w)IY?Z>LE=&l5|?q1xSWH; z6&wb3QDNXp3Ii*ty^`Ah7PYUUaC|k!+H16Me1SV0UyDVq<8b_o)pb!)t2!Fq`&%8N ze?;ilaA9ti2P2V4sQ7=HR<*T!RYi3nL>IFIW0{tq3)7#_P`kcpK)68<2sd&-xQPS8 z%^VPJ;ec=}2Lz!4!fg}~{%#FX`cKdg+)O#%Q4a<8F zRcuhS7$c!V)fc%pI$S2+cY|xW;|B%CryshO<-SWG z5CRocc%U^iu!*L^;Z&MMIpkU46~^!keN-RINz?)MSj13uz= ziI4c+%}0Fi?jycmr1&26A>UUpGhD^|_4R8;kT|qYp2TqHaNnDfFqB zLc*D>@JG0;%1S90GmXWx)0p1|H|Q)PlXYgZMN(KSgeRMGCl?-}WvwJ+aF)7UDkOar zw^HL~e7q|F_EwV`!SNZsZDnh?1*Qt$LR1w@Y;h4ayoaSW#VSRqx2jIP)tGv#GxgSB z>h)#nt;y88Qc|RH6fZjgWNMcm?bG= zNrti{8!?f}nMjrl6-1i;r6TaabPqs_L|9ASjptP`-vR&3Uboe7?m+1V|XEq;1u zDX@&09W|`W@E^O4-quB(V4~gwZNmiLmI*$I3BDZ@d@@t`Aw}WsiNY(n zumW*m3OW2#^yX=r!%uKK{B$g`13UcDg)-a%hs$g3)V6QDV>3 zi9L&n9c5zg$i&`>i9MT%{kkId&P440q|UpL0q3A~cGV0x-EF`cEV3IL@Xapyc_Jr( zdj1zlQepCnJ*h%+4wro(%R4vj>I{{aM>h+GL|PEsRR zjXN)H#v*fz<;5*38*OE9Qw(~Vv(YyA+z9hx6aLv9^Wx7HFH~Z0&YW4WjN4)N!BYFO zs^2W$^f5G8t#>B+bT8i&A~`V@4`-q4N1Q*EhLZ8>Qfd9taRr{OEdFd|{mNzh|KBvrQN-h;k)g+EfngsviI2r1$1#c5Soq?c{PfJ3Czi5I zr8IRFL8mg}j)bu>DKfC=UG}l13$3McVYOro8F=GXHA|LMTF7Y$Wg)pNMD=p6mhKm-vnnoUCf!S$XL3Mg9B)y{|rzefT8y z;gi{iPhlTEmA&*=<)x>Qm#*a9O5PRZ-RTs_&cG;jrWVMKbqBJuu*lgQ$R1j<8U8Zo z?|Q`NE$K2kk1JTHvQQyCg3qzoDKkSwu^JV{p+CS~1~^+PGZMRgjP^2^pHtNL&eeVI zJodfw+4nAB-@A}~?;`TODXVo=&UZ06-~T79E+M{Lie$J<Eo6x!c0$?yZovIK^blDs#)EVP5!`5#i-ElRp7|A2I@`?H#lFmI#}LwnmAK zcoh^ZPzV#5A(cg*FAo{1xVW;YCtRg_!qw~v*RUsC%bsu@d&2eX3H>ckxPd%jB@0#r z7TicaeiJ(I&6y(94cO76THljzoHL1U&TS^Yxbb?bvDQ_%OG!% zLH^V5y-Boq3l09Z=08ulIq?n_d6zly*78~<1fqtE>7*vhizwvQW~o;VEkcMQ?-dqT zs^zzoD4P)J_Js;s=vBkw%jwLw-z(}`@9RD62kbTaY(^eIaY5-j1f+47At_}S6?Q+F6t)V z=x*{YyUBO#Cf~E0{J?JVBfH5|%T0bFH(7z8_?fKz3!3s*&DvkOt^FGo`8{uhzU2ES z9ItHhcTE%!U#GjB?{a&KpYl5DtO{|R;*X+q_*19DUrdKCexgHHKheSCCpvijM2DzF z2cO?HLSON*^81l50Y8wT#BcNEH+S~l4U2U57s=j(eomWvFpNF@1aB`trOmzJvjVgC zKJd>Tn7zj=a98oG?0r>iX*FsIZvmVpqnUu~#8XClD4EJ+W2puMulk9F@CJCXx*u&0 zLh8x<8cM3ZEY+GURX>($EjISrY;0Seb;#I@*ZjH!V}F!<07>4=GJ!e{&l`xP2C;s( z<|n7tWFWoQ3~N{3N5GEQW@#B*s{uXG1o+b){#swTw?O1wa9{9UXI?4V-Ro{%z4Q#Z zfw!D(J%4`oKiKce{)hPO?0%?9j{8?wzx*+yZ%mi?FcA^RWdx3d3@*n$m~1%RvM6C#tW|-!o1KqqDjzvZ=uLgMvFD#<&!fp&TDFNDxLWB}A zEFYPf&DBrKWp|R+oZ?cgJXC5)QCbd1>fq3;HpW?G^(>Jy%7R6t)@J$(AYmtx<6Bz7 z%ZLmnkP7&`Byuj4wZFxbuz`|Xwi~`GotjP=TsT~6@T3k*+QvjvrqsPIO0`xdDvLVr zNWa!oj$+5$m>qL8JLVX6%uU$!QkLs&O0Kt(gDW|>C=OOpeA^6z*H|sS4R^=4YAiC& zzmRuIR%l-M^05MdTHOLaR=8tOwzS&Ork$58#!t{={N_dda0}fJ$Fm=9$$mJ2{ctPx z!>!p5_qF_RqQCe%r4>}gC{krd zjZNG6UE`mfu*mFUK2+vwV}!e{RK6Dc125*~HGWXO5@gZr7Ay#PLePbZDsTD~CD{IfP$u za9gL%+}E*8nV?gsNNBt|0U<+YhStHewGHW9DqC01e?bpb3zyf_(Y49Exe(uC*M<0a zh|s*4NTzcc8T1E#>%p>a(?Ie$@Bbt!(Th%I{$wX*ABw9)$crla(4yl9t`T93~DEX zx)+1GH+#TIT>;X4{B&G#-(nbweTne{ir!hvB+tG>tge zPmEZggg=CZKa_<(jDaX>CeID&(%;k(VurNY#AuExa=3_QO)OL%@?p@OIF2&g^;=k zE4-L1>-Ig<8y6yOC-$4ByY+yRtW?h*M# zlHetj;AMv3?`i549ecwu4tN!te~p`eZ5bB>6k0p(__^5H^JS^SKA#|OZG!E#p>frr zO7VJLcA*9XZxoo2ebYT5`<6B#`!*Bs9Ud^e%fx(-iTJ)gA^QPN$bM)~$bQ7#>FHKN z`7sgo|GNb~A=ZD2wEIl+yI0*K)X%ZV7tG9S9dF|$JYjr^i#J`u$@R#3O1+zmY=*bv z!{POCE2#XvJ=tKCxn|kYh4+v;4Gx5WkvUjx2~f*kK!j8xdQuG>YD zvQRYyz2Ay@!SA{k{J~!ECwswP>;+u{Ck7p$1Dcmv1+UjVNx3)n39 z#m#~M7AXnvn$=}q`|Q|NTlfqb=TS11`D>D$VEiNJ%y9G?fy1P5rYvGDQVvx{M7KaO zmURzkEDHvRWjzAKvYr8ASubW;Z)VxO7R&k&%T~f(5cXAw#j7GkSJPMwq;<@au8u|4 z2o#wm?Hk}R&YEnIer&0=0(|`(d{*Kt={oSwRdAN{Da%gl2GlHRe{5+0`^y@9&rPTy z5lg0|)I97K1Bo#pmp&~zNC^^RLDpkI2D2bTm@4ZtRcsM9AgUB?aYF*D6y*z(e9bII z|A5Qu%dpf?)}o~Al4Qo%-bnbxxii+WEI}>TFZAU|y&m^s2IMTALR*@*Gf4ljJb!1d zwr7rO505AhRhBsfFM5O~78M)04QIJ}c_4orQxR~DVZpLqhMaDAYw{@;Smf2G> zl{G}G5l=#z$a$@OQa~)1O}ECf$p*Z-P0EyPN>O5&HCkmR3U`BPcid!Tjc}zBT+~%> zs3?c;F5zyam}tti%IKL{%=8#HMXFsumaQ0}(qLHxYQ|Znu>3!XjQsyf=LtQUDV%TZ zsgF=b(xh0Zp|oboM0HV@8K?J-o3lG?!R|1g-C;|1hY3vh*DbRkJ%QBOk$6zK_e93=bSe_sw}>Ue&j;d*B9Cz4L^+FS_|%r#$UMZLTWp< zP}>le1=UKMqKjGv+rr?yDd0_d}}5;&MeKhwsref6pQT0zSXzu(hM^7p53_%``_r>-TS~7-n*-5 zO>UV-vf(mW7nV|o-tJV?CuZwDu`~O`F6SyF*6=^Xqf= z=!Mr3<(bvFAG)|vT`P;?MLovQJ*JU8rinc!!5))jk7;I)`OET{x#Te`?fdWAw}t$& z6`d}n`DML(P9%**+KSDIm})9Qu<0{Qi7Zb=l4ehqrjw=Fi>29{iMbCG)0SgjBId%I z-H%|~A0<72XGd6;`3gB)%5)$WIf#|1gmdHE_rR8OZ-K)Gq;n{pl0yxdLdk)JD60|& z=V^&+f)*$(4`D42Wi1b5Ee~fck6F=oAi>r?Tx%V_TiBPve|{(>Q0^(>Q0bCHq>IJew@J zV&ZxZ5$Rl{$az}$Io8dh^RdVU%%aa+?@>bGR2oMObogSd1@BhgECkcZl+YM7m>=8< zDA1YagUc2xKT|l-Z$*&GyL!Qfj4xg&T8!Y*GpBrK*%&kkATbD7n zE@$=(w%Bt8vFCpc&nt;{S0Smc)_8Zmn|Ie>k!zWE*@bSJb-XpP?_;w>FLiy3l9oDA z!8aUvn276&65x8B05>oJZe#-7#00pR32+M&pxh$Btwex-O|jd^61OAFcW9Ql#+`uN ziAC-zmVn%?I>UQd=X)88`?xc_A3jH80`dU-a}7*DMp;NaXeA&IVM`BdeYVO3V3k6B zF4>Yzrb6j9BZbShV2@RPitq?o>`qr^@~9H?F&6W27V`-f^GP<n%N6PX%7I}fyA7rNp_RaOKeBi}AT`@m-N$L7B>-q}o`YP-C8teKx z>pI%f^$pT>aTlr{#~ac;T^qJeG}>TIEqjkR@E&m`>9M;6#;Un?5`spH5(%+S^(9 zKB(8JckRXAolq;{JvRyLV_pj6NFTU!qz|7K z$$w@l{K6sQSEj&kY~+cSk$;Cr)sBQeu-QMkSsynm{t6HyyOeMQtcWiN$(xv4*aT-u<6PO=Ln|g1>M|N|w+K>7h(jD6`0iu%maqCtm0?|8Y|HE-4nn z`jq6yuvJQ2F>KWmJBF>sj9R^fFY{ui^<`$QS)#?TekBmY)+(`L*xDsT?`_J7FO8;iODNF2A(@TQQN7K?XF#%nX#n8=Dr^6$xAqrG%tGh#b@bTT~JOUXeJZjahe zLG6>Ncv2V**;-i>>~#@S@v&*xV#dhA?VA}f9qiB`Gs|2y*^-G!%1c70;=vsu>Suyt zhY}cq%)okQVsg5g1qv*zmRiouh*>1(>asmao!Yn|DG)bO4M{0&6m{w;8XM#T8KX8Q zTEvbZ#JY)WwykQ|uxvUlTTU9;#sFYIpT9_2G!08+TU&;Soe<@$TE8tI0bUU8-Db3b zrm*|5LDs!9*4cV(&_Yi$#?EI-<)w#Ardw1_&;SK3-?nvpo71w;%B1{1LsRjeM0`J=s9 zJ~&oG3f%zZ67^G~{S8=dF8gCCfHX!e{h5fR;w|!@akL^RkdY52_$VP^pdN9fKG!4~ zvBg#3PkBJntCF?a}t)dmn_64(HW+9DV3+owMB)lSp zRFuC}Y%qLOT%^%2F~yh2XLA`wv5im+(587|+BTQuo|nudvvQ0qsG)|IbZl;|(Hcv( z)W+g*VIbleB+mf(M61K4iAJ@VHUKt@pm~kdJdwl7Nb$Cek&8<$TU*3DhI@WnTJji| zbEaY~8PQHo4(Mfa_1R=rDoUu#$2xmt(m5g90V0YH5+B?_Bl7OlqRV1p4>Wcz+gP!Q z*c1L88lz28F_5;|vMSD9*D)z_vTVo9svUiN7!~yVkNiE4G4uro34wJ6fCe1wzhCst4 zQ8M^VOc;^u{H!<#MUpWIy3ShsMN;r!G*b5_Lx#;5m~;W@hgPt`K7`y67-fZ%L!rV! z98TKX+aqlq*+e>p;UsR%8zu{9hKa+tQ%GfF^J^2yrbLVUUsfEB7-tgFyTuXk@BU6i zU2b!vEYghb(i@_3tqtK(7(tS8aWwu4qjil6#~>BfrBGnB7#ON>ENBIWW681DM(8jZ zaU4eNZ5(#{Tp>RC&NQs zqTXaYBTm7Pe=2s<)2a5#cx)8?Dtqk@i73MXDn45JrELz{nqABH!- zA+xW<7KyDABb$$ae^$|jiKCi-hrc#%_QS^rI(v3Z^NsM=Ms!2Q*ycT;r83&Qv`KR% z{1$0`5$fHnxfcGaq}4*z&C}t_(U?Q#q!Z@qWkk;A5FknkPD4#jhYos*?4o6Id4`&o zJCo<(&f)~~Y>J7*<#XW6$&hEB%X#K`kf=nv+dc95Xq*f1DIkHw?LutrB1~x_T~_|L z;`|4}s$xWBcw_|SAQA9jVHlZV2CrRF-zcw@pJgb!^aFC zJ-Unhd(`ORBjul?y9}?Ce^qt~4gV(q$Uzhcg}SsR8xk?2rD(ZWyfv9xgp%?<>vIM9 zZy%4H2gBrRCJ28*oDP~@%l0)rou)S&?G8Z&=4CUcuhaC0XRpK5p(R{a_r;4<&A`;z z>vM^a3{D*DanVyYVI)N;W}R(gmQ0;J0FGZtw?Snz;hM|R0h?+=huLi^o|~kaR6FW$ zfM<4}N=KXUk1!N7gHvY@mETGJWItQuOkvSj5hd(*=qqFh||`Qh_yDzd@F1AUJ&g%Vga5~)0h)*&|FA4klBZ7 z&bB8ruw611kF`mx%vBcP+0hLNgXFf(|DpXc*3`4P>Qp>ptrbSa2)MS_1rHvzPCzkN zn>u?VSyYJ?kz;+>L=%BjqKOobU_G@4taVIgJIvJ=%!$O|8HX3^ z8FQ@#cuJHqVlGvm&ZVq9ljhn}XLpl7*VZO+9?x7y;$695_CS0Du8K_q*7I##6k6uG zQ+2CUSXSx30Po>Z4Ymo%8;PR)Wx&+gn*acE97cqKo1d%$3y{T5Ucu5G%?Jah&JN4x zZLff=eJ(8m%ydW&v}T|=X%9Je6B%<50WMR;EG!3NiOdk2-Ey88puqlej0dG{1 zA?r<@y`d~B^6nH0Nupc67K$~j@Yp__cY)nkatI&aVk+S?5zy2u zotlfT>PT(ka=34XJIyjVCXNX>Ete-2%%L^rM$z7C7J_mavs?~L<1jc!-kTM2xZ;=q z!TisRO!h`gAil{&#vImZ4i6^+(REn3idcnZ#tMdFM4}|RKK7e-XseKL(0p8z*{1hXVB~n0ghCkXDgy ztU$R`NE@B#8SR4st-=myV-mfhy&#HJSmA7wMDJ)&3uc?jSOy94NV6)@2mUd_+$^z5 zv=2wH3KhY|CRUBEr{Y(IiVP$^D-7(cPOKIkqWn=J)nVyhkxW%+jx#Q?dUPWtMFq#M z3N3b3U@a9^?AkoBh8*@;k!y=YUn!)FTNMzuDkyG^Pplc;ppa}<)T&TXYs*Bx=;|tF zRlq+gFlLz(5^F_!sd!a^@oKBY+R=W>IvlMkRJ7VUu};(nk; zEo!+-1xKf8i6PN)6`R1PDj+shU|^8usKD4%0R~qNIX$s{bO1)C3XV(_5SesO+##_+ zv=7In3Kf@TBsPq8lToPxqteVoX>^cMhGP=xK}};!nw5)olcs8kOWv5#8gs|6JAI;w z$Dp~BOrB9^h>J7Oh^4VFf`i|lX6iXObVN( z9GG`gxuq!*9y#MXupE3NQL(4H20N{$u^|)`{f%S=01Yv{!;Vg(1sS!T;I6H_`9#VSfoa!%J&a z9jPChB}2-DSjGrjolr!5#iD~Y(qY4}GnK!B|LBx^S)2308Fcu4nN<$bEO#NOJ)-I? z=c?>S_<0Zcvn}c0q1bY|KVT`$I^zrYYo57 z;9G;14*K01xMv!S6dccr=M1K#NI?*(O7@ynbxkz=9>PJEEIXFJsNgTg)rFdJ(nlla z?KYYTgzyf8@J@j6E`acEfbbrG@Lqs$Lj~b|VTs|4zeNZ0eu>@#o#ul8)8Ev@LsIWs zC80BIGWVY!iN)j0Xc@rZ70i5zW6*q9+Ut={^HC54W)&6}UGp)ho=MtMuhV=SKzk>jQI!5tKJ`_n`860#|Na{?Ic&Ru z^!D3M^E*|s@&HU&zeinu09}3riGKo#e@={wfzZDsy2k*ajg%k!8csmQ`CF&?J2co= z+r;9WDE&jW^DVc7`R1S4&R?<}(FNWwC2B-h_-w2Z9{5bv2ya(dW@NV}eDK3j#aj{Z zh6`>C?25+~c7?Z2yCk6L->e8Ey5W!A>BreW6{{jHC$B6Z;em zx>3ZPjZu!#BnQO4=Am6_ONShIu+U;mSGCjSsM*`#`T5JmVZ|mS!=@-h71L;WHn5pa z*@E)}_N+osj3v`lqd4PO9J~U+$>h!1T3aYWRwXr?6F@=>}%x9_*#wi1U0>`>qVIwY&e7nRrr>F|&;V>5p?z0+ zxCS5Ijit>iRjX@gaQ|3`&&2qdL*+BG;B{Q95liu*-atDz2M@*w>c#___YaYQfw3^M ziqZS2Y?>Ku#DiSU!W?(D)^~((!I4Ne#j@(PkgJ2kO)jFoK$q2^5RWtB1|#0ch&M6f z2@YG8s>@1pmo@KSQ&KdOq2?m!Ee!ga8AWin5$M(d>IyGnI-}lnBH1dNbcLlZe zEwCF)>`gH2gVpWJ)g8!t>v^N8ew-@)Gt!t&hhx>1<)QlOk@+_|aDn{$Ao8|U$zp|$ z-LR?_`#GE<+RGum*q?24K-c`OZU=UCZFM^c3ZIsM$un^<+YT1>gG~=%n;yzGJglp> z)$Q=Eurdpmot+;`T+k_wWM|u0IonZW;{Oh8M-xeoL8~6Cacdtd0f2aT9R7YhTm5F3 zHvu<;lQW?AfHX6dN#b7iOx9?_dj$B^s9{ggwZf4LdH2OQGS*0FTBCe4Co=FH-WV8) zwct9;EKJVGmfA%UT~!7Hn7WA@boncc`GdHA8kVlK$2zPj8q61PAv2uHa6*CTd7^UJ zli0i`v)NB!mpzrueHt5dtTO27WY85Fku!(`XQGYI;{23gYCg_EgR`;7IZT5sq|!6f z<#fe_l&;;NyLxdh2F1Xj-I7kv1vI2b$~-1iFVVsKwBSW?l{mM6InGn&IG@dN0h{AO zHpfM5j*HnGTPSl}LgrX5l3hx$T!uPd&ajZU&1WlEnmH_9fu*iwWPW4+ra57_-jdG! z)7tsbM(D|`EVoK|0X^9-i*=r7CZXh%Iw%uvEw#k$N#!@ zZYN^jft0;di}_bLoc%8R{cfi8JrcC>nM|&gvLxv}buN8zUPTTajaa-xdRz-##SLQ# zNY&zL@IpNJuuffUP`7z#CY-_4NC!}tLy7iSDoY1Y!yr#xpMyTj@03Gzq)ZULti#o7 zl(s1tIn(1{*N_&lBMIVPMBGy#+T5$6&3(+S`ff^v|>OFL1Vb z7iXI>jPh0Dapq{t`O@TVF=Z{{O3 zT0XdRL>He?GoNEKU$B15P~Vq@(EAE&|C(#ZyFPUX6W=g^-zosVV*tNr0DoWre`ElE zasl`=0SI?}Y88uLNV#9J`QJ1Qzskq30ywfnp8h-4{s-3nCo8w))%>L+re+7ac%ag* z9;y^FrSTa|8ff;_UaAVC*O)W_jY;9v6HKl)Xp1(%axkK8O{eA>9kl!sXSwRQ7tp54 zaWQGA&g!u0tokCMNhuNlmxwjwT4FL0jAe{qJH0i-bER;ki+-h4rLh8?wMs%#dYFo} zr~!1a&hAs{;I1%PBVC<~8C7epA(4NxY&;zaZEs{tGmzWnTJbHa8h|I&SRLUhh3!QZ zkagiP{j&B_*{qSuK$?s!hMd-Asi0*-bwF4hR8t3=hw-%loa|Q@5gt!|wD)?L#Xb+Q z*zX}02Ry{$5)ZMsn}?$PG!^Z;dnnq^=<;{iTLe8w*dEBOp3JSksjXfJOmi2H9tV13 z%YC?ISYcvuP^{vi7_h2BZ#715bw+OuMz1fUx2A_;05k#M_48m1fJBcg6>E{gYh$zP zcx?ag?aA~1RU9+K(TT zQJ4`Pd)8JDM52<-Gg6sn6q{#bHqU4_&lon(CNA@AO6CdT+i6v=s3Igb!^X#I_8FdU zpHl#!|7t)K)uhQd)MRsp@xLwd7KL~)9u?TqqrGduST80p1GZ8O*qRwIkr}WJGhkb0 zz$6y~w)0r;8lXlonGo9^8=Ruqetf>|yJ3`}-bPHN2dCkK(^*nSi5&`QHUrDg)HTC? zOUz=;qDr$JS+kv3v)QcK&aBxkF3slHnn8_XR}!!W8{AFPY(~CjaB5pb7Ous@bu1lz zYiXeJpcs~^_t>+7vw$}gD4_FESBcV_JgbAsAR+KeHG0Nth4kV$Bw{Y{q6N*^%4YnJ%bX%tiaA^nu!mD4`6RVS{GbpgA_^JT_=MJ5-Dv zYJS1aqJ!Yu9UI?6bE|Z|TftVh0<_zcs_4Wj_G0;ql-*m`yukY!eA7{D=F(XsDE6VV zBKO6L_p@cQUXb+Aii`ajpaT>@2QokhF+c}1Knob4Lx}NH72yws?;#`{h7BIhnl$53 z9NH-~r{#QAp-pQ!f3OjEpALpKEB45I{|G_|l-B+DNTtf`?8m!+ zO2@-fieM+8S|_qv$$wHUaS|KnWTnO_tj4LV#%Zj^>8!>X%-+M8y=M}8n|S5QKOnR? zi+FuD!gh}48YdL*an8lU=ec^E!xY`swB-3%>;f*S8w4C2Xoo z*;JRYsV-;6?W!E<3hp^ZER9~`N`n0=gy?F9Xz8lDhJ5LKkG1scTCDXtuC+fb{aOf) z;(EIReeu@~9>?OZ8$D`Gm8?qO;U2j7Yjw5w%UP|s+2dUPb&JPd{&g#ZdmDp&yT`r! z>kbbu|GJayau?g-ZVxU0YQ{xh&9Ks|SuOC|73^}4EYQpgx$Z?E?jsY?OGVwT>`U#ZfNzKFV zwLDB;!vzN-EHSm8qBfq!HlAU_FI7#?>TELX*JjUQ)z5R)U-FBYj2bV?xMIJav0sqa zYHv*N-8p2r)pW$1RmOfVqrF}y80B|+lrF#MS6bzisxwar7mLF~htd~i;ssB^H)St+ z^52xb-#^r*>2`wUw9*0Sb+bO_hHf!f&yxp31jhI8)_tnD z5`g?irn#U}mH4PY*YdFnGoP@9KV{2*#=+!sw)hup(1C}^fq&|OnaxQ8!hN8WW9{}zOWDdP{4Z4 z$MS4!52ugo)Z{Q8A3*Otv{fg3sc#6XXfgPf&`4;!vydDfW?(xwPv*hys1Teo0UM5S zqFTa^GeTKh7So=T&(s@1^$eU3kTmeAI!&@jh_jVk#!A)D#o_;ITauY<9j>Oqpb*4C zDtu|rjH^y3;LUfR5-+{-j4y(T|!_nXC&YcE$Id>Y!$PHqoLf+!JQyP$4&uiySgAsrs1OT1z zCY4%WS!DyRdqXefP9T=`dQ+VGPq@6K3V6 zZ1gHN`etl&9~*saL8Dg_WaF^$%{8Ns^yUpl;q|v80EsQ=>GAmVmR|cUxwF`WJYU}m zpV*q8SkoRaxq_LPSlH9IaeDf;UVWrA$?|kqRN|~rZ0B79?W`Pq7Z!L9OR+24d@Htj zjn^I|Ibe`|=Wb-XT9l$^~` zQ)3sc##)wnSr}HSK!QrCdL1~&x%hh8Y1d60vefgn1fc4X<`*Tvl?W z9gEDji#WEhiVo#zyEBA)FtmHJKXt4lM)h( z>CThV#C}BQb~}KXFcdav0zRW$!+T zUOj*i%{e%O4hM*I4iln;C)U9k@C{TaX;#N;TqEMBJVIddeY7IPF-(YKnGnY@A&zH4 zoWO+GOA+EkPQGCQ*AiJ#oJ4#%8Od;p*Ioy}jBa3zZe)yZVvKHv z&wes0OMGtea(+6WbBuo@e281g2)7}mw=<;wszi6_ZmC8YccOfEX&sg;@QJ(GVeU}@ z>0ZYEKIZNHY^Dd;77x1k`VjH8mz%HRVS?xp6yZ^gr+4O$HMZu3&&wQx#bea!efpKZT7wt&ioju0TA)5I?IRevTo2o*{mLA%2k|e#r&#%l24K3ox&crmte- zuW9%`wNwt4B6d9p{L(=C(pfUxZ%*4C!pvEjKJLmV5q26aheZYqLkPY<_ z8|q{3oDWc)^Cx7f{}iEb=8Y1GekWf>+Cpxl}_{9r+O- zek%nTi(ibxlnXZ=Fx6o4t}3|0w*B9frFkziH{)b<|Bx@`-)HCEC9%YK6?VEhYuH``^W|U z;Bel{$L8qGb@%bn1P+L$CU8)%ReU^wvnmU`8cVUdj{^N~9O&2ZS%WDD8VnY(U6dMd{K=k+Jb$d7swKy?Elu@livDS@z z+AP*$Jznl}drSq^6ycgyw_k7Qt}cf83VO+KpTkQ=`1Cg$m6n&lLVc||G1BELqcmUH zm|-5xu#d^}l}&s+*|{lOsERGJ*`j=9tmZ4#sP{Pbm0@iC&6V}H;JU}NuWamdz17%K z`N{+qcq^7-Yvu(2i^s_LtgTc!2HTJ!w?#1~Y4oTr=qFdhC};)iEyQ-D<7Cuvd#2b5 zsmYW=v1BUhHO;5(!gDyybSBjfic~Y0R5O{|vzR(jrp}J8kg`)@>dYoscgE&-(Wo=k zS9GP`94x%6&$&|X3-@ex4Hnyti%sHdF^iubYu!T0_fI;`S>=nKVcHb_)UJ9~U(pD` zy)F@c30DpuF}yqk|J$Ujz=Ikd_8G84W1=Zj9vV7yZhIBgqJ2ZRP^y}&8)P+k)yxG< z?-rM#(37&{@J-7@qoJVowDlc4ENXqOY{{B)uk+>4xyO92Irn;>J?GxQ1d97;9>QQ^ zH8PQ!eA=9Q!UuEiNuM?6-t428c%(|Z<`U0VntOSgyM?^86+J4Yd1;MLACsi<_cr#p z!==Hern9^U$J+BlNtSyqxTz&wZ|x=4iqvry5acWX>lzB1cZT9R{+Wh4akiZ^Cw_V? z{tY(yHf2ZOWl zNA@I1(>^^!cVY#5`HIgg?ae`YAEnX0tkHg~(f+K_0j$x19Hi6SzaQi)GOu(n>97Dr zI7A~rXMUJo15Z57x2HIiDme@*Ih^$hZKb}=T zfmJ`zrTR&(l=oy3_7rUJR88X}i)dVcr{XlK) zFV10g&sFN4$LgNX>R!O=UdZZRpSUjLI^#@tHhq%dy*}hk^eIFtFT1s26ibu(0kD(-w zYnHxSw{*;raXo>BpLAthWKuO%`4pCUn#;gg1(Vl0y?d&2UQ{nF{GUwWDQC797cBZybX=&z!U zUSk{CKfg{AJmrYBZ(!j!ecFkG4qJ-1n7(f-LEm9P-(^AHV?p0%K|f%UKE)*c&}W@E z=y==q5lQO#pOp5)2P5-Ll_hmkQ&*6N_|39btjWGBf zG5CYw|NpA&pE~nYK>iC=@8Y+!@d^5i3YtvNuz+(E=rViz0EIeh*rFW-lL>}#5n*jZ zI+x1U;S58gNE)elri^87jdg@#Etzzv9xwfC%(dX+Gdv*>S3E>SSAW5%=kc>Ac>UxF zK0i-1`^ggme)5D8KSjNBRMhL{r>IxCRGNzJek4rL52*EE)RwZYo}}Afj!4i8YwqpW zB7u#r=;NnIu!_=uRn~ts)_--@e+|~Zub(2pUmOY6^jnd@s#f$PrPjix*Y?|y0E8*9 z_S9iyu?{`GEHdEo(dXA;5FQOx;{C61EKAdZR0*>NI zIgZ{`FE@=?i+y)4pTmzq3=b%$BRkb87kp(~c~C}`crw$F%VdbRb*>9vtz{}Ore*MqnQz7H~^fl0>CC50CxSGp%R;t`K!=Co3VlZ_EyId zUc->d&Aig98f6&AGPHr4{lkV7o3kr#;kTE6jhFu}bd9jsQvT443%=&q3%>pi$;1Sv z%T`REt^G8=IFV_!4bx~_4lIBxuxOIsdLQT(emk=JWW;=XExJ@&(M4POH3f@JWz+1Y zFa7#kOd+NLw$@58)Q4AsP50|7!FGUh3Z5D8IUZMn&18gTF+x#BXh-<$ODn;4^1CME zXQP%o`<+8WBB^077v2Sn&G8pmF1)L9`WkL~H?~?Wi&+PsBXGHJ4E`Cw<-(UL*RS`h z<-!fvP~30d5HiKOL3tbNO6DoJ=tdaiQXrhZa=1}R)5OvwSehhD)6B@st&L44Li*$S?3(pxvn-Z zx(?A=Ryd3n(bQ(Lt+JEC)rfE(tLsK#T2LJ196A=t7`O>X#yy-A&&Xa7R)4{9=#Ueq z=gD9+S zpU$!5Rh_Q$*}WXyx?o*fmwtvHDSsxmeU{%|`vj3doGrhIc9WxJT$Cry@jGCQu9jb; zIG5>s9?=;tb{FTV_`9}tk!#j7**MI- zvxms>aTfL>iHNE|Mj$?$52jIQaT8`&G&d3p)lGrh!tolPh`6?J$8eqM7_Mg<-oTOM zM)s$h*rqpg$8fdk7;fQ?;ruQu2Jqrm^3~grHn%fvRv78;Ap2eI=)V zpJL(9T;0jlj_%}hEc1ny$-o7*a8_zc-AfzN7q6#6gTcmwmCIsI1BnZ~;eZs@3IbK) z%fi9;D+SEg49qtS%(o28cMQz;9DHw7!S@G3X8B6_BO&_}0`W5sp;+|K{jT#~e!)_| z`t4I_?fW+-rqhLQ-T+YwU6+9;NWz57oDt=r%JR_28t3ouALXe@T(*O&kkaW;H8w?C za&dPqT#kf|l$8aoy2Nj8_^p*yzx(r7R{i03t*rXfZ?CNSi!Ib8KyKMJK$i0a_-@yL zwzA3>fR$DLfVHwJ5Fk6=tn644Ks)}o;p-MaUUUzD#e)Ic<9>0Bt9#(@Jp*?5+&0}F zYR3~V+j+Gmoq7&h;r2%c}6rKMO4p4k4 zQ-BR+z&2vQ${DZ<1}qYwt`F)5yoLp=wM2M`z;M!X1U6Wy`QV0uyj~BEr&_IR zC~RxvfPJFZvQ#>{5PoB@iA@693oVU?VpB%3N};$Jqd1mPtY#F)F^ZeJP~0M5z0k7j z72`?2EwS+l8kS=MMKg%4u<+IaX9hvqXzQaVVzF(wSX#Riu$BU@mB;8u?J3#ZD_>Dw zD-LUM+VPY#SZ^CB*4Ir6y0#EbgOX#+j!;t?a=%noq~o~;bsd0R zA&Qwuw+GwO?S_E2sj`X=)Ge8*3f0-O?XyI(VJ@9|GqWR;HCi*F=_1`EVy$v$SX3>$ zC45a842n5!nnt@R$i=Sg_B8-@vpoZ~8+>1dqoP{*&t{s3lEkcIV#b)5^+3$7Bk*;` z(~5o#P+Q)Gs8Yt3poo)=4YYBi#t*Q1qGqZT&yPh#6U&xRAt}jiH?yyQ-D6TL#*R43UnEYG*ZBWy>7favs~VoozXvZP~#g z?P)ON?wrv?x-6+p#2yrm_C(uuvTc{5p1nvPGoa52?TxkW!?lisK6RNmAogX-?-#Hq zf%b=f16Hj#sul+X)J)Ju+MDRbXh$5#P#?t5AIyEu0yfDZY=T3%hc~&0KP+Iau6K%Z zIAMGQqH(0=Uwa1%O#K{%#g5iYv1BlbV*>g#4@$?=JjVv~X`bVtoKp69_}mHu+6k=h ziLCEQtnbP2xfV_HoD$%qWG{HZ@UOb2IF;Z%4RJf2ar+O*bw(kVI1{Bji=~_fF0p(= zi#VHoDoME@l#4;&Pfx$!V5I zw#&%imm`!{X#R9&A%D6Oi(SQtufGs~(t#9L7xkiR9A0!SlvCPY2cO%c7hTT)+`s_b z$N<~~pM%JYZVtFo`&&@fTV1KW8L(Gds0A0dVaeMAMHXD#q56?Kx%s=;E_bt}_rT|L zTyXJ!>|FnV(LnzN@FFkNQk83xU>B+heK9szd`x#FDXsmKeESiY$~zJX2%Q-&dxjg*?= zY^0pNTB5b3tvL~q>z+o-am-2QL}G1md1g!={gU^DCHM5rlb0aw2!P}AKXl z70LEB)cIc%;u}ANd`lvIXD*|X(-GeTAU`O8{0M+720(rSKz;^5e(?b0S7#ZOmbZRm z9sW)Y{$b$bTmPlMD*4_p75>YJ52~~T#?s&4RIFPX7ke3Z<+t(PgqLq^jFze_m;%p}dYf zXaJBSIX$UH7s$zZ)2aA)BGy_Hw5HG-GxjJEYp21Vvg^(XJHv>iXiwl{d>f}G9!^Yc z+R&KVe za*K6X&FhjH*Ml0Do!t5?p|lDv>u*4m1E5^2FY9}BEjDy&ns@X2rn&Cs_e(SG=5Lf{ z-pzLt6#diOck?$+Gw$Y>La}8~ba|ThZhl1?5^HS&n^eLE1Jazk`9De<1k-Rge;`RZ zh$Wpx^4J0lR>mCyLPOK|ZhmQ+=WhO{X}Fue8MqsUCO1#xfnKVT?kT0|yZIiWhqE=S zh?6aiPBSnq>2AI}x!YxgixJ$yNNQoLH0Ka-*GX+{Vnu~V+YsSVX+{9eol0yAg^pGV z-3|&J10#-w+O~(<#zAfQP}}%49Y7OFu>;GpBQ?2`p{;Gwk^-cj>T;f#z_lh)tx0Ll zRe1iqv!7JEP~lxs*y5lM?m!?O*L!MjFcR@NXV4Y2n%beP95s(+TA?p<2&@~VTlalHzLuX z$IeCsMkeK2YKX;3%abb@`>iGce*d5>#VBl-PsxGbuq)})i!(-pex%tVOA;<9J1|&F z8Y@Z6plFMhm5ch6F5R=UU@MZ&O&1Ov2LNQs?iOFIZjeb_6 zQ7hwcwcS^U-S_5xDX5RdjUHW_W(GtF`rd{&EZhAtyLd(kE?e8r7h{GsHhTi{3En><(lWBhjgIl>;u=lFM7;=+$Sci z)m?Rpc?i)acUvKr5c@MM4j{812(z!K#tvfjBwT~r!PN92X~v2MhjfQxU^`4{?{H{u zKD4(0+B*W;I}!t10t4GoX?jJ2!keR6)?=u_V~s9waPpwmK~G%$O8^zeF{j59rzb!) z|1L`>x@?Et!jp)>g~!_-y+`JyE@ICF?lK6+chlz zwItYeX|9aPOHuuL6GBGZcLUM85%h*EkMY0DLw~5gel*KaW{#|#2MH@VKIn9OzbR#0 zce77icZ)Z!yVZ#6ZbM(W9Vog3D7q6Uy335~?xwiz9w)B57h_nK9>ebAzO>q~%VgO5 zxzjyBo#a8o>D-X!c@ym+D)Mkziaqy7)HwPm?D-h%{5TxQ6Y}3NwCDb${IR#(bDyw| zw&PQ2YSaB`YUvsD*j`4ufvM42dIEz}4aCK>49kbo-23a#DPEojFE4SUBoJTmAHHjD=OgRX;--WIu&^Xg51(WW~7TW+p&#&HiowD>3uB93>O$r z=ehYrH*Xu-qi#hT8t3V4MW9TFL6l*WH-F5HA$#zplq)o7AH!dpUCyF5OpA~W*S#`O(n z>rgf{fVd`A5e07R%!O2ZnNy!y?$OwPikT5{M)M^|5eVo_(_G z%g4z=0e4{;pfrSK*EDY=Ky`c#B_1>A1RBE$i`2*pw9B$g?J+SsB#1VzKsv8~`!h&y zs5tjr?Iyz^=*N5&qsDj^Ls}p%nXy^Ib1;dRG8Vdg(q40~# zbIHxDUkMezr8$`lU4w`C-Kk-2V*TOX#QHPMd_d{1wB!er{`PEMbxU_1h3THop07tb zd%`u+y?a+{rep7_XF5C0wbGIDGCk#^Fml|GIWW_mS79>J=?-iAspJ=7 z=n=<%Yve9rUV9O*Yo{B}O8#3M^-ec{tM2^wA^z3@e|>uB6++pC0yQ!NPP{c-H&V`d zYFu3>s(PM#kq{oDLh@5#B(Xw<5L)N*{M8mG?i{9#M;fD{gj|8dUt`g*6-jWKWa(J! zR`^hTeYiQ?C=(v?`!}Q>B)YY$HN~V$n`Vo`>3D7DKwFILyrf_QSb4Nw=FOu^TiZ4R zwPD-M(UUnceTg(lC@R^KPxMuCvJ?5iSyhcB94*mvyGc$k7S#vR)Ehjuv)4MoYdZnl zBBiZSk7ta?i||q*F7FtMYUdcV#wVDNjg+uFfzaGg<9J2?Va3P{thCWCg&S}2E5cP` z-E`k*bUoGi*GK2y08S`?F1{hUc;9sPDrGtv?U&BcXjV5j@We*kefkqTH%@o1$GS?D zGDCgR&6Vdes#BhBylCNuv8YIAueFI{yb_EL0OLV0J`ju#f^U)yNwx>4J9lnO(qag+ zJ(O73)bLPc=}BwRo8XPvrR-5+Gp0R^Xm1Yjx=LgVQ)3i&4<~w6>Begi)OW>}(9#H{ zrIFCmR?yPc(9$;0(kPFXwoTUy^^&3(%>ryk4URFCGd$fLW6zg?)oRzVD!2|YmW{SO z8EqU;vf4naj)BJe`M@2>Tsx+lyKex0K!Cq;3=lh^Q%_KxdLlaYBy{SX(W!Sqr{2}m zsV6&~T2d5K7#~xq!QG5by+g9c8zr69KOTj4=N9*%7NCR?E2ym-S z=go*Zz_1>$3#S{K5e?~bGomqFZ$>mBkQl53i3r2;|E+0eai^F~Ky5a<;q-KKVZ4RD zM*-x6IiAw*gwgdZZ^*CSiu8CoT0vkBWxGNPQ94;yWth50QTWd7TL0FmRBcNz!Rm~+;bfi1$jY%c5#Yr&5LXRm<_6&EY zu+XPcgQpo5I66IL=A6^1@EPgu>$NTEo@C}{Qn9nrQ|$AdtwcBnBAg2m&VvZ&%YR4G zKHmlM$9&r7+fH|i3)9s;-$m5Y#b8L@v>x3Q<~=uk+m0V0(vJ&>OIYucNpr{VQpMF} z;OcU4bp^P(5{kVFoz&syYF6#iHGd83{aWJuI;=i{r;A)J?s_V6L%MU-or1z9x(61G z*bp1F^LV~l7~)jwLQ72YV>4Lp{OFJlTOi~5;tDBT6ZiXsufhul= zDsF=+ZigzyYE|69s#p=s-pPu)i?nh#6bA{ePxquWyoXBN3*DV$rbXeCmn&y!zK+$o)QH$OGOm z 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

atF9LDfwyb$p|UR@ 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

)9IxA%dV)~Y|_ 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%0A1A25-QruJDv?#NI|Mf;k=78e<#pQ{5o6WV_ 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傽z)$SnAMq9Y57@b2ed65|73CM#>-Zf37ribTX;y#-GbbO&1CZUD!%`-aS z-Dpo;qnzSCCQlGKAs5_lu}yxW-BhZ)q9b;$VIe3C!EAMNXiO|IJ6+r3{&SZcK=EvF z*E!jiu^<6Npo+qn+mNKZvB(ih46K{>r+h>^7wW>O?TZ_9VX~4?DZ7`f7LjdLT~*v8 z;$awbHoOV4g>i+u?waoI>Uykgb^E5x6-o5#==TEqjmP&NW;Ygt9AS?KCs4zS`d0rtEOn9ZjX>oV|~oiN$X|$`5>k<5KNLGIMey zrY3}5#vK|D4>morn&~8=H4KxSH_M1nTyITHtOw(rigDfD+gl439hJ3l&O%LHT;oHM z^V!yL&8xLD38EeR!D%tO{+{Pz4gG5(6gp#JiaLEEkL*a_bVXq>KO?cD0(x#%&?VhC zI_~yYD5AKyxCZZpp>PwK&5$3hS^m`b^(g5&QtWD+KXrpVaI}r)H&Jn2FOutFq~h=M z3TrlLsyqVIV^9zIq#tDP4~snEflucE^v@{vZ!kmW&{*u`bi5C*N;NjpysmEKHq(Hu zz!?ueM|Qx56-v9t-N;W?1XsIl`#~wJXl#~Wq)py?LPzDx?4+@q3Wec3kCB}p($)Sy zKwHI!0tSn;!t8zpWF-C?qe@z<_GA6wGs(qrG!DyI(-w`2xv!>BgYJ~VbRwo!UQ`+1 zItmp6eSHr=9z3E;M>v+&-|Xy2^zy}bIDRQf5_kCq zfVN%^Ggq;)BUHN~G$&C?Fsn1YdpxJ2v+3qE-Tq{CvjuwM$EkXbuQ~ZKpAfU%)bSob zEVL&B8tq-Cm$~mhJ}L`HDG;!CIq03%!ylwc0>0QLbI`BwQ*onX_R1PQD;X=PxN7II zKhW_cUi3_VQa+b5dAAdc_`M&{m`5XH(cG)Ec}8hFre-~pJm1k?;=sg1llHG%HOwcy zePT|?kLKyw$z@$)j@}^f1((z9fM*4Np%t20!W{lt6Ouvr<70bry01|zn;UUh{={d6 zO)o(&$;Od|*e@q)e<3^Y`au*-t3^X?2;g22*tW|eEM-`E)hphbHXD-RsGZOK#^Swi z?$7<~KL%a`5i~zmitjZ?S_%5CT0%J{EiEBI{)>BqUXGAgf^#SIt0)d$vdS#L=Z0+8-bq^sjyp1 z3#OR~%xOkFQ|pJ&mlmn`!ehYwU3{;@$Ot$*8UEX)=xKTv<oz)#tPh`Esc4Zkj{R{`wR;?2veT3(IBp$;@nRMjZP4 z+YZHZtVq#5{&L*jB|Zcn+BclZAh;>~4;40oJr@e!=D6?oOXMB&pDTKCz`#?K2Txt);~+y zX`Lz+V7&xePWt!e+@2zImjcX`kG#o=8m%13EoM%Z-3-uJj&vLxM-oDjUUDZ`}t8Z7&(5w42zFd&x$Kt<@TGws?t{YA&voVAl)okmYTrj|4 zp$#T&sL}537AI+4O3&=c7cT6IfJq2}xv#Et1>X8bktaxJl!uxz;(F zYclMco1N;E##Repk*}7%=Gl2C4u%X2g3iy+dH4!lEzRv6;?fJpP&(CwE8dFXIR-i0 z30$cf#nU_EZ$@CXkZ~DHY96dLS>Xoo(DKleT z`H%)-`eJF()gV z`Bo?QePB;eaxcE`N9wrw#7$)UsHNBel6d{q@y zBzJm8K}#`8D*HN$!^H;shPD+eZA&+)_`0>5+rtVXshfoD45><(;1-Ga z*%1XP38d8CTl%7;(;L2%H|90_VL}(hEr;>I9z%@%M#to;`jzGx$pQSUtPCO+kKzHr zI~$r~l8wUCJg!MAwK5gHG(GfFQZp@4vTuuBy091?LO1U>N|2$0InY1&Kxgkxe*bRb@?|8Y(Zah0HKv6cn;C;bD;nGYp3v7+@rCtnkb8w3iQ(%_zwK7#hL87t z1{j|=H#hPQJ`!+!8aeRCpsI?&;coMS%5}R-y;c}-b;V~nMeuDJ_g)~l4|fP}jCC0? zysJ7UFU@1Q{e*GgAJ@lkAk!fGio=j|o(-#@ANL|)CO0bTNaxl-^(GvcZu{wIZl;0q zL{;KY=uX_UhRX83Bd1WKf}UvR+CP{12E9+bp7n)b^`vJd-M!yM($O(%Eyz=F0xh0W zN-){YVJ6>wwTsdKOJ!N+)9?>?_F6u#5xp0E=_6lf@ofl#w&z}jPb?8UemFQd^tKN_eEIo<+-yU@`N&=d zwC_R@EbzFBOms`QUc?A=Z$}!*i`a8xLRsHZ#WvyLGn2|u)mw3YYsq&Fikf_f@MNt`yyCD2%Q#dFtV< zFNu(sM{gK@B))H1T7-nIuCgk+r(NLmy@Q3*wnWrc?}sJ4E9<7zm+Q22Of#5`VPY}m zodgZi&-eo3lfz_ zin9|>Q_R7d=bhEytW4j|Z7z5ReGzI&WI2D3F%ne!U6OvGY{+4yGF14{4tLx(eh`vH zIqf5C<0O?c2>N17;wP!fI0J6*QxzoW6%6Uu7Zf9_wtV@nE`KgXQX(J2aH-E^yo9Yb z^WG_WFEeIX<{~uk=bB#xZX}gw!b>4KDk}5Q-NQR%5-;aPARb5c{@VWK$dK8nf94S1 z%e!m*??l*qGs8td@46u!zG^sW^swt**g$aIozGaoGb||AZA&vUvf3;h4joDv1H;B= zDn;ljG8=G!a_P7_1%%`#;2WuwTMfRK5)hPmYx6bzBg{G=&fdY5B`+t|e4B{AmSnQ@ zlLpCnBEf{p@HN!k;}g^)%^p$)?KAdQugJ#uJAP>x5Ul*|1<8CFLou9^YD~8mx%BKY zRgEaDHDAOOQFd=kp`+rJK76!CB~#ZTk68+G7n%H$?RN*m!*0sq>)b%|C@BIAUA>4_ zEl!!$h&>t4ZfiZZ5}fe8k(|_9QLpCr-7kHNb@V0OP1QWt8nnTEzK%CAWgfU!tDW^R z)u@!VQNe(Qg@yUWKT>lYq+rrc5v!EGoDy){xeB^2yH8g9fYhkjfA@Y(GI4kkdjGno zyqSb^Bs8VcaO!}qr@HKXjBDlbc2HLJgGI35V(hmWPgApJ_F`e+?~UFqsDrGysf!mq z4-S-A=wR>KJI(FcsD5O|7vj`8ITsmI<2b+4{>Ql8g{`{uAu3}&aD z1sq&G#9)@=^e?=(G2j)}DJ>DOEV*po zUll>uF(bzB zjY@^grjw;tI4sSJ`*p^K2$&%MOb{eEW7glv#%G!n60oFb@z?yp;cV7E;gMa~m=(Ju zKQ7CGE7=p+Wh)dju6QZSl8WYe`OD%MladdR*>4_ zZ|>+LAtS)fQV?QYDU4aRsTD$3bQgYiLSB6P%{ewwAmd&7D>UC=X?FM-TO=JQ8rwB@ z66<*##T<)||2*;$iQ>yR-mwV@1Su-q07K+{tQpK;z9?yNv>f=Ng6LIB#Ot;Puqf!6 zP^01}#mz|O?NU6jq^_2?Mf4*`%q^S(LBa<=sNCnoClZm(JSi?Z{yt-U6fsE+Ju|Ge zA9c0Z`!@T{@yq?cWg{XF!YP7sc+3q_s0Np-cpVG{+1vbT-scWcy z)+&0^CB0f(+%OBKK|W%fi}#h4k@I7C#{WFFL-+F>0Od8_NtyQb`7GX`Se39(gnM5X zjhC8^$}{`R-`gD}0hZy>TnShSZtV9062hE+d(4`>ZtdSFcwf+fmDS|>HHUb&POF}twOQZ#ime5 zRR7{~0KRX7eMkv2*{DnoW@Fzkpzi0{Z{3FDn=U5&NWu~ee64XiV~iZ^#v5uB*!LL2 zXUKaRKz@(1hbbZ=P)|04k9sfZOqDLf!|Cu1uH2A1QLu+NOKQt%u9}UJ9%<*D#Fh8a z#cA*T%=7#DwRY9o+`|x8LB<#H-QL%W^WOWibA<7tgZsL--NSRs_FuXlQ1PC&9p&U94kngl4p zw>d4j6~upO(-cm;Z{5kSMq@Zrx?R2k!n&)-=*^S?4FHF0Xco3v@Xs0;14t%%E2T*DB71($z zvd8ohtT1k-z%kk}4+J(v=mW$`N8_wxeaO+1qKtN8dHuTqv7t~|AVBnyGB)$|5I&Qk;o zeVv-$bchLUSb+CjOe!k~E9LPP<8NVft)%~9`b*J1l^5_+#Z%@TIB0 zl2tVk#|qWo2N}rxE8wq8GT{@^JAVAkx_}BpRbN|EzWBEB_{Q+F6W$WgZIK zlneUk#BT`X*}g|t?5SbG+$<_5AHiF{^rn*RpGP5teWscKfux2dJ|ZMl$X|DNc7zeD zszkhxa*hhK!~emt6_$_IcV*feWt6d|5}}u@706_X=Qv`-4i(yrbu~4C{5$$SKL0qb z0g0w=->?%w^lwTyNA$k~O))na!C6jEPt!g}5zMeLdp`pbCc5kQUgw7X2fF~MB0Rzt zE}Lbzd?tQLSZo@@cbPs}aM=8?=fwSEs^ zWG^4q z5MBP6#o@AtEUXPzA3%!PIWqF>jFH>3g9~lE{RjowqwB~VElY`4UCYbOYE~7q!}3J? z`Ry|J&kQ8lUH$X@#aNtRy^E;qXVb8~&i~M_7s$es<%~xOgZmTt7>n3yN=mRbbDf*R zym|hoN-@H4?o9K%&Mr1JCDJ2xKEi(->R76Zu2B&W%p;_`&F@JzhsTmC;U1PTEew!a z<8fdiVwmc%`#0STgX(_Qo{fn~Mjx~7Q4689CJW)q^Jlm@Bg^I98uO*QI7OJBWnD$( zFxyQaB%k1X7+m?n%jfpKdkUfIhCb}t5^3unVV7vWnUvbq`9~=#KF1N;0TmDvFCOG#3z?JWPzy#SdNLVxBdl zzeOPwCmcBvX8maAQ^%nYpW7GELWJwB*>TnrgGsh-8$xC8%^spZ+7PYPHqSe(@+QOw zYbhBe?|bKJea3)kp*sl(D0!1dE6VQYg%kg#+pC&ZUeOi!c$w7r1C(Y93a;}*B5q_R zb2|T)2V26Mx5US$XL$=js^G=D;WE`zMG-?bnzfzN!5BfFLL1Z~)RVQ)` zh$1{wQtkLzIN4Y%6r{&~^x}rm89t1YLlNMGOvw7KC5!SghWXOF~gFd5E)x=sV#&Q@VH; zs1xNY>LNjw`_>^sW~i*mlaqpdQvL@HPc5qB6AwRb81ez!W?#Qlj60?AcA&p7`18bA zJGqEYG=_0WA&js7(~7#XvT~1V9Z1O`KTy)HkILtmRPy?P=NK$Xwh#mUvDhXz5vtaE zy2~#xTTV}V>~X_%7piz!GD+B3^pap&zZwmWevRtCpN_$pd#`xQeq!ImwZAOGB_chV zOlK9H%KMcS;`q(qiPo>-)a#Ogwad%P+uPf7b8|;V;aeHr=_>6A!7R#b zbc`mdK<4Tn`VyrD3I!?wKG*V!>2#1VIxt z&&{KeUigjm7f)pyw-ios9PMGW7Hrd?6X_p}QyjGoZmre_QrfbM6+qsIp3!ydCtDg)*yba(_4-R(ND4W2F!hq1Z65KsLUo~8F&kk?1UQ&Yab zQ?9Y05fOv0Pq+AZdHtvmY*@Jc=enP*Xn2EP#mLX}Kc_8~p!-sbn-ydQJB`zLyZLBG zOG_)f)|t~j$7CLbXp0sqpeRDtb*c}^3KMuw3HL|LKl%_ zpi;uzuM-r#u{|#8!R-69LRD@UbK6_EpC+sEm!373ggN5IcE7s~WZ&mxev9v}=Vh+6 z_B&JHCwt^D!}lE(RV5{8URDT>z^h?=ert&7?Pc5Jl7@H1_}J$!9y<&NhW=!;&k5-b zk=hg3w6wI2u9h3@^NWg5D3~Z_V+S{mpkCGw<2=)w4L}U+;%cDw#UK63VR=6?bhitN zn{srFdk++Jn6~BnQb?^5Uz>v4A;=?nl`OC3bZxXw_;y-O&}G>Li$&p?^4c>3My|UBfNS)Kq^|2zTPzMZaFnh=-4W(yln1qc!h&4 zj6NDu`DZS`?>BB4nf}og0WaJD>Wq|F11Scjd~k~o0j(hdGQTAZ_>HE9hKTghRI!@K zZRaV*>Mnr=oQt0b^yR^l`&g#PQ;ZnpJ==SazlNOZY3#PQaQY~!Xpgde#ltH{Z_k#N zmxD+;*_FI0S!4Bc9j9fWzWW?&qcP<&dTo4sDuM8#* zCYKBClRa!aUx3l|-Sf*UqE~`)!woX;4woBuRGb}1f)B4M{fS1#6#zXz!oOE4$q{(I zi22pPZzYL}#@0Ma&0Pu^lpzqI#e~Z7U-s~o2{0xl3X(miY z-9g$Va{7{o!OSFwe#qq|bDErlCwV_>GT$y5)TnInl1O`|?XzzZyHygG1!{_+9%^xT z5&mI2|DWTQ#e%A7H`lHoM8Xcymwz7QSfEaX_T}YHMI+38M_OliIG-F;gg7@DsW~DU ziSVJ{1fEA1COTSq)U15^NaVLtcgU;Kl+TT^-5>NXD~8Ai`S&RrD!mR+2@JptOU9q4 z)i%>d`tQy?zF%;>hv>})cmD!6M@EG$fg0a}zO{E{;LLlHl7Fq0s=cl+f42N$MPl&~QT*NL}3rK~VqSJuFT zm%>v(>?;4XMk1^aqLhsw5n_yfH{0|B0x|Yp(!cfRXSZ48^2Mex$>ZGf^H0}FggNQ8 zN~!MrYi$+@4PF1Oqvn%}S5)w%6*YY4bH+J+2JP=1`WKz(2x15*DT(Nm^42s)bYd7$ z5PZ9!6HYcg&-1B!x3KxWS9Ad12pk`BVq$kB(oS$N;X<+iU6{LH29Gd%6?N6>qW*bV z7Hg~+v1VmC*r5H>^SQPck5093mnm1n3G8{))cd%UG{Nk5pG^{u)f3>m1Fkm>oZqF&mrC2EI9rSqO|8bkO=Iq8*f%qm99YNH4vp z^lzs{*$K^UJwIkjmr@zrH0^eIjNxRd!aw&37&wiFN$nh(?XGH5WQI3Xd~D~MaFd@j z77$iCF075P=;!a4bE!*HIqv)kOPUhBPGjDLB7auvv|TqGn9Zi~1~` zbTX}F)1d*ZKx?JytbE2hTOYNAN-b<|zN7bWg6D)YLWdMw?{fUTLC;;ArK;FXLYRU- z9rscf<5@k+0`Qf@dqC9?uPp#{E)g$hsJyFP@ z)6FL|wPnOu-$C}8X_^j4l3EDvK}zs>jy~?|{&tx+@}2WgywGGmtA$!J(tfCHrm*rz zGG7-K-w-WQk(C^^Be$;(MnEH8MhZP3jgIJZk*d1vOcu(VF6yX|ufFlS-3Qzs_mSWo3M!pf^Hi?luxxodho%%Q7qte5%)lCuK=|y_rlm{wvs&_} z7GdEnRh>t}VDlFQI$3r*_Myvj5yQv1{L5#+6GR-<#Jl7q{KQ8d9c>s_mlY|xOx))J zJJp)?)l=rX7VNq2$|zO&JIkqIs_gR?h2uW7Ahrx}#J21SuB+9Th#G*Hx&1Y~nVUsP z`}OL_{GSJ@b3cFCi%@N%rpjs{<>S)#k%3nlKOgWV!Qo#4n1O zsR`2Y!~HkL`}qB}%Yxkqs)!v4N+LauT-s0J9|a*RUDj?bm?!mLc}u^jYGoJQiaAD3 zPHj6dCoIaVcb?;vrBsl`90$g=Yzp3~)vLcMn+MpF`l>`_rsD1%@k4`kx~2$G=D^RM z1W<+MAnN9JlVa1l4S_&WLJ*8+kb`)M(%^r46dh@wdot4>&s$eJI?~e8(8rHQg&z3{ zZz?|G)>{&BQ$mz|$%$LZJ9UxVuTBP;(1%G4)h%Eq=~8zx6L)(ELqY%s=~hhk?v)jF zJ~KEE#}Et=3@?mtN-h}u9Xq^NM1{ec?vXQH(nu?xT?vT`w}jDHTErp}?YV2tF&oND z{S%Ab&(%q;A;&&js1Kg)ZNW=tZsY!w)Aq4Nyb4P#y3Q(&HO4CDRSTQv0jOMl{60o4zb{(A|t4oD<1^xhvu8~1-PXqw;iKZOZjZzT)+D#jk$D$3|p5HsV!DfL(6`bHs+|(dF;|D#GOg5|l%Ty+E3Z z9R-orS79~M*4B<^(7G68Y7?Ht?8dIlhhBJLuBoMUN!Ox5MQ~J-8LV!)Jm_a()l;*M zmBq8_zrKN0mTbD}1%sL$1RCFY@|@lf#7#S-0I~LYECCm|?+{4etI{B0xYp0l{@sq< zz}qr*qLjhpnF%bEPj96|(|WbyRkZ5Z4j43Lc(&Hu+g5336|wp+UE+j{X9#(yl$IXM zSEU^>@N{{dj)Xz}C?#k;)4{>cua&cHYl1ZeK*xeT5s zo0JF?eHZ2X#4F+b9x~JxLMm>B#o3Q>uqvUT$IA;*QVP>&(dS2T;~a;3=+|-SoLxQ5 z#0JoM6aWE+kPx{c*KR^DJZyO#R01_9u36S)JtQX9U6G*%I44CD<}Bwy1+I$tq6}V! z>9>L|{E%xuZ<3=!(iUNdu3dO_c-}-q*@M@lQIRvS)(2%uGgH%ZbdOvks>m4m`u_f_ zwAajKKdiz#lA-Zz>!0EZ*1bFu2j(|I&j`6OO9BOFbt>>wqy3szJLJ$PqtJMv9hfOF zp{&qn9fWoupWlFQNpYA7yMt^=AxmH?;ohj=WO>Ba9?tO&Fja*WDV(2<5qfe3WyN4u z7wj}37S~wq0XR}g3|-gi+aAak*hejjTT#7m;?pP zv>=Ovj6`7hVbCsz(JU&jiy!H;dgsGsSOhfY_}YrP0hM$~II4~?K*uC6Z(0QB*m~Y) z&4{Gg{Ijzl*_Whu-SJ4!@pn1)e}-+LK&Ds6Xc zfJPag&)QZf^<1rQN>)8n7?n(vQLEA@p%5#wP%lh_+#$1Qx986yEDNB>5~n&K2tn8v zaZB*j2$Lpq#9ee+Fk2Y>DYlFCwvLX}jPZBsX`VTq9sZYl^1ey%?i=dPj$_4+4AXGaud1 z?Zt~JYiic5U2BTCNB1J7x~}TpVmP^NCYk6LQr72oZcKqU?s3?_d7RoS9TfFn{a?Mr z?uV-Xib24Rbk|zq%Am7>E+EX&FIF5On{W8#_+tCKeCQy~vkN$PROuh_@bEpa93kTV zb~k0DuUX(ZLK%>gE4_K+aJe|gY0<=UD!d@iJE7a9v}~!_;5Giq&SbvZvYZ@V8!@vd z`Sn5L2|PJz2_s*d(bP8;ay@Y(4gRBbG@9=!@J_&BG5CvS(C(A0 z`c*AJ>{m`#i}s@;fr4!hn%W*>Ui*r}HXJjPM`vip8u~3v4ROR^yuY@{BA~P%x1)>*~UE!*zgLEMDy(!^Q1^lDD5qCBDY|g$tJISax zm7fntOuACrN2F_?uPq+X;_jm3&Hop9_x$B^xB>7z=v^!Ec0>aNJ>iTt8iR( zz@ua_+@cIG?B$-5f|>r>8xe;pvj8XgThP=i_ZYA&f~TuYxV`p)zAz`<% zb>_U!@nFmA;C30EUuRt@iCC>r95oh-QW#kt=Fh5qMMl_%j`qPC-@!xD2Rjpv2Kvtm zqC^g8XOj@*NGlNhzxIMUg~%CTG_);@M3S^o9In!}HmF#9=^$>|AqTu>+_cyY-C4;$ z+^=c^NpM=7@7O4;jGYPoE0RYf=pp}C+ISuOngaA*(mMonU%b`ln51T$wChU@H_Cb? z;VGR>+$7*hq;`~dTfelXkAA6AIAAfMrAxc(q((&J!uF-u&0Kj-wLLT|VFgzr`~1{& zq5^qaJ3MCP1oB?&Y&=Tj;9I?to)dsCXR7h!TVF5>pEpWHvEw7j-Hlvy;YzNM4bdWY z-S$Y;gGFR%;l8!Y{h;D#T0&*jd3N`H%Y4CohrE;Z2?Z6^aGylE7wO|}vPAFxqox&Y z#@~{9AcKKXorZW+gfRqSe}=(e6ZQ>jt`3W?q$i$IyT{fXTB)pUs2I85v6_t4*nE8@ zaldX=u9J8Pfy5>$rJu%-A$(jwyJl<^4N#nPFq>q+zeOmCCz=IbUz~h1TTQsV#5Z_t z_d%%LrZ8vPsUfo|P*}Z%_SW`eOEDhyT$l##mecPe43!X>uOS6us_o;8%jdenFDh@EgZ>{0HFPGY# zinhggU;&tG(62OatQx~tYLCt)H|q4BIq2I^?8O8Q5#{!5eh#=LY7Vzc!`s*0oRy4q zr!w{~d%qB@6|oq^A{FzNC+SPzWem3rJv}rplMahv)QjgU(z-32uVE==wQ)DbYdA1* zl0(H|DjUS`_|L`2dSdzy2*Z4%rBa8x#gj}phr^l?^`XarPMvKCH8W8bCPEL+-%5|) zmSMlvwIUu0y~Wl4rZ)P5YUEr#ts>RiO3rkhQTd>%a@ROJZ>UNDi%&dlwZG$A+^vaj zgkro>_OPyANK)e&0;eN-I6BcenXAI*wNwQitxdgK!83!~H`UeaPD7u!e5IOWgXcVb z&<-P|im4gjq-9-JGoapuiG%R9+J;%`yekC`5V%KI@Rujv+~)K{kk)CrE15-^9MYgSo{q&bOOIZp#*DUH z4OCwekp>6t%@bF!?UmkNjPAmIDl@>@;&@$rg=cW!mP}soErEGky`X}VNUVQ3~SNPlU$v)LUG7Vl0LYr#dI$j8rI>#A@+b= zy^N1H*ZmxmR-0rUo`XC|FtxwxKP!@K8i=rRiLL(rtgR-Tul=JR_N%MYURQmSHB-^s zP{h`1^XntT%Z=^Gm=>#~4+&h)i0#y!^~F}RD*92yydHKocM6>mEEkEEHhKp7DGLw5 z17T~t#CS;1>0Z@RZg_lF0i>cFAUdyS24qA+xzbDsEn;` z?}fi(d<5z2QT6mMMtFq6A2Z!=yAQ~FzYQ!`P-6>rb;4$5VvR`k2?>aW4t`rY>=M6c zmG;15luY;Hkkeu%4?NIt>*+xxNs=abvOF)KSnQE-R^4ce5U%f z2g8PGRNR?5^#_t%tuzwl2q@iKZ{jX@AVRGUfx>J!l!sZF{&nXmkzRZ=eFp@%q4@s& zg$lNQJNzeGb&tLHRLB^bAlHuR-CT1Q&rqL9q`ly#>UO$p4mALb%EwA{@Gy~b!9 zadwbftsw6A;_nw%W+)D3zq!Cg83JDX^|Q@5o&mX23e!2kyk3ej z&@Kd*HHmOkIh~ljKIg@0H$pOSP$+%HA3A+{IFMkh%pd;U(bW%HTUN###bqEU5ip3K zBppNXbym8Ui`gpPapNqGFQMHy3Sk*YD>>BLgI;Y-I&2+owaj)MdC=aE$p<~iwm*w& zu)$h;RTn#P?}3eeb=a|275XCTyr`f!vBz=nZ5_gzG_yFFuk`ZgA*^f*l=E&e{@kV?#wZn=G+=-m_+1Ou|z9ifWTn);Xd4>y(v&v z(fH)a3frn~GXvw!iHO8>-2ePB3igr!CRKs;ss;MYX3jF)8iz7olc%Sp`dFDBH6Rxt>o_wHe2Q}lBu0%6<5VLr9N5JP5leX}U64uYH6tuAW=R3MsUIgTTN zLFF^{37f29Xx4%rlxjx>76CEn$CfaK?$Vn?5gW!7wjtqe_Pz@^ySUvrnjh4EhZgKs zFeK?1y#Y$FCIKua`YY>;3|4(#Yf2=#E!hRmyRzp(yVMRd%=~sKnbmq@(vD+t<&3N` z+@tYZzt#D;qeLai^2CJaM5RdTufw+#@!8mq_-}ZS6V+zgMfo8jip8g<5wbMJ2&~84 zr4WY7oLH%j3@gJ7zWWNz?!)h4@}8A~Oa+RUOuIt57KsQd9zaf1;IDCvwY;0u99IQfb`)mk&${KvI%^A10@UX1TwGzA+j2% zyMlQ1CgC*))9|S8i+kJyRo=RYYe45-ihHNL8PjD-04f^jF3P8K>PHD-1}9CSBu~TP z;72{!vzpzxK}_|9)?^6}4u#;3&wKEZyA@;~qPMV<3-ZaVr+U$l^}ox=T8G!GWM#tt z9c7x%!+`}~#d6~xGgV2vVI;&dd9^kyA|H?zsJ zdaRL_Ul8N>o%VxWE@+A!k!G|d6}=Vf;KipfLYhu(1=VXqC@X4L<^=udFPSwmCP)pJ zw=b!cY&T2Mu7+az2xh~_wW=;%+I!6;k|Qvt%L9OPeqc!rcmx6}rB87W3l;BIi5NbV z110-NH-p17MN#0M!u z8rxX4T>*WYx{)8lsBL(X-00bRkwLFFaSXKUg*V}c2V_yz+b;*03)gG#t6gr218iWz zo2eQheCG824WXa#2HE^_unZ&ZR&-$0B$}Kl8!!^4A%Gy&jIIb9s(ingl--Y>qQvq3fzV*V?h7G>WVStZ-YWRQT|i< zA*px{nA-e=fRuWl^^UK?ik~Q6#bds5HGZHovC`a25p}!NZKi8hspEx9o!K&=!Vgm10Kg8K;$qmu)_n$b7V>%Rnl_X2l{d-k8Hi@ino`uzPxrLEJ z8W+22AQ`Q$Rp3&EvaXnF4J*T-qNp|cvLv_S`B_S6*4_2P>#TSS#hYrgOw@x>DuWD? z^d_|F!*i-z$tYwYtgo^0Y#t2Sa+r#%b5@oPmijwD0?2*<{J+VVBey%h1 zU}z{Y<^QiC4Kfa9eA~^~jeejbzl@AEnKFxp)WIU&TFqs|NYv!L(*GilMcYZnJod=2ERLxLH&n{PPF0WCg# zfFp(c2rn7=?U^DFJjDBI~$vUUwJKFK4yJGCHRmaI?}Ie?!iSH8Q;KesZT{_(M5Y3q!z>q! z$4aY$ry2FXKYWrAB)(ln-Lr`IA73k;)C&ow{<|h84GlH#6{!28Np9&{C`>&ddljB#-!pi)s{&~s4$_2&3!okMM%+Acr z&IZNI%F4>Z0R>?GUm*a;Cx-0+04OUnLsKBg^8XeNXk=w({Xbyxsr*&{A5uc)W#6Ks z5THC=qQ8Il=BJ@QfBNAdAw2y@g)!7TRd6OEG9pk=)3cLu>a0)q_zvRg4oWu04$eS3 z5R{0KjR6So-U?^}QUn2wTx|zH{7_IZ+dsXz%Y2x!j+BAI^QB9-33j1RlLV!?6xak- zv?o^jn+(x~!M?;|2toSGccfj+<)_RLCT8%1udtY z;(@^BqUQ*&#bL{Z>drYYN5s^W%EtP7ch{(8p5nEKqa$u>OAAL~k>rQ$vB#inSmP>< zjgyma(W6^JtYdij6ZlRI+R01S`6DB;tS`~_VU1bwH_p!3+7pBCcI9Q zotU4WU+eYvhjpFBNlr;2kFc>2HfH7H=6*Sz)X@?ijt>2bfFQfD@HGk?Ozhx>sl9#7 z^vq0Qd3mHkrMgA??d>g%4YNPKUnIr;-d>2Uo13OKJ3)8=1?fa^aIit7M2?;7sXWh- z4dF9H<7;T)ky?+)$VgNRBLaJF!uZDuA%6a9qk@xt*(DVt>{n0Ndg|NSm`ZwZ(<^&@ zS{eWZ_$Wj=FA{k~PKIyZY>W*LhYzV6qG4dP(U6DRd{r)6Cy`B2{G-WT-@bi=A$j2CK__vGkz?>)s}K_9t}w zANh{_f8+n{KwuEi;lJ$u|406xnU#(6-~B%`2it%A|Nkcc5A)0a|NQ6Bm6G`{`hO_q z-~Qi#o{7msUtgc!>yA6*=IWR{~0?>5M)ttG~aoJeK9^0|5i)xzyC*rOsN}j0Jl5(T8?{>2jS?)$=audn9HkH4Y|< zyrP8e|M=Yh`2YW&|97ylv9xD2xBs7`@&D}q*|=Drg1x7Ec1~tCW{#(YKl9Ty+ke*o z|4RxJEee1Z@Xy)SbNJcj^>5{=?Ps$R*woD01t1A@0xB8WnSmVujt*v)4rU;GfU%7o zz`+y*Fm|-GWN-kvIQ)T^@sF;&hBjc=U%><~K zMgN2W1Q1bCekZ4>#P|z`rI{hf+8)FU5LJ5f`?2(UF>zTX@n7VPKn_5&CnkPVWI{n< zqWwkM6l4ho**%TS+R(ww#v0&Y1F!=*INDhQfBwJwVAca&oTTh6M(&= zl@-v=^%r&^z{Jc6^wj%_H%5R3$ko}#&d45MX8-iW(#-ys*ldge_6{H`E07W3*He0c zspVf_KiT^U_!G+7#?A_8Ne^(e{saDJ?_ZFNzolqq_Y=?>^s}R*{S&^YK^vP{8~u7} zV`%7T2edW>(f>JKOQ3_pPZpoXY5F8s%b&vi$&Q%=<8M)zD>#DeTp6u^79gcxyea*` zn!sOjq4~)f{a>8@HTKs4cN74?>B&%j0!Z69KM@l6Ed~dhU$NSjrMmJvp*32!p8W-Cdft3n8v}>%>JJwe$fB`%!~mvW&l9| z1Iz1Q_kh1>n*9Xu`~~)BlMK+o^oeg5n%@l!fG2N54`BXlxF8opkRA9ZB+VZnf=^EY zLI7$;Mn-A?FMyi*HGu9HD-L#MR==dgXzyrX?_l>Eo*ux;&iwi}%%3ReezrZ)`UPwW zvNmxr{Wp|&j%0%TOi!(X)UO$T-qQRr(%1hY z*FUD{za!RPc<_E3bNX-Wy=!b7>2@Hd>$ls9 zi?!5yIFJ0aBb+g3ks#aAs$-YCy7rUF? zg%Kbz5(M5PKnxpjj37T^2M8Pl2oNu@$dABqfcyvo7+3_Ge@3!Sg7q4XeRIzF9`)6$ z*)LL*E{Pd+ch&d)&UfDDd~1a_1$BI$dOpI|a{^SKzzGK~e(L~)eJdbfgJpvDmKczU zMN9`KZ-#8CLeJDA{34z)w`0Q-_>iSc{=|%)*xzM7Jb@4KpzUCZwxg;z^uTmfqoKoF z4doO5Tm15d0sV$g)ddYW){A@+O~4F2KmGvb+}C?XoWX(s+c}bj07r^v@GTmFcovNT z8Vl`sWBftXRNEG1qPaU>4QRzhg4n8}1d?4E0y9BOVR_Aly)tJ)*Kybd)T61X#fl>jc+Y$ zjIuRtbh5o*{|E|XHF%UWQGMlXm*^la93gT1@hw198nQ4-$2tYT5^K?~VYh3aM8Am~ zb`GKk9unxRjQ@aX}U3P3dW4*1DK?%>M zda1Y99lUJrX>H08)@0||t5Z~sy(vWhX0B7#aF>(gMfgT=z|ll=SdLEu4qajnq8F?k zn*$CwIx^Y{#K&=cO(`#((vr@ z$!ITDF9(Fw5@TIfjLK{4xsqPboXr})U2>}u&EJ}EOmes5pxsG<_Gk{+&4z`uKtYFu z6dd3rY%z(%;Fr_rM6hC~;sZIZQ)IGEk*@;qfnUHsof6Y@3XIYzu}7zZB|4S=dj2V~ zJEwxjITd`(so-T!iGMjIrsb3~DyPVtloz~qoLcaw%X?E}i2Nm0OzcbE#a`wDucQ~4 z7^_p_rcQ~8Iwj8O6xk(QrBhsg$Kx_ssk zmnRxyY!h#%Y4}AhZF*L~Bx`S1W}r%`?J`bJldEIgxM5t6h!9_~Gxn7)lH|N6jaD9^T z*t3QXi_`=BX^X1__DQE>tQzjnaZozk2hnQCEd20C`t!jM&I>7`hXFjVHY->k=LWx0 zS`H3=1JgJA0qRj|JrnT2BA@hS$3=(+J+Uq!%fsOEyvbDLYDcCs#BHPMdIb`EfaULcexEN!iOR$n%QrMT$1|;Mu|R5yL*J2u z{IF)eGEYihg`)w8-8mfli0SZn>b*9~Rr?Ed->zg+@AN z=Kvmr{*ZAM5Fb#$!qj+Z2X&F{HJ=F0Q|xccpw9^CORrJ0MS z$hftp9X!hmpNBpwnp?)wl6-?&=#o_HHrC){J+mu#bMt02#MK3q56lCxNI`VcVANb;`~mO3 z>a$?zguzl-JC30pI!x%550*EUVDt7%OMEaeN>peYOY3!fRj!$X0duWguO!>oTf$Wr z4FvFN2(h2s8>|bgjELs(jy1Zrey~}%SM2nJeQ$EBM!(j>Lnt?q!r_U`Fbq6;;J=oz>QEX z<7E-pg<_=$qjli}0L{Y>AO%G;z<+#3kMW-_`~xry|GFNpLNDRd#)rpL!Nz~u^qdzm zv90zn1_Xh#zfyVZ#5O%L@kBgx94KjziC=X%}{em%#V<6*}09sh;|@ z_QHzEd|(8SB{D6tmGzMi!uK7|_gNpT%3UMo2~*vR0}9uTk_MeLxc-k~wfc84skq2YDp=3@;#&6ct~ zK(_!QncyN6%+L&QeK>=q>XJSM+Gg)QVIt^Tf`_JK6zXdDNV3+^q)1rIZB&ECs9gbZ z6K$%RspmQ)IwCgOqCPuqI68K}im$LNn21B>935gkHu-DxD5#cMKHQ za8EsJA({HH1}rUeJD$Z#a%QhQ+btE1Vp&7NWY%#QV8-^a2c&K5{ztm5HE1cKO&uZ1dHd_|qW9PQ#!ry9-nWxC?``5HJhd^KJCzhz#@nf#-*& z8$RP)Mgp&Kq>}y4XT70g`q?js?wFRdsW$5m!jVpg9nU))4h*2Rd>FYHQ%8N7n3JZ0 z^o@@KfxTmfCB0sNt|z5N#V*H%s?=Y)l6|vT$ryt=I()I@BIsh{4pkDuqt*f(@roF* zj=t^(!LToVM+n`ZNzV%qiybmJ@IVUNoYmxwRWyWvt#J<&sN%DD6+jCX<3b~_7`3R{ zE;0pOERQ@Ip?={D1cP>L)g+Bct5=e{j;Dql0T2#N2f8Cy7wFB0XFi}psLcGbte6Bh zv1%xW$F@wAh{S_5tjVfPRW(^i)y{-fS$|p8PZvw6YNYHC@hgVs##w*b-&{!6P*px8 zOX?Su1$fcG#P#?_8Nj9S!pN_h(HMX=*N}fnA`jjaRsgCm#dmcW+CV@Kb$N`cNqa05 z9|F4S+AiQtjljvaU(%Po3`(WRM}6S)g^Z=I&nvz@uV8)jKH-VJG7%yqr5BWY`D!n2 zxuTZy~F_a=l{%PEO|#$HD!-a9u3VT?(alTEuZ? zz({iFF@QKS9UCD6wLEJDZE0nXaP;Kvle9^vk{@O(v7^xGrXCi+s0Rw~we=mjHEMT7DpblNa;jkYz z+InaY35(;3zeq6;-dIk<`; zxFG#J1%QjiTF^8VjYUcZd@3@D=yZxL6f%|r>z9;NZB~qS{8V9JH0-U3BqURyAi7Ro zt}UaTTS_Pfd|3w}J>H?AwJ0lbffbGnu)yjeU&890vfkC3 z$l$4(fk{zk^`-otmSO{bqkWevF4TM_Ty~S|{X!6;mkxjfU5az%*$e&R*`xhuJ3G6u zKC<7Nv1&>2^d?`?<-KwZ*S|!+(3?m@-AR#M;2(7FHuOyk=9^KpwPyp-{F917EfrYV zi*H@l6i72{l$K-{D+GyUr817eiBQ*b?XGM^wi+v`x&m>^Vh_Ayw{*LbWmb_OmB1P? zxJqwb{=xkG{`39kJ1?GXZpHf`D`V+Q7+cy8yrJJ=L47H)CGibis)Z-vk~SkW)Fo#{ z=Lw!8zqOP)Mj88&cJ-(FF?B~pDv#n@Gu`&Y59`$1b;gFpw+xluMv;8uCpd!!Uw^|q zGHnN$k&5wZ2rP!A3lZtRG$5Iw;}ljV+qHuOG&Bqc770XT;z2SeEG@tf1!j+BD-y-j zlwDFEf_O&_D%*%KTs@P4KUScWV)ed!V@29hWA|N=IxXx3qM+|RK9vyzBV~lrl@DYYJ6T&F{2mARAVRSl+tQM z^Ow_#AVyUtqg|_&f*k&*jVh(J$kbhAu>fyUtjl%TZo1E;eJ|a_o20;l+a3WdcW$U4 ze9&p4<=0y?-OhoB6*#o6>?K7bS%6rp*f3O8c_8(wihb1TSMwUkI9=q`2{q8SGoyK- z!x73+y)vA)imFmEmOfaz$@{7BwTVqIIJOZTlz7$U1Rvi)dfQx$qfV|0;{BJ`(mPI- z8mlREJW;*n)hso{88zSJut<^miPSx56;B~$HyEqfk=hv4>Hx|>wT-5Xp{MKWX{IhF zHM8^WE@LUrw?omw%Vf8e_$pU2Mz$wCM?Wk{o)5Vr(;Af$th3;T(CZUXCv<+5tl|Yb)|7zSycJuH3^pEvB-~ax#fAGh@^q>EmzjL~Fm2u{h zpMS42cixvt&;Q*!iTq#9J9q9}<^Q{oKV+tNcQ#c%0JNg4Y7yExtB6iH02ll1VHkSu zQn}V~?9O2cs)L}@>nZ2oH(YPcooMMrUW?>fh^{`A@+Gh>);4`~&!t)@?FOZ#)dSnI z81$DE9H6FUAJrryfddMlJeq?*7AQ6bC&h%&1vO$5@LAtGVw>nrTq=44=ANNbJhRW` zmF!;Q>tew@nxJV87#d0h^2bpH2Va zS%UuGYAj!!|F=Z{e-i&E`u|UU{l|W0(tMxa68S!VfAbH&d-`i%|0h5E z`SpMIAN}nu|A&6!|N4{v?$1BCv-MNo`-88Q{^Do;`(wckG~{rTViSN`tb zyut<-b^ehy5`MKu(AN^PV_-9YA{qH~Y^MC&*U;XLk?>_nY-?;X(fB6r7>n93@-@LJY zt^Dbo|L7O~@gMx^_y2n5qmMrNX(RaIKmHH@ga7f@FhTf}|K%6{>7BnkIJ!Ff7jXX3 zRof3bp3ml21B^fa%Z=N2?}+@bfC*OaVE)(TyI1o6#pHjj8!z;&HX60twc7=Z&*+pf zH|raL8OUs2C4~$hqlwL(AB9JGDZr8Fb+7`V3=7EE`?UK=4K18}k3> zDPp;Mw{ZG?yuE9Pw64?=W}5^FmfmZvqUVS01_KIEXpaofH`<=>d&g)^_PxIG)b~OU z6C}VqD%jADV;}LfmCRvFf$>nt#+Y^$Jx0Fa9k}SnwuhH$;rDyqne;=S0r)#Cm>S~2YP!A{U}6T}-Yi>J^`dksf_*t+lg=BPGMOHTn$6)*LC z=mrONH>?a=+%ZLa6?#0Dzw$c$?!XLoj$PQ<0rSIA#ZQ+Qha_53X;P*&ec_YE-%{Q(EWQdUuW8yjkwlIsio_t5Psuvb_qcn7n0zfL^OzJ7gnl zXRX`n$-3AiG?#9}eA$CW_A2-#cq{Jb+VS9IU;OIga1J^!w%@ zHG7=-jT<I1V_y z!wyRfrNVLmQ9!Q02E$8h2SKR&wv_S9DL|WU_!ke1-g~gEV|Jw(sO_(xasjZ0D6K$k=kC`vi!Ay zxh41NE7%yQKq%vphpz8$65Gce>n4Mwu8qE>+7j^xlfqMCa5ruU0PChf>Q(Oa$M$f2 z;x3?6s{Kx@L#V(4EMSMDwahiZ%^hh=K)+!H3Tg?+^(S|TfCJc#8_9jbe)UaC4AvdZ zHdstzqKy@Q>YK&gfyTiTYb8fIZk)DDF;ua!QZqWXmBVQ(MxvaG5SN=d>hi_(b)nw{(F%bNT#E0+aR~TG144JiB-FDHp zH5|Rk-`-xUb1$*GtKGHUMvK*CJ2!3s1bjvLuvWVj)q3xZzVkd^7R|+Wr=N@Mo-vo% zr?NitOwi%x)AXTJ8%x_>k{cXtKf~T-InftgTs2Bo?5Vv9U7@)#u`wS&6jd_s!i$%LD=ks*|XwAT|X!aD_y_d;fSY8 z7fiU>4G6Bxti0UQ+7RbC+8#^oKu1Ops)q69T8EQgOJi@SbIcj!4dbJyRPreVt!-&~ zR%&stE8;_=eSGZu)A;HE1Ii?j=;<6wNFG-_mh-qHIl&>P> zAg2SIw;Zzt7>h+1%UWk^7W9qvUs`*_A;{iDx7DURU)%XzYp1v&D~k$=Yb#>sC9fooW{$NzRL{v6sD@ zH}_iIH#jjAj;3X|G(c1<%^3k;Y+qHZ2%)4G282-A?fn=dpMSVWIO1#Bf_Y#OS&bxh z!CQ1|pEl&~!48wvKN}_U51~^q#~w zTG!=IRgz1Yyneho@vE?hr>F4m^+bgNr%-$_8inEykUWTGcwmOWUX;1yLq9s&lJqzN zD3x*W(Jxu~iTOm;#qUv7IYN9Rl2Xfp;%6r&@ME+r^})a1xB-1TUKfee6scdyccf6DPn+L8(g!+d1fXHASvQIJAIRN>iNGb&xbjtUvG zhS$+yj^hv0oOYWMMWt+MX^eJ;FZ**0&-V`@r^w-|d*$#kQbJ=Fdwyg~AEx378 z;r@H(P2fI>NN`hLQm1;eN0FQW4DOm8Ss&qNE5!t7vaAJ9>hfY{UA3~n3n-@CDvLriLNdXK0lq8_ya9kK z?ihRs(-G!YM!b)oz^dWL0C_0*A}B&}FJm$Z6Ycn^bu=znjlPoR$(=-r+=+0i1w%wI z!y(g%=N@NjIr9db8kyE62aPyJQiZv}CWhzqs>HQtj3_n^=nviTFQ5Mp%n(Ev$LmpM zpbLoqY2LYo&OXuo&kc8pUe8{;ieG zdi}xf1LNDD?>>HH0FW5FAm9czccH1*x1L~%?xOI1IX*tF9k0|pzgORVRzJbknpj$tS!%ls1fYBmx^0)UpmJ-z3MIDkhLPY85x} z##}e7BJW(Jlmf_SQ>GvS?KJ~gNMPMs!?0WZxMLACh}?(rCXhA0xn<}GgKt@ zN{o+wi}6g<&S2Ez`Etg!#GB*!G4wL8%p+4=|FWSaD$LAgr2@n7PiD4S#UD#rdNSc` zL(h#RS}yJF=FX!>_n$uB+TVWiVC&nfT$+krYkA97jU~c6TIDDM7qpI;R|fy{FsSu9 zpUK7qlQjar6D{E@o}K4afSLMcZ6xLBdF@ccP+ zb}~R~0IWm2sYiC($Fzx?XejdSAZm$BM=(R#76R6KU7p4Dwr7n*``QK8&P7n5)lR z%{SPivR#f?AwZ#W!4^M%}jAOj9Rs?BPn+N8lOZ!80QQ*Soww~cS|w|rB^4lUl! zRKr__UbS0sY)qJoBY};UVlL)G0W5_l(m&+Zdqd;Ch|D^L)LS`k68go1)0R zWLfw3WkJkPi9WroFaXv)q@-s&=P=&MYy*8)n)#Zsi-T^Xk|&^Cz5tMP59o-G19LlD ztZQPLn>K@EROBU9EIryB)^+grxxfttsF`bVBPS_ZP9GfRaKq zLZ8uv6?iY!NyvPFH96AA2|K6_XiJEN9E?^D0T2lJ0=c$BT-F+HEFsMg`gCVuHTI^s z5&MbLDa1fh?7?6Ib$~o+HQEYd(`?i}UggDd&SnH+f!*Vbp#nb>_gkG1BfqF21zOyQ z^r5auXcLD4{&_wepbt0Y7o%+2cz)H94vZ2fMEH~^+qU$#cr}yZn|6SSCkwp8`||ac z?|Z&He^HP3Ez0N~n+L^}$vGS_2S`JdBLIhng=9KK%%2;oW2)7R`jE(q7CJ&z09)`I z*Nk$128cwkWlEerfLAaJ(X0(q24)PlPFCj0@rCP2fhVe?#li%Xo!IFfr|{V9*&VDW5t-44GieN6%AihR6z!2AQD#X4%Q7A&fqsa=C0OD6!%=N3%zHNPV-z=)zIFDhB~E z5HJ=D+q5A#Wwki_F{*=s95}iHKcg8d!moeWH;19e*PT}+Ov#Uk2A{w;1$Y|h0ui1G zOm%G85;%zt6aWTpeDLvd^X?jAWm4j4WRS|u@4yi6|zNT0s=j6^?Fk0PKX&H?IpS-7v0;$v^Hr=#%rE;`!62tYHd(TT^K>lc#;~o zJRE0_Uv08)WG-0tP<2{dh;Kn`sxqlDqNOM?ao(s*nL3tpqzskDCgLyX`5~%DXz7dy z#OMkpG7x6W)Z{FPSgG`kbsoW#GvlWSW_N6k0wdZAv)}@|hbM(VhBzg@?h1kL>iEf;|;X8;e= z8623^jxnFRYni@fjTgxw922^B66sV#MBps-@Yc@I zm~9FO#_>7OlX)l6A<^)xRo|t{6N#pgS6M`aB6)9rAA5<8q!8)EilC?$dIh{=NwL&K zIRjlFlot=vMbDD^4i#mP7Bn(;JjyY4++CG65yAj;MiCFtUGgT>kv1Med&GxHGOHQT z#-6GeqcXv6>P8;;M$1La8?Js3-__*HoDD`+a-t26no4amVQhp_qNE51NJ*(IGDH|C zO56f&vEqSn)5!Y}uf4*e<>?M5S4u>SLBHcmz#rvI9GTmRCQhxC%Bfl71ZEznxK%1+ zyzxG(#d6DvqXWMt-?`EMzUhfWtr7QxIQN^JU3z-i8i6vgQ}mga4;qiJ`IT)XI((v%s$Y@{WO)& zEHUpACfdu!l7%_vb6^I!1TIx%K{HYfrl+K7;UZ~#dS(nIwkir49RM#F36RYDLWsjB zL_=u>OCWv?fzvo*72rF*J2GSuM17=!;sPChMJF7okm6@ng@4oqbOC;d30HZNBXU`3 zq?D;dnvD;Q>njs1Y2xL)#4yob)>)6~x=eQnn?K?d5^vlh-tx{`v}w!|>}Jx|Fgr^i zwJBLlfqJ(Xwm>$QgY+yfrrnVS9h9h%J?_CXJRB9S0Vt%Xg{IsT=yO&Spy|moPQU(k zUj8KZf^KJoe;6NEFtWpI3%H|i!n#|K?1#EyzTOx)} zv!uX#(ytN-Svfk|>4D>k=WdE&ry05A%ei^FM1wPn0$Dt?-gY)Sompa`bIN0~D;&8M zgvwoWp^a8cX<7Se>X7k%Ua}u+EdwhG))tW?ltPFu;mJXj0sJT%W`XpD zp3AMkAP^G32}_BAc$Twj*@#%)|Iln8*vjrPx3`k(gp|tKoRw z;cy^4WBbf>IsYN_w5WO!c6rkn#Mj8MgF>!FJ}v>K#hn1v>&GV9hbi`s;7cR^_ zmwi;6j++oKu-I8qn`uHnGnppbldpi*UoT`LdW#FyHe8eauppIPbKaCMb3SsZsR^P zj7&A?w}{M$HFC|qjXN?bNLN4I3CH8tJaqN&8121H7eDZuBDk#^ctT*D8M;LVsuxX7 z$}J#K6SZh!k12x3aM%%ZW~2@ew;%0pJ==e<{Vcxe+Vgq0J!&d_47qN|qo8#kxVhs4 zMjkI}Q%X3RvfLV;Hzgv#J>-p~f(`Q=`x4*4=;Oc7} z3~`zV-f^US2axf4F1k=*gp}GJ7_?g;3oOh;MjJ}OIop4WdqjN0JTi3;K=OZhw>2Pe zc)merE#)4iyU3d2a4365lIp}`5o4H~H*v%457uy{g9!LZH8NWYtFbPO>-6a)>|?qEnF6Aq;u>A=xO-HCKz z_EWw$lwc`xGG%@JB%^wkbMJ^ybUOex5H}+Lm~qE2uGOWeRhoYRA=J0XD|F1_MVg@0 z(#e}?FqYd5jndF{7&_Y-fb|$jSq|N{O7?YOzvvv;j#bW}M_to)FrcvyO_)8QXcpS! z6fd0N+!ZV1!9maqj&~NARNs8rWM-*1Id|8Fm}Z{B=kGt=md7!FcUTAn3))oX0?m8B zFsI5n<|dmIjnrlj2M!}tDQPB0B)TIEIx+%fwYwvJ&f$^7)e!{hwhY21g&b$Yw6c0L z79N0M4La}O8bg;N7@%9}ch;pll*lcZm==csvxaAAR zq}lelVyTiRTfW(eX?fAf4^wBs(Kg$#RvCVE(#KGmG^F=jg%985@!#}F5<3rF29Lc6 z`W%LMQZomTwm03Ggm%nsV%bMppuL*M{=T1jOAOx;EGY;5AQsbs>aqeyjGB*aUf=nU zUNx)jdK}mh$v~kd5H$%2%DE6CT5Wx~&HA=J^g|_Fx zs=H;>Wnua+lszRS!y2{=aA=d8v?OT48j*!MrG}39&=NioZAn*a(MCBv4eqzD84maN zWlVYG80{Z2pDZKfDX!d*VW%-QTFh(U8MX(24 z1dp*VfJZ$RhP-_uZa_N(Y^(Bm#swW*IpGv93MImqzC6fi_`p1XfU^#nV;^`PX(e%| z5BN?49QoPIKF8MLwm9U3ncP5i)!dBnMC2=4^%=lVz^VYymJQ53OT-p6>&-^o5!Db? z3{_>qIHUXy7Zr2#Ok|pfpint+$URFQ$jEAz6Cp!l7?P91IRBSYS4e;vY;Tklww!k1 zerTU4xF$WQAh^=)pTGkXLsC{HEqO;i3QOn`pTj$1FUciZ#lAcr0Kz#ThLjm4nZtw3 zm(wMn=<_H%(}Jcb8HMNfiW`XsxOe46La7#21R%OxU;gAwC~eLKrOgFL#^r#UV6Kzc znX4wy7gCT1V1iH+l4)=&NMKZKl>y{hg_I~}6Y#UDqaje{L;b!qx%*zKV1Ih+z*K)m40hP`1}DX@T331_6M1_==WRsag9gefI)nq0j}Aq#V!vgO1nYh<3X;W?(b3I38AQOsV^|HY-U7acm&QcuLB%*c#!qDjp~x=XuO)=tW>IC)RS9uS#mH)6 zPRNWg-Hp3?D8B}o&1oUCc^=%!1)F)^KXZqB#%a;$j)-;_p;|l;Kb_VL-3hg$!UO6! z=T3oP7@f;w!%%h2fxAk;Jq>K<6VBM^rwK~aO|pf&ptLQ#vMGr5s^cRW104n1#~RXT zU~-*skZ?=@2^RD)PvQaLm2|$ug;DmFuL=v?jy!c;S|)OJJOkbcySe+QVMNnZ<$y(Ow;v=Lsv5>K=Kj@zSBC$!ry*@d;Y+rRjU84{va#1f# z=AzC8$yAE6*!srOMyK45V^LI`!`&ywRwZ;Ihaj`Smm8BtXD`TDbs?e{5vQBVWx+8^ z?6KeuYK8n^@tVRs5y%um?L_-Ro+YuB#t-DBFsc84c4Qf!Mv%XvQJ4VbaQ$D*zBp(r2c_7D2@Kt>GGZ2soMiHIl^ip{V z;s)cGeIP&7KcP~t7p4mJA3wtP&VzaUbmM-_G$-AOSis0d`3@V={TaO6k?9Ae#}r~! z)~N))#{#%rDd+VVUv-Jlk`NP(6uFONll-uTdWY58M9EyKqL>JnZD-*3eQrm^iAZ* z(4W!ObRbgZ7Xu;#1KJodaWr@Ls>1XOnv@IR1dBLA(FA(z^;j%RW|m95?l*+1EIDp~ zZJpzW*_BC0tUPe=phi$3^%-1rkj_I!i9ZJ5Iv`t?tV|3-!u940Z>WfdmMBHQB9LCG zg^cS5V!1~%HC^gff=BEhDF`G?(6)L69P zns`_i$d@!YT-!iB*+BvJkaJwh<;hg3fQ6AWeg!Q4U#XJc4=N_3(*lI7qsxe_lCWL@n)lflvjc% zkE&EFu-B1Rs;-{8Ea@&e^@cYS8{W7R+wkVZ8$Oe=;HlX;GPB-Z#@9tY{mA7T!JQ{D}ssmC%z@^NEH zso=P>On3+y_yTV!r;}(6#hnRUtD3RMk=ywKlz~V&L;$6-Ii%fiwFtwBlh`RL9fcDn z)-^H8(xQ3+#xG(Va{M_1uN&%FyYn2%D&yV9B6v!B4;8c0)p=-$xzI*9o7?q5Z%~-v(4Aq^$uaUq zybOmnF%eBk5IdQ%cpe-b`7Ls{Ug9JQwv6EzXkoW9Grm&MqVdHL1{5Nkx`0LP35!Ym z_L8%dDcT)KVtG0KtnTcjP(|ckkn}Lg50lC^!NhA2Bd7nD&ia-vJ;T)wT4a*f+O zUIB^oq~#_^WvEi#;yi3XTt?RM1|#A$OHq)}6PVqngy|fManEyZUlEH_(4vHpkt^p- zKBdvn&a3BG#Go;$t;uL)IvRy)YH1JAC=~A#=UP%0D%{g@&Df+PA`Qw!>!<5-f4^=8s6ndUR%68?Z$;yRYb?hEGo=*Xg=8*XrVZ-Fp6b#$Sr2ynC<^#x}3Y84w z-q7zbp(x;1+41?VbJp_EbN!K3Ydc;q7wGT@b1c2Q#4{d~Wvn2$)7OGM7A zlr(ieHZeMpM_^1<2BtzJv@wFMZ9dbuU?f}63Ad8P{TIQC>Dnur<@#=>l( z9jrzU>(eTxdMu=bJz-oq#rdUa8w;`<(+nea=g?tkTjA6_QRqUvm&)|x?J(O}#JszX z=lOYao_-bW?=r8O*_&A=W3JHmC-jR-isn2moUn_^f07kd3#i-}Qs9@yvhX(X5jtM=IjWvpBcC%R zr8(AS5E-i}hD~VJaWo{;S#zF^X7X%gDqWh>o{h!jI*F-1E+7T-SU;P5Pmvk+e_kRL z7ZdfiF521ToxT70LY-mWMVVF)p~ZYpF^N|97(=Fi#Eo+Zdwt)p5Y|6-4h@>Qy<0;a>#>dDLNBHI-!e(gl zL%kkpa6LDk%X8@B?v5zDlpi*`ThNn>=(&c3xqLRDyPW{KTlMB$4d`x940N{_2y~C3 zALGH+!}~8D?PAj3P$dB7+44-l0(wlT9;boItdPSdkEE#0Oy~2q-{$yBfEPao5;sPn z^CHAkIyC5|5wPv9AvN$OWrLFQ70IR%VlbwB7&1m)| z5^>ww;-rk~DjW>U4kC~Syg(jXB1~1lzlb#x=YXo9PLOJpXCLQdK7BeSF-?dHC7-!L z;oqXGlTB1q;$GQYZ`JPuU}C@#_EwuuLlql;ePQx-WciLM*|?T8nZ9Y-Ub*W=CcND@ zFnCHRqPdhORnS@P8QiGN;U=1imYKzM9c0HBL*E|%3GtPBEyJm;!;L-TyHP{ zF$EoIu&fp+ZgxT*wQORl&aSPa{2YLxjCGU*i4Q-ymZY-feoH}t4}(S=NKi$ir3BPa z8tiEGBXccgnvshn$vEKzp1%>3f(jQmo>M+j7N-(Bij0qzz$kdODp9{8wM}H2RfLBI zVLE||{1v>4Df14+j$&f`u>^sNVG-_5N^^;!l5vGiT{~xm5}ksWhtss^Bk4t?lVYA` zMNx(+xu07)_wzAc5fbwTyfrcRb89y4CnsoL+T3GaU4rW{31QO8>lSxRl5kcmevD~U zl8c#%NC;FS4~vP?e{rW0nK2+`>K4akvb+VN6^#Xxr%lfvks7(=vhZZYIj^(2P2_3> zpm*@FV$yodDIe*$g$FT+hMmLLLk|@f2x%L+R<{LFXs-Vd<|u`TDfCwNG9>*^ME)o_ z9M2dbP^7xdgwL1=0&iP)$`F1*g7I1)%MzQ0w229mnovo?ZnB8luSu6CbPy;AxDb)> zHLhW+ZDN--wFm-KfSBh`zcBsuHRQ5hkL`axSZ&6<@gnJOdM1jWa9vX~9-z7Rd$iF! zeJ$P^5z~~@P1=E193vQ8FZHD{ z9Z$vhC3Xah@c_Nvi2<^B1{t1YL9#dGQ9bPSkj;aYn)be`70o<~Il7nYjTJ*9Ln{+! zvRIidP-5;wEmdDZWYMOCFX^BNo>(#kfC!ic(j}q5tMo}x?gQelqXuU=KNTyTu!~*$#c2fh%a|z;^m&{T#B5Zb2@jY znC-5f0DT7iS*&%*8c{e0PZ?)-ZJuOWipKIV&NQEM1qnE~F04<4KO%WyzEKD2VnnSo zk)8R7xi;N^NKtyErE=}p!{}lH+4BSKMv*8G3yo!5aWySKH&X!J{6q)n=EMNqoDHD2 zVdxm%lX*et8Pfpv!mGm8SDh&JCe5a~vAgqNhoC~s$~kr-nQcuqpC*q~mC3`ffeKwX z!o{d7Q=8`t@ToOM($aa4!yy5_B~fPI&pWUr=zDMyimZc$`q$~5oJfECnn}w4kjqq z3J;=R2ojOvStv|kWSgP~ev=AMPfod#MeMDcA~K43M~_3FUZx z@hZZ9V)6CZLsVHy7i~SMI8Ve($^t-E7<*{*ymj)nO3j{B(AoKbC3GUt*nPUSG8#{` zKXjd}cZA921)%W8FqrcIp7LnUM6*K6?=l8>9VAq`u>cJxBfeOqEX9k7xbYGM96fb8 z9a?35qPqyyjW2q{G*AKJlwc7E67k-UfIEITBObLKX;>-sF-+7Q;nkaTJ9#3>K1~Zv z77+-LsQ^eC_dllVISBZvW9c;4mQsnOc9EQ##Q_KmdB4g~OFGLvujq~L0YrLhTpf%; z9_Y4xdR5>S@aXXIbB*z2HG@a+Ar$IY_+nyhIn03<1mvF(dIdZkLP>^m;hQeC=DJEo zUh50*d#2yU_@a&nC!>RD4haei5wQ4n=WwLJ+wL8p0Se8QYH9dQ%o)MN_8He8RnoUI zq;EcBVL?A5+uf}Ec6KUoEOjdy&w#7jBjUCNbp=u0%|==$+?RytyF<0~i+c^stFrr!%kU z9pmvyXn}Oj0(nZ4G^(4q(-tl!T}LId%i^6${2NssalNma_o6PGR2-o}S}Sqr@N%<= zkN}+Ui^hXOmqlKXeNjf;*}-pLQfn{n?Nf8sTz`Nn7dZGx7&P7Ufzp=f*9{z#GvdHjx!46=*Dh1bI#z1p%}l#jh=xX0-BfcLg^3o4-r`Qr*cfk=qLI@kaYR}`$TT_P!e}RS1Cb~yw7Efz8w5GobIC*` zj8L(=J_^Djr7n1QDoE3~+m_C_-n9}@uN0~)WM-PLL>5p^KM|YBnR9H$9h18@GF6{@ z$H;pV)sF_6WLJgBMZ0#4uSS(9_*gojJlz1MFe``5IbRZ%x0o-CIO<-E*Dh)LL)I{x5 z5d#vJQGpeuA8*zgnAywR81Fbfw&8|sxKVH1jkVmEw`CPiNgbf}Z6)4;45gg6A9aB+ z@91{DaVyc0ygPU?J*g?J)R%8(_B79&=xRXO!?M0;blu;)Emwsmvf4o^Zo#39R;~$P zkhs)Plr~i9xmGc61bjs?!&!a#lQTy!_v)(jYP?g-0F>xdWL8^9KP#diblbX})z8Xe z`dNFI7XmyF9^=4-iG%)eD+ zzLp!s{7Wz9Y*{4V9G`b{-afQbJ~n^iLi$-Lo|#N+A^j{D&rI8~kbauQGgBbU)6X3a zT{+QX^R#?BYB?iBXr7jDiI%h7Z|7-wg)euWOVxZ$H;QAtZ02ctIU04AU&ee*Yokv4 zAk5QrQ*SzL4Ne*Lrs^i!WSeQNO>{&O$*qm2;>Jx72?sVvrSJ&fC>KU}jEbIOB)W(= zV=laC5>@<9SbF7!o@gQ&geVD-qVtj6CV_ubg-!F}4Wyt%Dwn5pqmz<@)R5p^bpY?G zedZ2@7$#PX4{@I-whZdrFynYVypSn2Sm5$nMc3m=!HOHt54>aJIn|053ME0>6BO^z zKprsD?;NzflOj(=*(zFgFmTM#Dr!}k67zm}XyYYiR9a2|-jM5@GQ8uWvVQO_(C4BN2#MXp0{6+iRx3Le;&#a!85 z=YVw%_oazNRUffnviblUrm7|M{i^1A9T!1-AH)|UvL%ir4Q6jFO_Qnz(%Q2 zUR$s864Po8$lVt~Un`-1)rtaCqShkXbby^F=8@eKS-2!93B77L!%zpN$6QS#ArJ3o%q6q)Hoi(6^$jYopOw6!WOf)sBC@|6)R631 z;uH!qKTUO?tz@CLNr92fYzB?o@XgmlZ;hHV)ON}h&e^N3=Y>qy0^PvexN9)*!HAna z5$RV^(yc_7-r=QY!c{?8)~fkjG052II(jK=MXfz8M=n?lDZ49aHQ zxr8gAY6Gw1d6Wu3UYtf#Z359*sm15DUT=HW2#*J@)yB1}zxn@gW2*#jw5W9*;1|_L z1OD#Zx<#LN@7$)(=5m8R8_Uag8t@E$-@4OSY20o$uQi%?Zmrz9W;8Bh0fuPKFpO(` z4*9v|Osj9ZXG{|Q)aN_$S6ILPU}tmpi>F%#Zn^RF#ix(9H;rPoUjNq0X1)Gk_kr>4 z&vzd`LZoEu`lcHQ^KiYs^#oC#JkQ6+$F<`XI?21w>L=J*6RV4_)ljQjvqB^ug~B>@ zdeV2?pq0^3^OH|L;q?X2!c0qGxIW5SSfh$bNRC=Xp_Q)g0<|piC}=knWD{FhL*C90 zSlAkd-Rj4R)br*DwdXN?#*MyZ1_x_KK6d8ywFb#;khnLZalrutCQ0#qluo10%@4Is zfG&p-k*DAFjmg^?jCwpkVO&eRx$!K8K-@=gA^<90Jl=Y;dw+L(=gI!gQ~Y>tw2ZG5 z9eMHW(f+fYo!wRZv9wfCFTT0;>^YRC=f)B(m-cpZ=h374PoHn?Z$Ejk_3c%oi|K-+ z*AKTJZS6mQ@sKjtED;{kDt~_e`Tp~r7tc1gp!LunGV$iknjjTA>ob0`M&Ng%C4BXI zh|wyqP=c7b5lZ?IbUfJ8`5FS?qTH-m%|rkJGEbZ*$$-pan#afhEtmLo(UdaH$hwhq zl2;#D9aaC~(5I-@trHX7P6OEt6Tej}2GMkRrq?-fe|K3;?!*lONvpVBoR{xREO}~c za=U&~+`!$;VLB)2JF!oByP7+Kr^UC#`T~wifsbsdm?iPZm%8~gT?*kcT_Rm3_LA^z zt_M4DT@I%+)hH*MaAMC>J&f~X&uei8SN8h`T7|3aQ58S6lyT&PfuUF)ZnuY_b-{rV zp!-YP4D5~(nt@D}CK3x+1$s>pm&U*w3>_dX!cAHFHtnde$8bedE!ewRm|sp0V72(rXf%s z{<+w;yF;r7J4PQVrQ%@Yseq9|97ZCjAYarGy6rN$W6MPelN^RbSWIEw5k9tEo2N^a z-(r_|Pt!c*Y~o73F0{{R=Kwv*MvanVQtUK0<$@r7OC&Yd-D!9>X-uMm5vy)!2&FCE z{>2YdnS0GmGjps~%^P6!HhY-2%Xl6OHZj>UG~erE?mp?uqTxP}ojjK(qJ-U}^BRvm zH=+_%LRdxeyi{>l00)>det@V4RSw+mS!9SMM>EVhizp{TCMCMYMBTz5sTy~HLJwAQ z5$BHC?1XiOA<8bq={^4a|iarLLL(ja44VG2>v`pt^1 zdeC-THeJ)Mp4YZX!}+j(0>h5gVW+dL3^s%Zp+3zv=KV4H41_m&<1o4W;rmpbh?2ZP9Y zIqFe3Mo+rn!PJ3I1ugJNBUbYo!Ge%s;}x2xv?F*ggad=ACG2Ngxp? z=&#N5k(gQp2R80n{0L2hJPyoYxp7yAL`gAY`lE=D3P)CfP1>Wv=g5w@#&bm6Ajyx| zQO$Tj)W%Q;_1H&r;!>E!c^($+=vuTuHG`;=8c9J!7FkmcrEB_q3uY!#j}AffFdlav z+m2(p8muf3QKIXvT0hQ>5otWef3g7&frI;SsstN&(#YLZ5?y{c^<+h+IA0@vu_TcZ zavbKJqA3Ec8sX5#{s8$hB52q6o4A?kTW8 z7^sCgCG8He3Yf(W@wmtkkoLKZZVu1BFpoz920+e2O8nrC$p0DJJvQA?=C=U)Q|GS2DVUZx@sTxkS+)axR!G!k3en zY8RHGDl_9#nD29XVc-jS<>xqYBBPzDgM76y9)P&%pvYO}r?9w@`4%1nafruI_Xfp{ z8@+H%{%^=QYQ0dWxbcCZWpOM_-vo@QKhiTn8nM@2aif*_!sV18t4XL+%jxQIP8Arb z$^yTLNlZE(l+yO)t!`7*%*aSO;mU!4aRbAF*E*(yCm9hEHN&62tyNGS+%wK*QB&Z- zFI$);Jr7c{o=>)_$)+l~uzeojL{MIStE=;NmLv&V$v&essS_g1&4(}tLM2@JP-!?a z_8^YZCdY%_c%u_-$V9lOmGvCtbI0trEi#H?b0Pd5f_Oc z-ty5u?{i;BAJxaGFx@iaG(WTPwjecxW1aW21 zyo?6TxfJ>Dt*P)G(x^|r3*ThE-93+8xH9LxQ|7#P#D@0+b(UvX)}yh<`N}%=wyaZ& zu=HGZ^UnKc(>auja>3&sQ&VIWUktaX2_KgnSIlelv5FgCr#5OB#5swMKa`zQaA;AK zU}HOZv2EM7lNZ~zZQHhO+b_0l+w638_fOBv$5h?F`+KX-Id|=|79<4fg^7?rYg>ME zy3Xj51P#a0FSqTQmb~qwL@+$M-&Bk!_@o;A92yWM9 z3d7Je8&{M~Gu0ChlwRqrdxtAX;H^W9mFc9LH$r!~;%ZK3@Je5pL8Z9}c2?P6`zA}w zs+4gQuqc9<`lH-`5rlNM)r#CjXK{at5x|mV+#4(1{@r9@SZe+=zxiTo+$G`V;-+=b zf%;jtVot;oB0UyEtaT7(K@RCY+&l$h^Ty_SPnm*X3Nen>&B9>by(w82^+$z^LoxMuoPtLymspHs&S&=Q71u_6TuQbmepRN<9}3{TW>+HS^1e6<|ta%ybBEM z3vVxJRLm?;n!9OajM=nRy_Iprt)^L2bWW6L1)qp3fcYba zfSlPJBfX!?qkR4i$46NPmu?@UAOTC;BII`R5-Dr2I_qU#ccbODNTs*vbQao9vn%W@ zE8BnDmVTcN=+=Ra<#+4jo7fXII@7)tl=U_#j{Cca@_U2bH!t&zx0n)+1+(pizJ|Ys z$eAB`5_<;qW{k$z8cZz^TxAsZ9< z=uF0T@CibfWW!5O&=i4q4zMuoZeRA^*Kf9Cp*^RlQrYtajq3#t=&d-m%X4RXCmHaD zQY@EN9rtznjw_UjmJ{UWOAJUgrGZLn?I`j{3G>f%-^Ym^(2lzQOBN%F&Q{H%&t?s? zh}zD8tr%zRK^;WN{%6vop%s*^kX&wap80U6T9f;L`-E1R#3@?zQEFj z$`oZXn#L23!nB`52&Ji;wh;NsDCOGB^%2iXyWB1!yHwqI6$i~n4vUi-Y<|?XticWQ z{F&85NnpSZDWHf;BGbmwD61E3>XUfGMKHM8JZ^5-o)?hXD2)Dn+~4LirJ5|Dc*iiU z?oY^b_EDCLj%Y5Rb}mqK2VMO!ia{na&_t1wDs_~goEgQL6owd`6w&Qj_7?vnc&}R6 z%hfS<`q*2b_C!o&>SWl5v8Hf2rpZ2tw1w(^E|@e{e`IRhP^QpVZGLX4cL*(;uN9!jWeNWiZ^>R(HXe@CHe?L$w))td7VbXzj)`Cz;|d4jZAu|ML%!Ro5N zV%VI76nYDK`IkL+>Ve

9s5IJ&sqt!o&E!U3NXi%%V6Ly*IGHLX2HIC&fA!>NyB2 zrFXc8@FA2&JV8R%o7!!s|>yLlEw_Dz=|+&(+EcOv#g%f(8D~ZVcZVr zkstiAH*i#V;T_{#-D#;a_96zt4`>IxHO9<&6z$hcTUyj`4_cQ&2mAXTgbHkpwCqFC z6{CWpPxXc&xPh&i5|S2*9VY4j@c^FY@iBJf*wQyT>eVIs8v<_?RUEmp{Hz|Vjjz-}XH+M+8LbnWy2kJtZqIpAb{JE`+D$%)s&RC58Zx|^>ltf^ zCrjC<7_J4-JOYVH&Bb|IN@vzlNA1_@0wp!;9Q4+y>VgEc$yY^ANVP@FZdEQkjn$P^ z%r_ypsV$bq?-JDS*NJDFduVYB7u;N0>bp5vzO#O^OHqqUTWCI^df)QX9AYy83#)YO zG@s~Y=%Z-Nr5c^}S;B8L{4AkF{m54bTgV?7zKa`b!BU7s11#h%SU}FkDbeFb`Z{6P zf=r?LD{MkoxlyxC7B5;gK5**3yKkfx+5T7bZ5ga%H)Brq+AC&E|KfIW`wY#NZ(u+A zXhCn%?+CLGx#As_j=@lJsouyPL-P0U6XLzcMFJ_O%4a<3S*a)?E@v%u}Pi#HNRV85!~ zYPu599|dpnGQyHf=om)`^tH|x=X6tfXX$c0ljvrwUO05?G0_Gry8hH1qP|P?-H#uB z<7RA{u8h#Wa~4o}UncXq#J{gTbkSZ&5_#h4Y%>XbP4W^Bqt9O~WZb!z^>59%% z)h4yxBr|S-jCk6bBXe=(?svMtE+x$sHy#RjWmYzMHA^B_&5sY)%u7F~JTy?zx?Rl7 zp*YSFtVSM)&fEyLQ0Y8wLGp_^)9RF%sBq#%=e^QfwG%3n8YPjL4Bu**8YKbEoM!McN(WNecHE)jHk!Il|0}+( znrwfIkzgXr;2DD96R^u^FELd+{PGUjrug`9C3g5W9L~en44ZKgjb|-8yj=p$DBCL^U zK%Z;^ZzOD~pY$~vWPyB1{eQ!Tq=)HZg24CoN9$WI55&%P8Hahl@5=k#x+5JL5P z95suc#ygrJnANYSeV%m@+^GIl_o*;gD=)!JC;g6@N0yoCiHx%ax6hj*1D2wXUN+<- z!PbKGyNV-p^-(E5zktGA->e`&q2VYpsrE>^XVH=ZSi{K$sK50@(Vl1({qtn4Zarwy zOV8)nHr<0EjQ4d~ABGLuQ=b-Cc|i4YobB%#Vz6wqzboN|1BVWXet?}_E=h@JHH5n5 z;Den30-7!fYPFIzt@HoK%iw^`yDg#d9i!NXG27>E=1d11o{8|)x6W?TYn|SXJ7HQS zZ4>Nj@Xv|lAIT(;-I~f}1XcUKWKCOwYZ6sE6ntA1X+~r>hKT}YaJ@?LS~8UOhWOXHT;kMEm{@%7;j}bt2h)S9>=zCiaEs03Q^n&{w!vI^O}G6IxQg|5Xl1 z%kVlWXHwa^yYX+#gI=%e^u2$4q=N!m%xcAetob(xhQj7@Mw*^oQy(roKWs*M|D~3% zAp|~hvx*gu1;y;=TH%}~U=FCgpm0sDu#xm=yKn(7y#vRcnvqpe-Y1%xNO^6O ze1Z=+ZtTdGM4pO|N7=;TJXnUMMB^Z`wkR`q#d+!j+z4a6kT1ITX&Z48;x@hIXL{<_ z-al*lS1{!-a?g`YICg3bWuCqG8 ztu)n5w~<_oxke1k=a{q`;4~F&7p>$MRq(&Hk-SoBoo)3*5wlk!6%gAl#GGlyGoj|o?E(_3hl#ns>gS(dyc5!ygaR<7% zP=xKm!k?kb(XP-Fh#!++ z(#~Ar*0&|*AO;YphZ}$=!VNKMLmd00CiVt1YffH>;HACPnWY_ul6v2O zA`*d_GlC-+Yc{U+ATk*-`CB1$MSMo}@0{n#Oi`giu6kgH#p72geU6X*aM#g9wl{Q7 z172WX<24}Od-zxI4s7UO;fVsi^=bz5=~J?)BYG_)~SUcrD^|;P}*1N0pIsF5B?Ia`y1duKYhRh3IjZ zr1Zp@6Sf(QfcAf5iVT9r0vYgCcLUrto{kz;Ad>!xGJEzG3;#zR2aJ!B9pEBSc-3eV zL%RZd4S6}-R9r_ET1ni+nY0P7yw{CaO8Y9dvMwK$`;de+eIVm8+&_%s&mru}j#&)xw7T}WbDHSG zVaw@xeVltPQK(wJ*wI+4`hCSq-}Ci$eIOQw8LhqJ1l+N*<#hg3O%~=xqVivUAOzmE z|78avtfod;E?-FOIRLAU3dzXzx`(W#Q)4#K0Ga`+1T}-TP+q&p_XZ&jqk^mG?88Rk zpt}hPkm^HSj&ptjMr{evZ+)-dw{mk7R#)6?wlB0z@9)oum&0}wsV0dq`Q2ifx!d*m zVJL6Xs9Y>+Gl597FGJoQ=Y^%`{}0-5!s%a45q9{guS(3r60<`A!2Z9o4Gho!Kel1X z2^guvx9QW={PQ_H7`kz56Mh@3^7imC^OAeh<<`;;S{?cw7tUt83{pJ*tDX99M^NR8 z&~dCq?QbNvJ)Yne(P#EfPwvDL!jI~an{3R26bK^j_oizSc=|ANWFnvj?LQ(9CG+NV zD+x&>cWZ)`;`%&-UlR$i3+&M!%vAve`x@mu%v+#}zk#c;?z1Z#J9pO&8z$gEYXCtF zzoH*@x*MDgKPFZhS9H0E2gai{P1oa*lbBQUI~w~-KP;s@5=}}IiJ<%9nt9n&!8Dmv z@zn5cV(x6L^R=U(a>}*F0%oXPsSOLH27IOg0j6pqOth|a3-^lINz!2(Zjd<~{{>TU z7_(1ACL_x~aqk%a7=%{9P{so2>8)B1U}*ecH;Pra@(<9pZj|aS@gJ|A5lVFq8h-Q+ z97E7P`+g30=fRmPIrHq~J+R|OgP8VjWG*0{noWeZFufga$I z;3H9532`y^2|()+5S~L?hAqnNQYOiD$`eVR+zI7XElk?`9TL_f5v0ZjoABQE-;@j)8h-}q%ofw7=WfE&RS^H8mdiH+jCJnPQq^2*TpXigi zv-l%N^gw?8PSHO?N(He>57r9}tquph&6uvy#yrsi2v7_&#s< zv|AIcp-u0+qOgziV4Wq2M6dP@GkgY+w(T2k)Zc#l^Bv7Xe1mM5SnJxNHT21XhHbPRBU|7g zYwW2AJ5spB+16NHgSc=*m6!pQa)t84Nw=j?mv#y*-}eWU(m;)P4GSk~vQt)ByfA3X zB(7R9d>931RO;x*2ISeC`vsupEKk*Ip6+p%Z49XM;6bHZWyN?isxt+VesXi40|^u* z;ye6(2VRIj=*>L&yJJ2k-@j-BYj+`~jrC?CuNK#uC5z+Ge2V;OoN88o&Y;?H+K z;-)|oOR|%*uiaCqh(5>`sF$Lao>&{%11S`zVDL$c|2CdJJC~f-2TU_X6q`m+r->5! zdcHwmKP1>6%8h+IEf~q;BpQTlNYJoU{s=x4mLZB{o3qEHH=#k|N2G@!MoSD zixQYPi`&OfwoN7g{(k*-SsLi*4x7XFFbIr}s1uodm^!YVbo!{Av0YiOYmkn7^wfNU zmd~FIxctXhs(fiKd75={Fkr1a_-2{+?R$Ku+ZZOdY-@LdC5TS0phvR-`6EVX7ldVy zT_e4=Lf3!(cheRO7-j$q%n2sDSYpaOk?#b<;&1_*ZSF|t%YZv-4Hx3nK3|W`qN9go zgKtpMbIjivcCeNdY_|~?WH|HO~oyA$kl{b3>=9aaK9C@*e6Iz&; z`(xdks-sc1iDS6een6JRkLHYFg%eA|8CnEJ)j1eg??%7*2dH3Z--3)HS_s!?5I^FU zEGzW=v@=YdtT+%2r>bdMBF3ny;B_6GYH6gdv20fw_$Lv-8D6`hTA6I_BeFBa2X*&t z(l|;;a$d1zzPZ-x8ue`s))X0B)|Cu(Im;ReL`dWuK|vEX4wT=ebhqXq9loMwzTr?f zjVgL0#=K^;?`NWwFYCG2H=z!lKHDFtd~vsLpkBboZL)e?cb3oPO(t>lTx!)MyuppXYp|YGl+?TYtrbtakZ!BcyH_ zcfN|WB0xYlw3lkVR+In;?nh(QF^)e5sDO}Yf=mZG!S!N7NO>21%>#mXA4ga;vQ%uYNpOrzHe@6HJv$C$qYD7$L15fFj@`pGGob?27A&mYcfD^-%)E6w^5g z`%l1mAV!tvab$GE$K>Z7?R!oJXhmI~|K?suOK37nJ)#BsBN1=Xd&tiJz!IRl3utOd z=8AuuIP_a_fDOjs(7Zo|lbKbWk}|0PwVu-)Exhwt3=iFh@nMhPbkOVDnA0>3`A(J! z(af=tE>^*&X;-@209ky!a>sO*TB-miML50>r9<2%T9k;}?h1oHAdVGWyI+A>=pv@0 zQK%6FTgj#`1(Hq$HEKi80s4VLlt{~?l^x-}O%WBwYJ9(rkV4Lmm4TQdWYDplJT2Px zkU(4tD*S9zf*Fg{3=RrrFYTOD_+R=7lw}{Ax%g@Po}Yq@3BCpf67bhF6x3%KKX0F1 zx#Yb+B%^+9kIOK9SQc@Z${|=DySrB$N-{{wHcz?pk`{wBi8*(u>^A>v;3p3#4_I(v;U()a~=`0|XjG?OqFyRh@HDn7{ z*g<`mgwg-7oeQXOV%q)aFsqd8EAjnp_QLmGsIrd+YjT{D%o5Ze6IM>dhIg35Hx~MW zvf^@~tERa2x}xnNo>?ef;{dcCPCfQbajJQdREa)06LWkp*L3E_18IW7?cUJZf!iY6 zPg9r7lVSWFqif({MSzfQF16-SUE%iv!$_iDo;O2^RH+S=(*m8bwF@HRf@4=!DLqIB zurHm(1(9RYE0@Hq0u;m|OR9z+O))LTQQi_RQex^~o-4fs#1thKG(4*Qv?nGdyvF%+ zIRE7iS|yoC?Ezi2m-YMTBkNm!p_z$`8THCc&>9x8E+=z5)}TmH15 zyr)0;`29RccUB2w6ZUs&`BFx~Z zPxa8aFdN2P-Kz&7(*0H-R(ZCR3M*~yC66$Ct40mBIH2;>49u4sOsv=llzi?Z zZ4IdVJ8pBT5m`&Qfh{)NZ}D@Aw^2I!yk={u9Hbl2&O=r@-#*|;$Yxd*POClUNcO}l zn!7G|{JIljYmIpxR2sug+(?l7O2{Jt7vJb1MCZIP?MBH|e>OujFX`2PqSKOpv^w8E zP$l&S2`+$!wfrvdQbQgO}e0cwNe7@%;mBz@HV|F*V5_fvv9A~GT_9HKF8mj zXURrFhzDScFFv->=a_5+L+HSq32})nWbzFHbjA*4vd8gVOqt0JEWl6ui12-OW-v=V zpo33zKf*h>x;uFKSvoZ3W4qfI^9ko6=m%jrc2S=8twd*k=h@|yOpaL8Q^LqvcAqyi zioFIonFM5ePM-GQz7nj%@k6|Ylyn0yb`;rW8W3;R2g%y)R{`V^el0v%0t<&R$BN%Y zfDN@DkKzzvl@O>p_d7rO6U+lAzYY3_+0Inx&wad#6fh9Y3RGZwn7n!@C8{teoljRk z`2s0FhU}ju_;|L@AzZ^7G=@{-`Y%?fkvfeM!ieJaAmsT#_28ux@=bmXyNhO1G8i&w z&?~9kv7*F6q}Uoy==uG|_s8H*;$X>?={kRz+&ZNpr|uB#$}3V{3L-{74;=rG!OLA!Nt;blKR8M#yE0&4R^EQ!$8CWwZ=X9z^nvl2|<)tW;( z>2ne3BVtIV>5JT3N^1<*;bhe?5!CGb7^5Z>oMRW>6(FtQ0>q0!JZK)L(cCFqi((I0 zQKh1@erXCC)bot(4{CvzA2{p+1}14!we<|>he$gt(-HI1o!-r__!hZgum6gX*`zoc zVXx3s`&hCpXe|0hjr$2aTAoQwvgn$4g&RB00x`FpX_WBAa%0&FcC)GTjc_;V@;^ux z?I8V6y|1*$Sl-T5XzZ(SYNpgB1n4atRcwk7SNP17!T&hgE^K&j`P)0C8iLX;zN<;G zZ>%scKWW~Yc|%QSZOH>%#d!uwo{6#B$11~#BZ%sAmEWjI&(m(%j1<`(i11cIDYE)Z z0x_5;s1bLswDQU)8`FE1S>~B~9 zXirQALszM3*qHL%`1_Ph=hlX3tL(H2w0$@oVL`djm|n%0_$;`2nztIiK^rqLblr9H znSj_^$uT@n4M~neiM^M&9CsE4-fCaz3D`lSjM2r11jvWxSPESMAQo!5?uUo%RhElL z;sgnjf;ENb2l70K;#;b7q7l0P<Rhwy!w zoq{{Le%#gikzgZ86Q9TpUN@&y8AC=Nk(=iJIBj#J17{tS?Mgj+JiG2l?RvDVDOi5{ zL?fKujx2d8I76e%_zo8?h`_yN^7WhhG*8%z`uGs@q0-)|BxzQwsqZKGtYzB<0bvbZ zntDY*DKpTG=fdJ@st<+<6YOVhsDx^P9JGLI4inpB^ZK&VkqLYi$%i9u`G*EYxm%XW zDk?w@8LWv<`Zp>2*10o~86;xcLCY8x`~xE}=)kt-soAGN05k%h zUZc1l71dinO!Of-(l2TKtVWEAm?8nCdrN*I@c1vh4D?sr-)8=nO>!B!xPpfn5=>$b z^9;930RAGur9P`Dz^+o1D!d{NL?v=Dn}ak$J*PnrRD`liDS%^Eal1I2mTz=C9F$%O z$m1rnOD)bbnoa@;#KU_O7;N2tEc|N0+8B|f<=KW)@4Ovk-V^~-k3VdFMsY+t*CSBR zc6{h*5$msLVqXHF(>{y-VbN|tID+1qbS$Lcug#Vw2I@M!qi=`p14b1SwcEvImxPm^ z0{W-!sEvW~NlEh0* z3~?(c&5q-QJ0J4}0Y~Y$$q^>M)XwF<1Ah>y>lr@|I3^#;UA1|Mm;&}u^pDx6sUr0~ zt^?Vd*j2^OyQusf+hg@5$5KSfO7!qa1m(}D|46hASLS0oT1Nw@p5ElAncz5SWo;wv zbyHMH+!0zf6l8jevAJr}rA1|IZL6b559>6=u~qnQBP$mlp&H^g{EMBmYp3P)4okh+VfTfHa}-cG zk|Y&@ha(UP$raQKfG5jF_IDr1=f#m@RYN|t1o(fyoZWWqj|AT=#fTF(9I#bgV4CC; z9OH?ahTsJn9#hB0dD^10sqeu)0+EM0@<`jbUQLyua*Kn{&$;z-l!iH2@ zckHhf7w;-?-P?B+GiLueG5_XLZF=jKV--s6S{{fR8wa_R%gfG+kGlo0JXh>uR;OYc z=a?)>U4}?$=t+yrp3<>9Ia0`mr<(;uwu_t>lpQBoI_c~8JRAS8KbhI~OkE_slw~Vg zNO_MT;9eGBeky!!G66uzTry}E*~I?lOk5)S_zy!*kk9sf&$>nQ0-nf;x*3>p#w=f=ka*vin6Sir)n51(YIhw0PbX#x`Akjtq;U-E? zkn_Ai?F~j-5yM>XnDL#lebce5>zTAKotG$WM2FE)QSL&V{8D4rvrkw4lcxlP((H0Z zd^@CgTLVMdHQlt@0=)eahUkS*1>iB95YUe#u4ZoNkE7UE5X{bM@({p`1p3AJwZK_k$Qw}K>H(1I8fduiYU{t znFO39HYj>!n59T(hGq@A`{j9_A|4gE$eLQESbqnX$EmZ-zt83Ls_p_^S6JJnvjaCV zZ((FWQVO5@fG(jp=B7#Wa{V#>po`E*6qWr}nT3WFC|)YVUiPRGf3l#`Xo-zN5ms0( zCZHU$@KBliB;jSIoEhT=`D|NlF607i8pgA zYRp^DdU1=w8=i{Ts8(7)Nv6=7JC$ea3)zj|M$Z8J?9VM;Z!_SN8h>Q9c0_Zp$Mtr? z$Er_GvWlv8M`$RsajXv)Cs^>8?hmb~W1IAF(`d`5)l;R{$QRg9Jbjp3_julwVgZjkVM1y%il@O5$~jocD~VE?ze-j|FC)H2LtUNy z-RNXL?GdzgngAOdX(Ka^M#M)?c9pfH^nvW!xGp=C%^ol;aZd&*jr0Amg1M{lo@THv z`HbprAXY_Fy~c9b)PlMku_^(@krQ(CsxN`X+84ao2$^td~*m(ozKIo0^r)l zXLBII$+%L?FL8dyr3Ubc^8|01q(#Vt%)G5Fvz>yKU+>$=tJkra;*!C5Jf7eC`v(*7 zSndZY<%r_@mO`=B(dipChKvCpVQ)`xTUD%(r`pD;AIbF9MIBQCq0teRMOc&9rxlS^ zRtT9<1VTC0u?1d?tQe#7K5qdjyD9iLly*~4?S!t$q>L{c>sA$6*iuqPa{D|zlE4B7 z3zi3gZC31JFV8WxliLa-PrY7_LoVTUT@xx(P=`c$RtOiD5cdP7=0CKiN{bm*n2niB z&J<5+(pE8uNCq|-A`C7hm00WkFsVAV-i^L~gX?zm4MiT5wa@>^vk8StgtZxDLnHs< zEZCR&%eg(Wk`(hNoE9Nq%U4J_os!=8HCUSj#-@Ij%Jj00TgmY*LLSB3vSXwp6Kx^| z+G|j14J$v8j36&26`i4?l>gA)jFFFc5SVAG9K6|!OpH(p%&M5&^pW?1P6ZA3E(^&_ zEZmmRsPx=!pJ6Pd(DkX{0Ix{9#p~wj8kb)#>)Py0r=@)OHnG(#7W?2+m5s`xi~0}R z0g#Rfb7Rp*3D7IP5l1%?g+V1q&zGCz?|@@Vht8LDxVuPm78sdGze=5*Q){~_Ep2h| zjjx+^swlKbWe+EOisSBVs9gv!Y6(8kx5KKfcWhd30G@T4U|f4#KoVY8`@N|2;j9hb z3TFgAF^<0fZMn9$?rH@CFq3gP{N7+=OOOa@Ua@p!?MfveGv*XRPTng^J~I;-wFswV z$&=e~klq1;ycv&ieiVr=?)T_Gw#D19Yxm8vj5CeY{Ao?-Dn}bMI+iZ07}>uX7U9t?u-@b`$Rj zu8zBzMZf2Z9tcfsrxONBE(Z zjhXI#(0@2Y#8y9b?EsZ5HcMCNtxT!8Ly}P`t(3e<2i+W!)L9<$J{_gqFfxV^0;LSe zok>OJ0`tYAkou7cz7FA5`|-Kk(-Vw{grx#SD;|cGR==xUM$L92kwWQ~T#WOAT#v;I z)K!JVqbWk^xP{R^FB0HL-Ml@IVUUWY#JC!b3);p^Rw53(6mj%}4ku@7*Nhb2>$Pav z3S)7d-DX)@9b@y;X)mW3PsC?XHLGL_G`mt6Z5Lx_>Ap$N`Md-vXzwKvmK_2x$ooU< z+o{xxQH;>{lNolswBMqo^otlR!)k|j#4kv2K#am}>=nv4qIM(tD0oX0<{~h19#2ql zjxZaq?V+&>Qh%qF&P;WW zlCa=F*3a#EFxLj_q+Rmqyv2TW1(&BVpwbM_#?QCajI{xEWhqO275BLg3iLImy#OIk z0Z|g2IK8<8aPtWESLlcEV4F?3;^=Ri#lOB{7qZ9wuN6N%0h*LX5{Mv|S)z;CJn{{? ziQ7EJ-57xME7Ty}RPJb}AoPL{@cg6<O4bKNO4MaROWw> z6z#~b$P`d5K|T%6Bi>pcDB5=jYZ`V_-;qkpI}Bxk&9P;djOAIFOb{13>{(VW+8x}w z+hw-_5Y~cGyV@Tyllc0>vo%myhQMzPY6%+W*4l{G%+q?_Q!fRJ-Q>=6l3xEU zzyFu*C)ssW;)sppvOxxG5JBOVYguO=Q z-lx;bL*J0mCn!bGXTx!gHeR#vzk}oee2vIQzRS&m(CdpzkyZhP}rvRCvP3w1RRlh5~y%!#0D0czD=Xd=qx!q8hRxMstHF z6w>OeaaPWcK8m9rabDYy$p9x|_BrbhY2wpyHf>V?^yti2a)I1qxmb; zzE*k&UbUdMsExRgRwa&JjE%_Bv)vB`&YHv2A+m6*T^$QkuO?hCjh7bUz?^$${MSV-{lO%hE@2E$S|E7zw+=@_^e3PmT-d%jy;?#FfWKjtTi zhZ$!d(Y(ZWFjq?q9~R(Niwrea=z=6<=V-kQ0=3{11C3kw8X8ol6lGd}`ciEGr%y^E z8)T#eHK(9VbN}e|RyRB=EB<&x zMyd1<2z;3xv#RtE`kYnNQ+5qRRG1wpD#=>9-e;^?ZHth6dpG^284BGd^YCVBy;CzI=sZJC|2~(?kyATRyX9lE9i!jSlt5oyrD3pt z#Fc*4&AiTCLp`#uT?!x?#a!y%t>-Zb?4ZUVBo2bI^m(1`p{&TwpGNygxR` z;53>z3W8EkS8V>Nuv53x^L#~z7U>d@X=BCBFT#lmLZnb8ebX&|qLUHgFYU&qiq7`M zDOwc9IQqCo%D#|>&Fd*Z3wMk1Ho2%KVc$ZiV~uf#B)Fl&PBmf z1XRd($ZQDpbOe5RBQxk?o}&&TB-SMfXZx)KZu#FWgul)aF019WMy|7}jl4!pSZ%3P z7lFfdi&j^udVxO?e~rY<5%j$rU5Ol8=?Q2vvT5O{rjGyLh3}@KP=mi>$`WnI82&|T@JOFDyFA+Nv~tkG!i%)EEyJ7HB`llgEagbeeeMJEr$9 z{NK~hIz3KPsU15%+lya$h4=&_(zvg6s@>$n649_fz+5yH++W>et9_O@2+J)?eZYIb z#f1Z%E1G2Y0T|onoD6}9wCEM^?m^G;tUIrx|*Mefs^btm5h8+)4#FJv=aQg zLPS|0kn7^iAGE{|VA%{yZgZo<&ux(X6s-W3r&VU~wqUMA5vI)XeanAxaRmIl!tC%Z z*q~kqC6zUy5mdeCkNd$)a{?UJFP)$ZpV_mALd?jPL0ZCH{6hpQ;ab2jo=E|1nQZJx zS>&X^^cvDIqiBDAMmG8l=&-R_3`xNYnfasfmx@8vOwy9p5dWk#OVdD3LGa~>5Vn-H zXGIbf0>`^IqSSh@ReR7J`BX`kW5U?xC?F8K{av23;dzgG*$kytbGrscn2_}yOzg1i zg)ds75J^!ft&^s2_ZVo%MVS}&DWX3EADCaZ2#)Dw2F7S(6ZOZ%ctEwQk&=4avzgSC zVIAxU0#C?f8F#h=4}7J3HTa58d1-dSg^&F{WK#Ff?1lFWc2h!Z-1qx=2=(`+@{)U% z0Q>jR=8)&~*|s8Nb$87UF@ijY1Gb>EDwOfm#hw%1b`k;7Ht#z)`6!2rn-wS>SdtLt z1(6R=I%w#Er^fjtmhE58xw@Lc=6Inww0KJ>`{>xaT(%3-~{PN zUC>E_kgx-M;*8*vi{AVM?Wu{pl|`TB1~H41cF6(>1Pf}cbPvd$Jqw0q2|vH|a5nou z5eh&`j4qRHC&vT#&b^J1Z@t3nXM#Mp8O_Gr#&Ur*CvR3`ph@HnBsOV}IL#p>f z?sS)y18JZ6j-EPClUdYs8kpT64hmChv&^EdE>IJ__QZnI{s)7V>UpFG7?xm+9B&!- zG%M?w1Je!CWOOJq#T_6(G=umpPVDz!UyPLguT#eba8xNBPN+)?wdT(&49M^Vgo;a+ za3jIw9&SbU4T(f=R8itYr44vHnQJzkLp76WA=VR*^z@4Sn|7;S?Dc&T4Fc+7)Rp+P zCUS5yWPoM)v-_sqbPK9o$ew;4#8m=JbkLONz`yQJ4uX5)=^$nWbq(+=a++br32}!cgpB1_o^n0HBX1miH~PDY)J9B@fAweF zXn$y=LHZK9SRM=ZtoHRR>gDn07iN*~82;T+%aRFW<{^4GPaDh|t=1wt#bcnLLjVm8 zO9Q)Uqe$DV0dhqFsc9;GAds#KxMwQl@KbOPpszH+OVXtWiz7QZL+%Sxk>v@t8SGOl zH&Ec#Fh8ELcl+N@u+G@}B zf_PJ*v!UrEuyI$@<`9fu>9tML?$g4HVsS=?>0xa>8e5qe{8_0Gv}UkJ8v&S&NEAL_ zH}73!O4c2hHZL9tim0I^Z3U%D+@qH8_EY`vj=Ju0V9;<()>WP+qj3S*$`8#eDze6B zOO+bE?14gVwh7=kUSJ}PWmb`f=qO7cp7*mPI%7NvTtkpKa2GHlb;y>CPdERoaXmd` zoS@snPuPD}U`T2rjo0;?)k{@@JfgtR9^d0Q&w8y3awR&ogt@|hk=78^__)^KtW!%B zm6{Ol8|Nw_S8!T7WDchk%XqycVfgSfxyz;DoSUM21PvMrJty2>*qf8AtBaysK0`k7 zszrc=R!7o_FboPCuOJKKYhyhz)ygbRbV0zI9B(I^8iB-CAURCpI-bD|oJWai6>g%t zb1pQWz}f!RUTcXb;anW|Wbc((js-)WE4n|5t^8GfBf($_ zEF@QcaAfedG-X%%JBZY{(I~6FLKqd#VuMPxkuI@#?o=mg&Kar7A|UqVYi5ubSZ67E zl#B|Z8zi6*En=pWvzQJNm{1-)g5Il1l5p~k8Q(7pM@fRFR}~2qTylr;4s%kF`HBZ* zCFvWzu%oC0jf2fS-hBx;_{MGi69|ZGTxU?cK^UhG?;w*0{$@;b+q<65rDbjH{y59F zJ0y&_iV0UjP?z?yYS`W67~^9xC5w?9mw~9rWm36h>WTf*;eFQ(7>IYW$>d8eTpSZ6 zS+H)tYA#q%iL>d6NVGBzXX#0+c0D#y6&h?bm3o)^2n}x{vP=AM%3~f#u`1$d@hGcm zhms%+wWS1V`fv?E+#0d-0;_s#bEGN|K!EnxlrZc*#Q6vQ)-IDAe2UOpcoH z!U@;KS$Lz?!GF>RYvQ=vYO_3L$a{`SKGlpVR@h{doqtnws6EK2HN4>Vxc{i97k9|) z2FYQit5&9FlKIRyLK2(|9ffAr5TpD|1px1_$-v!F3M@O4Z z5C&S4K%lBt9#iA7E|5k-ptWz6#c1E!i~z$IS9(jo=*>B%)Jty#MPjbGl0<4!P>lhO zfcnG_Ly4Sdpu!!`DQ^XhOeJw>NFXE0?$Ax*Zx;#MswQLY89Mn&QNki(Xxo=@#M%L5 zkZl!-T3|)uX&rQl*4AdDHs4xI!FpPlX-&1itRZ*kzz~sb6^(Cpba88XD%;NB;jykP z9acYKV^~8A#wt$Y<+ebr)M^h_G6Mu_<+*a~tVot9KNx6umQ*jXIHHriNH&i6Zqd;K zIj1g45}E@Afo5~o>hJjv0FXd$zeE|F2XZSXsZJ$dW=mb-k(a&|i$7*0`LPT%m5O2( zR6RvnMz`z6awA`=UwAl#uDUGg(YGnIZVk|VH@GjQrq;Q4)PVQrSk$+p#x)T z#0Dv_#_Y)HNgGLYR))sb^P{ePHDWJfbGGF*5xSfC)|YHcS03Qfx}hBF?naE?yBrxi zJat<<7OPkF&xV%6f-_Drd1l7&|Nq?HAy?Pv;)}M(mdsn5%mkQ&Xm<{}FjAmBbQ1p` z>)+ZOG_Vaev$1`_lUEBY)J);F15UQyheIFzH8rcUZ`L^xKEI_SNnh{}Z!qm9`vWK= zRNf*t5*en~=VX%iCraYObKJ^`eYSx|a-2B|DP`xFMW3>nRR=rD*DDKv9zVX93(Dkzyys=91&ePYrtR^yqE6Mb zdX(i6Y;PF2hy1z&`F`u&8hN8+(ZoRc@T7rl2s&~IhxE~|59gLI?zTj;+Lw3jZp;Rh zXm?Tn_O%ECg(TKTQ(Y`x)Ug(DBN82sYyR9($Y-4?-dez^t?@Q6gEALN6J4o7 zYv49Y>u=x}`cYq0l6&01iM=7BtsyK50xIw!fARY7I(-j&I(XQJwBsTo-%!IC=TX(6Ua#z!M{9 zHc2dYtU&0#KV~3q!Pp3GR@LIU(6*N>>_bLI@EE1`ElDS;5{l?UghLA+uz1PH?nhnw zL$HyDWY+x|4PM2zIwiZ1Bs;gP0;Qovoq@z}s1Xn>p8-B8HYbF`D#q*>W(BF+1QBO*^D%2ly zTRST7Qz0U&_#QtdK z=_K&M*P(mDKp?hpUmri+w`RF(a(Ik0teLZzN|N6QML{q0c9OEaS(XtHl zTCCPy5co3n{;}PlzM>qr($_Xd&@Y8lgpva~`SFQQ^D7g}Qalo;$e9GeCj+925?7*7 zaVH0U*+D9W-d&udh5o4m)k9GUr5!)8mB>CohRD zGGU;xA_zgRXJ}N?&-dzJT9ciP$#AcYW~HUl1H14uobqcR&EBY{*>Tjk=Ffb$v+gd@ zuST}??1wF{JMqVER^6Qm9viQ$jmc7dQM5zN4UUhuG8~C)lH@rVj0LuJN8#AOzZ*qA zH{tw^Ipe)Wqh>mRrD?6}hx6ek&8H`)Sx47#hJ(Z-Y+&-~MNL~yY^s8*gn}z7IG_C% z-bTp8w(47F>|o{Ozp~C&pA_{_NmUYVUx%}C9SSmA-y@NekiM*tNDGdFC+6^7*)Qo( zL^oI}0Tx9PN>LEYN{?Z&;HPu}Vyzns-Fn6BD&)z}-N3*BQRK*)ZHzgI94{8`9deL) z6zCY$uZM@6)#f1&zBV3WPHe?vaK9{;M=GqEu zmCH4i03|y1z@s>cWG8WXp$0^;CeuD#9^cW=qR|wqz4Y8 zGJ=LWnoaDH<4rK%+f>9cLbRz{)(gsSa4Vu1o9lNU9-CL_iHH-{Ne2XmQzQLfxClL! z)Gvs}^t<R#(4NHR)jFFiM;1Ix<{;Fi3BQl-u;HQH?ic!o!v7t5>3QQIiKF@7nRaH8TH&b?U(kJ9LZu8u`u&yW8^}!w#_C5 z>hYJR10PkI2>Nypmp?@iW;(a@c++G#x~5e|R-O8sr!1Hy9W?lKQZF)NIyes+#!8U) zT3Tl9{1n%|M|;K<6Oj;mH3pCIB+ujvBhMX$m#k8l|FJAv|0f^i{>=U`XD0+U{~0rF z4IGf!)31xl%p)g+Wk*GSx;ewde>^(Rcg1Iw_?Z&zy&2h;0noq)QG}^_MqkY)(Eo{d zUWI1gf;Kpd(C7yG1I+{1RjUrQZ)J>9N5<=_eQ$;?$(};Z)vKpab7#_#%>b9;2P$!1 zgDO>zoz9pt*Cj#JVM!tFwqyUS-r29{U4w=&12?9L>i~&6=u;~52PQ!W)IYmHbEtY^dpf~p+yS{> zGn)?Mr5>EW<8o;tPVy8tlJ-%#CNr5sUDq2?`J}@zusE+d6xPKgT5OZ%eb#+>EhBGz zEtTQ7{9vOUnWq1f^NCSxymZp7nHJ(v8KG{Cn(nB?@q!VmVFP+m=J=o>Uw5w z`3=Thn8kEm0@M0UHb)C@3>4mkF6F@{YvN4mH(19|P{T&hVB}S_&?*XO^TlXtR5{92 z^NLwY&L{-UDk~9k%jMg&xgNKsveM36{?=W;|XzhEt-u5 zU1WCR1OyY|vXEv-j@kdDn5?ooqIeW0DDnNw)!6U38p+r+PYcgw2VaZNN%hXjJA!JR z^08{&A!2zirG4{Kn_x5DIb$LItuq#e0IItK?|_?)1;`ryOv=A^NEA&|EJL zC(h!rEz@;#=l}1_L$*$(RsZ1)SxmKpg)a{%g=pZb-%L*_i_sF$()~}Kj|oiCVG<|+ z6g^;Yii1Be4|rZ7I98?}6eEB8rw2a=MFnp>*G2V{>my<7`jc49fgi{E^93qnRlbL1 z;pneqNSOZerydeP{vBqC0YZhQ>j+ekPVD_tJhp#4`A@R z&=zgm;5ELX395Z7^KaW%_-bjFpHq2ruM~A9x4{hmQ0*0PhUJ!#osbpw|21klm#?Nn zF5s5SoluOnpdX)ahWqaa9xX#)5Q zC@qU8K)rB5M6gd!PQLG)p7c+T?N=T!VKK2^1hBL1zW`@^l3vOu!kKnuH7^~^?H#&& z1@GIhgIoLL;jxX?s4|!GhMr-2^>F2#4qG3(VK58=y3hd@OOI%%{cgW|*3FLVryeFb z#yyI(I{)U2`i}%Tnpo<6FSDOoYU2d{d-UJ|{rml+hxBj%^o0IBIXV6Q5ef(Vh*-4CVyKaJq1+-3$ex6SJ_-Rf>{U3k)k-wKRif~-XOhDFv zy$fG-#2+*7_UVDN{&haU>3D#82>z1CB-Zc*MY$*z$inROcCL>2=sBGj_Fty1 z6W=_si`gERHa;f{FUe+fg2guiL?A8H;b+61?<6xgI)*V?htngRe)rC+*Ap(rWU48x zNjgxJ3Jj7X-og%mHSqD(^Vc6PK3u(def{Pw{`1~`YX3_!=#TGSUcYAC$Kk;`~{`R3)zi?{EeUthg`_WXYy+aq+~PhY>ddinhN{l^zCuHfBw z#CD92f4O*n{r=6zcbCth_9U7K`R3nGBo8(PoASZhaWqUx`1>C-5iPpEqiWE&k{K+P zC?109yJNn+Xm&nR}07P}}Zc9|BtEGhOZE%vOW z*z>g5^O9mO(qb=4iv64x`?;jpFKMw~N{U^j#jZ+uPHFkW3ci-tr+kee zdC%N)(J8Ng0xG!L3$ziql-d^b3$Ljo;){v9^!?e{f09AK8~e%%YHB;_~h zeJgLdhZy2P2#(j>d1NKYxwZE5)H?{i$G%@*Q&s$@eMrnq+whK-D~CTOcv0@QIwrGI zt`~8a=#RrA*(Emq95o&+=(pFD)=v6DEj?J*jxlcd{|NuY=|zqxR|_z*i+x!w`QAk6 z{bL_`zO)RHf?J88>0u{V-wy}p1W7J$u$xSXbQDJ5Ee6zHdeGLy7o>(Q%o$r_A#7y> z3&Zjt&&C7yHZFUtGQX@ciBNvn$Yd z(!X1nR8S~?-j`wL-3!U-Jz2R%uRl~!ihtSL^?P=3elxB=CeYxo_I6Btv~SUN%sDXH zJpEQ$KEakj-*#t1WgV+W*H;H<>ev%~Tsg{_XQ}dwGtl5c+Mw%q;t3l_e0=sQA>I7d zmOv)$m<{@C%rx^o>3m8TsE7P$=Ykfw_dBk8&C*8ZXInarnJ_8+yCo6Uh;%SQ6CqkZH01AKdc_UHW=AiD>r(@Vc)g4u>De{Pjsc2Q3MZnbjdI+sP!wHTzq& z$7!Vp=T#&iNki8?ue99WAK)e7-kNsQBLoZMzuMs)kFdgI7Lo_YZkD0e)-X!)ngf?w zTPH@H4VFojjsv$v8NWV5`*48w%X`YuempqGc*F*>(#He558qc|5SH1@_Yxf2Y5lSN zdVrVs`>D#n0fNpqHD>HC1E4K-{J9V5xDV<0szW-y-878jK7`><6~b`;U#sySt9MCT zjsNJMJ^23QkrDrK`ppR}_5OqV_>Y~$f80lZ7||bvL3H;KA@>m>UsXiNa!o!7@v^FA z2qaa7j!7@71!GGy9m35-7di?<=OFiLXzycG>W3LujaR7>_`5{+qFE~J!0UreLywoI zt8|JB`|LZ=BD5*)Gw_Hi;=k^Z}#RXc|lvZkocg zc_-j#bkkQ7FDXqIox!5v#J-%8Ph|v%L^yGV1X;~BP(lGCSG39)>?D?#Ac&%Y*DtZN zqloaibwcU^qG3~34-ExOfOCsD5z{+?&Ik2=QX4b>eJ~Z5Moy*`IQPwv=8Zm8MVeR0 ze6_*1GB z<^<|xSbyb3M228vo)3@c2eNbe10nkHU!1`;0R3+ee~S`(V8u5Munr-7PH}(8=;1im zT{U|$3r991`H>BL3BQ%x(L%Ji6p@P)#yJS?M9BXL`|5lW29TNU3=qi+ai3&Ox)Zye{jmk3y3VTu3T2y7OW>!9$c8EAfF1jXsV&YQ%zagYS2v>P%QB1 zlzAgK2_oa)+XO4fP>XN?PZpHnMkX^Xp7Y9Z^?6ZqS-B&!T5ZCJA1o^_|0?|tkOS{E4N%yZ?%6loz{m(OZ*}dF)R{t9C8>r66PjdkvjdOD$ifv zK?+EyaTEp9e8yjvogKgAMO9S?<#9s@fT-J zvidch%tn-GngPVsBZ0<_H*Z?ZI)D)n;YWH55spM+%tTUy^L01=JWVnG;P3wR2}-h_k|G!(P7Rsszx1KxGy6 z7DpBwPJ%d1yeV@|VFJt*lbmIc3_Iy1(k5tBr1OK~>+b%gI{)$nNi{#)7d+NUIU9%v z8*pa1tm>XG>vK524~Vf~S`ySAh3yOB>aFaV9AeJd9&^^Y+~BxzY0p|Y+Gxr{z8L%T zP9owHN|+9%ER$R`Dvx} zcdCX4GTcRhV8tm(W{ENcXH%CC7HD}#p$t|?DoS;&Ur|CqqdcdflAS+h$%QR_YzdCl zJ*BJIJg08EqGpED@~l#YLwlHvO<4&^9Agd%PrEi*6{o`SV``gMie9;=Cr@ZJo~)Xl z^`BT!=_Cj^JrE}-=lCynhF9_;eu}3FHmBu2Dfud)m&H3c%V;k-sY82ekGxjT(j@G7 zVx>flSF*j+wTDcXV{A9vOel9syQln&=$+a}iL`M_sMS>ROm&N?{vj{fyrP#f=(E*T z>WQQK>} z+>C4uOm)69MNtdI9`cw|^4e>9&f*X~FO}F-0ww$qu zsWD46=1gKzB0^_OA{-j#QWuUOQqCQwoOLIjWX<&99Xnu+s+|EFYp~T_g;bBqy@Yn8 zP-nPutub^B*S7i&PiuIF&YOv8F(t$nF%6v-6J>a^<(G1eoO&9tjW?r2Drd@7ldqdGZ1s5yuvx&&}H724^Ig9QHyh+CU%itGwhqxB88X7(( zSEUak;dj3tW^#0=`>ASo%KQpb^uJ2Zg*zIiUR68sJ?)>=y&Cvj=cpjp)3f$mK_%Wf z6KD@7Z-t$#j_n_Wpsl)oOiX2UO#PE%`}5O>XGg!SF`QnFhZzKOz?G<5O3B+6$4F?7&w=fw70OePlI zFY;$(agkOnHX&ipb^B?%Q#fpn*=h!-0C7^4k=;@?pid*pc~DeKj}&siNu6QBUOf4g&TSXEVCU52ZClpUU%%fYdXd}BLEhwLDn zJ>E>iO_K3@8NK(8P4R!DqQqh@(v;j~vT~)i8c5HoW6Sph?1f{da3_0t%wD3a2(B|m`pWfZE*wkNp3INPb$$!7B|H5_uu!Wq}5 z8F{KAThd16WBd16oFE7Dl6xN2X#alx0(i{l#;Xa#trKr5;*8OeB&AtMG84LZ1n5HX z*^a$rMvxW9pu2tI!%+HH7&;qfdGcAb><-}|4Wh%NuJ|lKYZQml+2j55m(MRh*nR2e zail}_V0F(0^@Dthq?;|qj!9nUklHAfaOKXyY9%{0Ecrp;FJHu19hnxCvioZq0@${$ zn^AH}auC`jLk7f2G7N7VkYl-Lk`zQ)i$+f51<};BVvL|0b0>1+``rwbr`5HK+w62n z*Zt7!Vyk!OwFy+Ub-7h{CY2T0N-Ex~?OcuD!dfu5LJQMW=Ctz1EJ#xJOTTK{qyLea zm(3=inSHI9aqG`EbCrjul2-1IVp#R!AV=1acL?QD2&~&w27w=cHftbxs7R;Lte0xn zNMV|Bghl=ylP5WSkO}7^p$uJBSjIue6~Xxlq$jW;=)~1ruhDZGjfC1`J5B+=lqK>V zmr1?4W4`5B@8nZndm|@pdEt}6q}cE}K9d;1aHO@R5=f92H|!1W_?8|_ircLng!QFW zT8J*K27-O$-K-~(r32i$U$fC5hrm^A1~~uE6&;(njs7(VrvFjuEwppfLvlbaFJj zz<7!~NIWg=AU3+5R?!Bw!ict8jv`WvF zw~OK~Mg;w_UCIClX2@38LN2FSpb}%2Au{Q{F2%=mV%;`!ASXeFf{!d+lj0@B3k}a4 z_2N!=2v9PvZBY5w4sbZMG+=MoNSTL7iy$D6Yme~X8^s%yMxK@P>LQB3l>b+e<4!b= zTSs3gkN+}OW>x2>l3xC{HH4%u;S~0(tcmTNh&$jGg=bNJ=cC#>rdp7;(MX%2m}&|p z=rAl0NVA9oBtCmFJ=dyGa^r5OPHi>EQ1qK;`3_j(hX1l|94F-uB zp&>w%-Arh#7m$(ACKSxZHwKyj49gGZ_8=|2I|uz?wiBJch8A zFo&i$0!fnQbR@?|&I=Z21~X7YDc>enF4O6039oCX&=$%=tCtB%A?udKsmhRCCc*}- zbL~2j?URPO0SbB3sc;bs0K{I2E#X_K$xlR45NY!q;ryJg@P7+3@39E4kfTKl?fe6(n49mVTF=y!e}5=`9d zMvi1Pt$MZ0dfMCfIj;Ib+n(G$$d7y@z|rgRNeo0uGM z7UE|sTq}F^u|^6YP=bz&5qA#o{a7Xrp~MvSGyS;qTwkeUlO!Uo!m$5}qCgHX3IUKO zaOg=Mm?G7r={wlk2l_p%mZ6Y_ON@dcL>felL5oG02IKevjuv<%tQiLx7c3ccqhTZ> zI??SvD8=k}24|Fo_(pb0Se@dXan^ljq6kbq<7~Xti%t@7E)?L5aLCJ^1-2X_JVMeg zW2b9`AM)yx!P~LMPc&e9jQwLIYE7RWTZU7Xt+KK}!NJU%z-q>?jHmiA&^0OGH--4< zWnqO7OdZRy#asaoA=O!P@ow=X8c%|OGa8g?BE_p_BI6NMbH!zn3kmWgJACEODaHeoTbnI)9D}mV~*H~Z<9&*EU zhe#2`iy!B#&SUdgS79FN7&6Oz>w5ZKH*cXQ2(zEY^TNu6KaQ2p8uBz<-SCq$7F~%o zLI+dV2-MN$a^`;vj!o0+L%5vFJu22ssW6W=wU4U5WL^V~4;@b%@xht{1Jj zw4)u#Da`;zbrq7BNi78^CL2s;K?e9_AOwkdkR8K3m`z+ZK1%q~V>_J8;>($U zaS*i>JChYtb0+Xktb0M^jXl5ZJUKN2yqbtG?!o#0&JwVeK(2zo6(Q7GQC9awFxu&*O>^h<=BsYxO~myLh`kfhzLjZPaEHe7>IR|k8?opz znCHgWh8ap$ojk;?hfy@41Wq67D)lL#YKWSlg|&Da+CHxJUQ%pxscg;S+C6J1rW3^l zz^NcJVPI7@S0%kzgqw*SC<`x^hYYFY(hEmw^lp$OP!a3$$I2o{cGx_dg|_XD$igM= zAkSN?A}UGfuMxcQURd30VO3Amc7)aC>hCq?W-{)D?R!I#Z_&Cg?cUBXnUPUX+GeGF zSl#WSF*z2KTX6?&d25sDyjpxHAx8lPXTF!<5Kn8)EjD%O6sCe{DpTEC`F4^)5oi2* z8)+1GpB9suMF<0A&mZh`d`(_VDv5lVIw8Z{e+B@zp8&?9YSLUH^zfndsJ5JNU~?Gk8Hu zCNbZ&&`XW3%w zY@B!^uV-sU-f}{=wh!*F;RMV-EB-D|0$2eI7d4$t5>NXbnLahjkry;OspQ?W|HX z>#Ib+m4im#XvM~8$p_v{JRhZLw(^mHkQ|kefKr#@Y?fQUd(MJ(ap5eDT*=eevA4qvwQ zK8Z!yetTT1g%ZijKL7XKSp7!%*+5Id@xsM+Y+;Q&QA&Esj`g+9u2Erf)Z<2L#uxLA zmJNKre&rPB^_U1JsuR+NqC&}uzb%L2vaR}bf9bxp476=itGZdYb|i~k5XmCps3tPA zrHiq07&VN@OH;=O`7lajZhlpOQbopML`vqQ@J@Q{LiyCnJQf(~m&RYoNN@(I*3rQd zPT7eSh_Z?Z#Fu1TrXvh3%X?^dcpHIqL5FXdH8h{K4ODz(>sz}_>#d*dXM1;*pYRZg zFLt<&kVRqZs5Bp8g0;eqs-*hGv5RHMqcDqtWDq%>lmQ>l75Rx-xWk6+r z?kq5NTw)qC_*+aC0fkMMS_|MK_ttaSy$nPO#+Kwc20a%8h{@@dur?&7u#_=S`ISu^ZQLet?pz_fy!hq+FddgwtFZikbTt3x-<#vc>@f?r= z%d+)<@=@;3><<%}AiVMX&xlbqaH0d_>!LFA2$PX>QA8<%vGV|d_Tn>*4wMpt_Ixw4 zFHwf{lQ=~Vg0E&1=>Nn!uR^wO56*v&lur?{p{d5xGf0M7>gSH8;bltSKR$uYjSN zHH;&Y007(yj^&acG^i5cB%wxx#ZegFuj!Ei^3i8(#yC zUXF|2V60Wpm8$?N*KfKq6k1gjw6qI7+RF91vx>>G0>_fy0R2s@@Bs*X;?@gh=;a)G zLtu9gh}~&`6nG58LSC1KyBfLWBL_%L8+sWq^Z#}D-M4zCzdP#2ur>})j!9BTQJGb80VFZ1(l%#y5`!Vr!4P>rTWSlzD*z-H| z@Uh)L2|pXsn{DfDGZwxfnW=sIv+(gs%D%!^OS}A>%A0$os4KY*W*LZTaG5nMw~35| zB;EhlsL>@xs#?uukIPLfu3FH1zJyC>QNMfA?bAJMaG9V&TO}%sizG>~h6Zr4Zg9r5Q_m3XZzx~q_ z`uC)N_Ta%;{~P%I;L*w1$;1BHHz)l^{r>4U_Q^Lp_-}@1oNa$I<>@Xg=eQtIuNfr# zr~myz{)Bt6^ zKlT_is@Hq|8uz(c#Pj*QJ3pi4`{7;hGuGC}&*h(;#Q3)BCdj5O>nCdT^K|0JPjf2j z|M=sN{JoS8gyYI>4W~TpBKV>s{+M~UPYVbZ0+~Yq$RM^qJ-9m9P&!+c zk(TIL*!1gzG9fLMlD=(0I07!PGGD5ugFHc8y)>|UlX*!TsSwPSL=Cbm2d>NA0EUv>aoW_Z!QLtU@XPXSPK58>&f;ExLs)@s1o%0C%u#JHyzS1!Bn6vXBTsX zyP_vqj%s)9v{ay0F!v{czeshxB~cXV+6_Sp;j*)r?ja7tc!L*d6eSyU5lO6~c-zJF%R*4vmMN?Q>nZ4Ct3 zb=>vb#biQDYeI(cQP5L|1V|;y1?rW|FF<)+4_6BO<=aOOo-EaO)WXzV#W7;{;{A+h zjdN2DkZ}-{h_*E59t-15uFouD>LKIuY5FeI*Joh=M&zHqh|tN&XRuq)~a@sl2we zG(qjN?ip}VM1Lm<5AY0Blyw8AK(lD%4QmDF#8*qbyDI)1nOkizum< z33~~zMH2>@rn(~r=I8wZ=Z9o>UHg3vzngC<|3ioJKOCGJ$sklS7P#QbDRNbyYv!yuZt!t$J=Lqrw-kJ2j(uB~M9mClgM*P|Jh7Akc#? z29;JqnBeomEmuc7&>`sQxktUSRd)tXOqV*A@|EvDdcv&T?vUrBX6Y(BgGORoh6k2k zN63y``8CNS3;C(?;3K9#SYS}V!ctk@$W$;7qEGRPV1d2nnm zvXcbEBod+{4N#aGCJbg6FmEa6v*n_b{=s=I4s>vywdQ3Ub2hI1TRhZZz7NhX`Hz;X zcf~}oPmtkh^-Ml2a;)0CS!m6Xj(q4x)p6oX2QJiWqAO*SYPl;ZpDS=XDq0?=b?g6D z@=NKtd$fuTHq|Ka-WyXP;i{-^DBd})4Ib-sHo)#VZ=yjFU!oZIWy zrMzBSm|`3-$P08+1|y<52Ce1uLhc;pdWge+mX_m_56el1$GFhru_+t65fe`PZoZJS3bOj8 zf;iH)l$TrUV_R}_D|7#CwWV+Ar!;)Z##G=$W_*}yIH^PfD#w0S$rKMDQTrV=Nbhb!0 z&Z;7pl4(UzG?N9GTrHbcvR%>voCN#U2}W|2Bi%40tpluj5X8LrJL%=55$4H&aluF~ ze556QY0EF^v2i876}m>y!2q9p)~pQHBJ1x+)=1d$z2;@MdcTDZWhocHQAa%zSG@yG7%5Ub}o+$p%{!xiT&3C~H%Dh>f7?&`=`c z_S+YJJd2e40#AW8x&n7OJArsZ=Kcrg ndL514y8690p_09rrD9wA?qCU0KHcOon60aj6@l08B2`z7Xy};>_*;?tO z=-`z+U0N1*k6?278#+%k#$Q>#TVm}ujz1QYU@V#Y}}~s-^SDww|ru{(r21J*?QBRfk+%Z_LJ{>{j+QjY%E}Jp9URg z65cqSQ`M7)y^{w^J)siz>8`q>iE`FEeVE&oty1Nr^MhU)C#UAToOFNK?#iI1JCT?O zhx94m^)Mbhot!?b)ogccS=!d6w>wcqUF1oF{+;$te_Y$e?N1=@uLr7Eu)~*oMf>Z) zjyiHCJ96?vum3QwBWFA6$Z6VodEe ziSnq|e~{aiEmP(Dlo}6vXC|-tzI(duru%8rCyz2sZ++A!s_C=rw)lSA4F7xNro(jT zr`a_K?c47zw?FF{etFU(M!wXIUGU5Av-}ddcCY_KUPsP$)R9xwkw?ALv%HR+?x-Vu zqa(Rfv*k7Ni1!Fg2pk=m9z5Fi9(kBH{h-(X-e~&awwrz+oBjbsh|HFFu<9Cblm;kY2R%7blc-THOGB=l5Km-3CC*o#^of=gqS>bY1f@ecI5Mi0oq0D_sU|rs0_VG)nX4^!!Q} zE%h=oYOL*LMA?Dt;Vh!7S2+n720@00G;$-Bx7$8C1G!?d;HXSnrs;J9Yvf^IoxiXL zvvGWk$afUM8PCRJyk*5pXbd*-rWo-iIQp(f;UzxBOkhliZ--Jt3jD+wCeVnCn@DjN z*%p0J43$|wo_)F!&t3+_*-pGUwV8?4K2VTe+Q8F$@1P0;MTyZ)#mf2a|Lo3of zlqs5_B*SHrCsQz;!pf8xH3kzH_8+q#5xfh{SgR_rRX5}Oj4=3aI7u=2b6(?2#4r`) zhR9Pvvx3ucGwv0CI9-W4qmK77V=14D2kBgt7krpMX^#$6&TZPap@-SYL^2BrFA4Xv z>&420M8)As)}zv6CpU$2V6a1ELmet{kmZxipK4AQMz>wdeiRe9^RX`RH}4scu(;8! z^w|7oY4L>T7b!qKux~YkibJJfjCz{&zC^yranl%@ZO!~p`ZGi`zokv5(&`nBm{wv} zCk9(f(BfUR=6KEo-;%E{1L&@I_BFq3a1QT#kUwQf_yS{h7373MBA8@?(J``D0R}h> zY{A}fxF4n}U@5}Pk%@zSP|?{aZFfmTu zt~E-JQ++%uyQO0Gr<{C7mD2t-%a^kgqE*g-b5=W_&4b!sJgl2Z`;%DInTN{BLJKA( zNXf7d)3w!%M}N}!E=b#$dpzTTRSh%+WTI>K>(1m1&caDa$R9gS^LNC@AYTk8Gnb@I z>E-13mUeXFWWX|MBZyZ#;dhb`xbSQ%<;3-wa1Jr6tOXP~|BqNakD?%Ik{Emx1f?tJ zXye>wHILPV9jnCvlo9)I8pH`mS3@)^kQ+6WO44kOS;7xXlCecAWO}?ZYk35*nhl&K z!FCf#JN5I@*3a>#8XGig?6gs1!)A@0wVxAvO=8kDo3vzmJJGoH6sjz@74e|V5?pTd zAGN#r+g1}G)|3NQ=b<`pUj4Rx-qv^c96QWUz-6|jYKrD4o4Qw5Pm+YEf&ibcqft_E>SY|4?RieS6; z+yfD9+4QFp3*Lv5??!0aoXS{%*uRQ>|DRy&aDxf88Wh# zyo{`sdfTsSOwnJSwkvSc(nKoOlrU17x1M=@v;Lf}?N4ougza-{XQrPoYRzGP$Hgak z8?@inh)#DtqSGyps9&>VY@*u{ncM5sW_IrqzE&KwuUQdX6dgph1u%@aGJjQv%fi zDG*!EAh;E&u#4_yELE-?YD!r4Vq>60LnUi!&kqN)GW?376xStBR{1?)BY=1qGaNcn zmkDbKaYP1al{~}jIU_b=iUS<(BnUoXCd*Kcmr@%b$tDXsP9g_IC>RK42{^VvFs4yC zwgC%nMF@<%A&w-@&wL3>5*`_#(ps0fKs0^AsX)LIE$HS@2Nj!vC=T6Z374R!F+CeO z1>S+2d2nvr50#3FRk?|Z!>=XCRJ&v@w~w+mRwl9)N<&TWb_XGH8DFds5px)MnJRu= zdP&<@F1w@a{~Ep8?j?4A2ezQICd$IbcB1PRu89L+nvL#?_k*nYrl$|Y)iJ*h<}zt) zJt0)391{vZZ^e#6Rpl5{@WhKHBBgYkqJzT#%lds5gCM~c4M(OGNevpx&S882rySbA z;N94Rq1$x+WX&Gd-IzVl>JbF(UI=~?i~1L5m7NFvz0u}XQ&5{Lr&OveWr{xM~*;akJzjWWu zQM?6etulzxE0&lO6{gB8;gOA0#+K$d(h9!^^(1A-Z=|wmtc+U z%m;WB>ll_V(V?13VKzW3>%QfZhr2(CBYXa=AA6v43oW_y&m zBThpDQSb4Ufv|`pYjzw&u1D$tb(zNTb-0q=F$>$OKWtOOmEwA!^wEFKE;{#)8RiYA zh;_Vx?L~-}tRXu|YCJdW*E&OM%mGH)=I?|a+I4Y9s^WYB5GgMNs5ed8S~Wf8N*_*{uZf016hVuV#nc?#UY*#ilmCs@8S4>(z@#34swvOq1l77iID?t(2wnUyk%RS3Z*Or!2Bg~Ahv&%Ht z1>1|4`mhMant-WE@?_#n2d;xeIy@pT7u157er#<&~#~%kB*=8r6 zc&>;MK4j3F!uAkRZwgZ3B<`J^T>HVb>m&}QH1AH`gY&B?LKM;c3DmlXvqsR7@`ijkVGLJ6J=3DudqUlDsWm9i>NYk1-+AED2|c?mcf-`xnF}2_$9--p#8o z(HO^H+Wh5aBLEHc_bI4mn0G}jhd#olsw@P&A(qmR@;+$ZGANXuGyOfd@dq$GquuX& zl4Q8yHA8`=C|Qh7Y{wae+>T1M+)F#>I!T5%st^%UYvF{`;WY!a*|^@w6K><7dEbY-8g7Vf^PhG__Y7y1HJJ+;u-T{`P^(i=7r;eJcbfXjOGut)^z7VH@9ekgolPkw;}%XQXAB3S-1N(<8_|2e&oEcT9TG9T@x4E0oQqGcZAlr9 z-jj2h7Gz{7JmQ;^4JyMfc0JHAMiFr2h3YAR{YpMYp=UDDIqWUh}qf?**$&i~Key8uVBrDuWHuo!OwyJN>X!ZvHjTjRMc4OJzT)Q`F9mS%L- z>bY8XOYN5W&fK|kk+Z6@RC&89vu@v5#aBE*Qlk*#4;qc>z~SDlGiA{W5{I79YK6&)3Uq6Y132rbQPxz>Pt zG1+XJ#4WVoN&ZEy(^2v!V7mrLsNCu4IYYOFrgDyKnu??t^a8LM@r>agNI`m3aXhCb zXaM@jK^P^s0i!uj1kmKjrL$+5pdr=ln^auL!OoG;2lUPQM%ZgrtjB^HA*>_57Gx$1 zc;MTH+hz@6-N5=RskK?($UqkDr{9ZoJ>iL92~HxY%1Rm)mAo>>mUJ2RQS`Qem&JQ# z4F;4iB0Vp*<74fdbHn!Q`jM^ib~frac`LXd#kNI8Dicb)gk~d;XpnbfpEG9F*1a)1 zI4%ecT6`p&0h7i?ogS2h<$%VC{B$G4Pmkbv0dAhnSR+lB;IQ{YNYg-cY*XMbd!m5q z)~w*R6XCEGd3kNU{=PL1gUx=OE$nvqJ9mQb+?nThZr9g?FWrtE*Ek7EDjO(+2}sy% zB1F=f5>i9X><*S;H+-##v;vY5q=>O^G6v#7->H|;tMO#7bcw<3Teic*o-qf>JqfN% z5D|hm%YfAfuhSyt77?`Z!U;~;2LkE<;)6Kp01X3Uf9g6k;%N}1sJERV0<1#y)GBU( zDwrUfWa0G&#DBm%j$c5wan6`E#t@l?4dIT`_k3U%Ic+b1)ebOu&?YSkE7(@wv$6gF zjN|ajG3$!QezMN6|K1<=`+)+E-+>?|(hLIfGkR%D1STw-iUlP=Y}RxX1CbQSG#GQD zcmo_ig)s1#I7|bD^i#+4nV!Iu&OYU!LR6S#8x$8Ik}na7_kdg?uuH+nvax>Gpp4fV zxGyvbz>7BV35pB;l9haU6p!BJ+lFlp2u!#O97y}`oZoz(`60S$X+Xkc%S^+MJUHfp=$jC$Pu zVQ_OkG8u0dYDnOc6`Bn`uRp*SC`S6g=R47aO>3N)nwU`9TzJ|jB@x&zWUJ^L&vB5* zkb6=LA39Zxo;pMg6L>&E8G01wM`Q>{s`rPjE;Px8s<(%*b(oY3fhtx9A_Y0F3Xk;& zLZ3)oz-(QLZx+BR`~~Rf+e4!z@2Vj+gxzfUd_LKd1g8LFSGdXm@Q1S=+tDbUn3f@) z5@CV_9SDcKC`7=dX4CB&1BmOPz!fkQv*BQ|`Ia$2pH+`(nnN}N+-s$^tq#t=PZOgn z6VsyvZr6N!Xt^fsp5XCt7rnX`oL{){As$JlTZ^x=1>7`YiUg_AA<1>4pl#P-eb(A0 z=v_@(u(X`2yx6h6V%W9=44JL{HMTy6kTva#zrmOqB1Se>~&rgrAq=(pHazQ>da75ko|OVu@_oI!?00ZO(>>1y8CW2{F-@}VwJWtFIiFBnOM z4aw*;mJGs&;2(^UxJ;P<->PGyaMp5qXRb2@x2V$#a@U(C+rw*gk^NYckFn1-o%R^= z>8vvws^$!!8Q*36z8!vFk&-%g4ZO!}_b6N~U}lW9x8Z$Sl7h2IR8~RA-Q8V5KsKFd zsO_8mCM41G`4@&RDC_}De|%RH@47CO>(OiaE+aYnFS26ZT%9_w#zw(J7#tw}0tAlM z=g~A>{^OSt{|x`33PgjhWnTa)T+?tX%G+trj9i1MAoS?H?k13x)3CC0f@|QYqwhh6 zye+(g>?wGd*Bs7OBH-QJG+)zYrDw*Pgz<~ls8=f)=WEp%ShY~Kn##`Z;{!dURs^kv zD>LQ$0^2^WsJrl#{mv^cOx31ZYe^}lG*JhLH594}p%#QF-jwQ+SA6cp8{%fWlYGwP z*y~YsHKLA|>5rlmoP-6^go<7GJ8p%WJBI)Y!B~*hVr%{;uK7Vw&uak3RwdXkfvs2B z!{L8ijJ2WN7CQ-j*msZ_fO}&vs6{^zyAfH|V|MN-yH0k2-K!1Qy&7BVL%!EJU8qZ^ zWXb}Vac(Y_5Fwt>po*Tg;- zI<>I{ER+|n;GG$6Y>N8bo;w8vgzstme!5BxVLt(@k#Ftd{ zN92cM0x{b=yr^4%^l2LXI&bEo!9?rfpp7aYTd0T5xxRj@3ZXe0;+Z|3aYee793|KM zNRX)yoR;IDZ-6l|yo5t-)Eo89dU#y-)`a*4gx`7Lo$*gr`D@^?*TT8Gv-!q4`*-{1 zP5gQ1_AUI`*jUG(>`LSI`kfcp-#2fsZ?4~JY`(DGxP9m5#tZuTA_y=9x4y2wz1k$>8~7w;eKoxJ{dUxx|TA3uHN;lZ9>sjaPjXmf9E?f%Jq{ll-G zJbDOhLqB1un#nxTf91k6!e9 zwzr+oP~+v7U#9oD@L(Ek&V%|;IT_xlfsTK^UEzvI4PtvM1l(o&{QQCz?t)z9dZxcU z^gFfp$upOlLpCct+n6D$KjJw*FZJ7o*S)K!b5D9(X%3CUC`92=gP|l9DSDypYmH)T z>n#ubBf(jVf3NN2Z)Y$*L$^_8OVnKU$<7(;Iol6xO+0ppyL(3uAMQRr-akD!yubh9Exlv( zJTtic;Nao@>G9JC4-VM98_0u{mtWmIK0Q8q`ebjPweGt^li&HoUCzo?2_$>4y63h6 z62A5J&~(T3w>Oz?@*mD-`hN|wBsr$>?5i_UTCmmgPlU{zSo(3>c&Dg>WiY-Ri}wwOdq zl_aG^+*D0q@uy&w#-E5k6S|4KIMq=pg0LbeE{bbDiti%)^Nr-wE7Q4|{Ix=E&c>Cf z1u9{7gqx{o0ITcR z`JM-hNT&sl^8mM)&(xb<;Lm- z_C4^;kk=d35WE2d% z0;f{AxE+?X*Euq?z!%85Aa02TvB?(1#+yoL#$u6ivr@S;fN#>W83CnDCDbA+T&d_r zJu^EGc7_$I-eJHk;rFfxXjEi5T+jJ)Gl<24rcGii*NcCd*A1NM%MDcp%L96u_PICS zT%8i33Z%Y8tiCtioRHRkWMjaR-U5-4Quin@PfcMCg?%!?I8s-D@S%Aa65&kn?2XH- zGVq-270@=W2(H_tg2k6WybHpTSYFzJeEtAz$g?Nf1eEM_=&H<85i>0iF%iGGUl6@G zWhpL2W!&gqo+ohWPEwg9SzyV93Po+Q6_p+upf{xsEVw!Kuw+xwLB)+f zQ&s~D*SF#(vT)+73aG>*v_d$UguNu}ZD>g|)Pk{^XJTl(vfQ}s)eEpItY}eK*RVV@ zUqM*4#);k;0*IAGLF9osGm5=FA;GPf&F}QIYk1v&;lONF^}>xn=$X@*x*69TxZy@H z_P2O<{75rOAZXFH+Lk-@xFCqn@MkizVUvTX%xr+2p5shEMBg3Styzq)Wm>(ovF$ni zfq?)y-d2g0`-7>6+4HAv;%xdRdgk=Kh&G`WZo+(f7V~YJ>9fr}V1oH=l^G^GIL!X^ z3~om4w9Q^ZJH=_wy@TEimXbYn8zJ*k`332FJ*zeSvhnJ%2X!>`l+@tn;b2Gm0nihDr>`Y0qLn zvuLL0b*+v+HEGN0jvhFpwC#Mzw=z3D1z1ISCf0I5?Yfx$ z^t7j+Lbgea>DLp6*v&+ScTBgHD%agNDT39RQm~taP&bRwGMUcwQ%C#QYCVIT&8;#5 zNP9RFIR=}V!BPcj+O`0x&6|3$v9@e;l+aW;(GmP&Gf}V;+ls*8gex>92Bihqy!r;3 z^V&{eGGa0ohNww6sTtdJI2_gV=agelFQ_@K>33>(Hhjr;?2nnQGc(f(q#VRVlX6{i z6Wf|<-EB@>cN;TacTLCX&Bi8h;g=u;4G#tlB!PfP+u`w$0ew_hHq*keT8l99nq!SX zOd`m{U<7WDZKF>x99UNgFqtT}cHlxFN`Ka7S;o`A=st@xZYJ%BDgx6_?PzA(kNp_1 zX`I2>DA1Ntxo4n!;f2|>#)ONEoiG9AjEAFR7`=uW0h9>*h4fZ)9nvHvGBqS_xh zX(bkgioBKf0In|l_0X~Rc$tdmQ^Kj#3zEkn8yYV8GJQfVDyuQB5K!0|Fx`L5k;rr^ z#HLITlT#rhK2%^8W}s=EfhQGy0F!wy2r>9_6`9U^-}`JtZNU?({J}|S7YP+{<1`Oo zeFCbteHd7vb=VmN)dsO$+-B5=7{957&Q153Lk+!oFF+Q6!uI>462jr8XeBOkyKRe5fo( zN#<$uV=jq(FU@Cm0l%dtYX`-EKU3Ir>Ghop4f4|KidTa&yoBr)qDeTQO`dT)#uE^> zPR&k-o!;W+sB5*lL>AkT1VJS35cP3<@x@HUj%R)$*fjMt<>ckDsa4%`B!+Z|i}kU@ zGT+2~vB`$s(C9%e%Im`EljDouNGlMRR=n-alCk}k*S)No;!&6BLW0?{Xjm;oswD`w zJu6AV>2pF{(__-q{8moZ7TB1u1yV9XlDeE6NBGKEii>?n`sA{q$e#_dOO6=IaWR3c zGIpQ6W@s`&6@VNt6V)?A4GbWBk26o6j&I1%^A>TUfZuAOg!NdUK1>F>6yvG$vYdYqv(zo=+ z6zwI)v9LyY4F445wP)JVc#I2c5H3RM(iH8+!!2eo_(azv5a6xp;slL^$*-?Z(Po0d zcuPNVhtmu`(a1l2voSXYYZ6)Q?Yj-ma;Ip$n=o6v_4SJxv>*56un)k+mB#8+?4X^r z%%&kkEF76ND2_|G8LEai#fM@s!pe8py;*%G(G{nBN>q-S)u<8zv6XS*-K1{`$I1hC z3#tk*_HnJo$;4HAA(^F(DHC8#dl9`{pRSi(0KQsKjyQ78sk7QIA+fkrKS?c_v;`u& zY6Po0M@D13yK0hUnxX|3DDVL>9m?ooeN$e2Toe$e5b~(QM+AlAA62qi5oVCSLJ9}C zxwZBBo%+Tq>Re+`h7=_v_+m?@41np(Y6B*jKdwp~9WcCUWO!p2ZLBYWMlY$@FvTUL z3I&QF0RNNvWinb^3ct+F`tl}xs`isflfKvvzgVWjB=jvD59f01irI;!Z!ge{1c{#W zCH>TkA(>+xh^#%V=thhw@KgnAAZJ-U&(Y5yN2M(}6hwpf&?FNm+}!M=0khGG*$`-1 zh_S@oC-vwDxlss=RwxBFd#0w;?@`kdRl^m<~tvdo9?_3~OcnJ1NajDh#zomdQHX z;N2|$YAfs2H?N4irO>acD-_{>&={Z7!K84%PTcYfc45oo*ogrXsS4mhlWJAzP*D|d z2p#avqOTnsy~Dn#S;U;YVbfzg3F~dqTaGBrMW%biys>pizaC>A^kp-urDX~e(Uh(l z$5_2)8OsM`HIslSKz$7$S5sjP6c-tdna~hXEyEHCsdDFN`Zk-vTxFk0g z^2K!BXq#A6qfD{Yo6A&ebt7JEHGCjrAWGL6_S&R$G*z^E0zBuX>zED!={xKM$E#WZ zn0{ZD-xcK{K>*=dPlUh@+6j}i;2B;#cQELU39#MrG$2?MSUwgYMBUU!j{A(8ctHM; z&x>zs^4k;YyOx;STgx=J0o1!vNY@Oo>Mc)i8Xhn6-IbH-JHez9_L*t4x`joph?FIl z1AO)wh?EwS8nHwi);U0-5*Cn`tLp9&mD^QIq0GGQZoFVf@j|L<-jR}W6e*+1OQ$~O z6=3q0PYsuwnN&hmRG10MsEWcgp#rK!Yq%y>;VD+mHMLgHd@8#JrTng|yIxm!y{_)M zG}T>aQqXImHM}mVY}a+Q*~Qm?oo(sY$@O11HgDhB+*InnvgaDN?%dqGuK#*n|8>#z zU&B?luM59k7k+)`6n=ed_)N0A58&hA@byF!1Gt{A$}9G!rVF(aY-J~=hvLjbtLYl< zIJsZf#a~m!G?n^k6E(+5uL&d1G0E2jV9OVPWfCe{Qfd;DpxcO?OPT5ak@w5ga;2a& zB|{t`LOMP3!V(GSJSh@QL3UfDOA;C?C5K~to97Rkm=UP?Y>BYB8?pw#2kSb+Gm+xx z>W~pp#{p6frOb7Q#U()d1+2aYbt-Lhg#GaJ5rm~+E+j59N>R^QvvN~dRU6VsUDtQ9 z9Z|^>(Fx?YDSXA~jf}CU@vxZy!vI8QJ_@Sgpo3vW0l?^2sR}GK4wtdC#WPc*6lgSC zlWls$%aIak(5c>bY?E6~`_i?Y3kO7+ffO*1%R@~_z?+G!H)&gsL8xe~@ft_;z}3Ni zZI6L2jKpZa7sXv6R5OfP!4Zfc7ToL%ds?t^Tr()t#i$=DyBkWe6^(5bK&VimIARo! z-kh55kp^SbNB>pHRg(!Sk^z}A%Q2-bD;04h&-j9KmBxmDhX+HKQhE4O4^3eUklJkkjtY|(hdsmP_CJwm9^Xr}nCrTd z1WylP$ATRP0erZxG$Rct1VVJ!eo+E&Fd2RfQG7-Z>FZnP!dsWPv(bE_1rgQ&4<|NN z6#54!5$`JJeJY*7vklr2@^X+GYU@E=^y~*4c^}-!``~8Y2X6)sPQo*r2FffAXb9$R zn~F0@uptGNCVEQ^UfjOF|6up&!xQB;2ti)-9W;qYKf!UHqSpcENJ1YK1X7y{+h|YJ z1OkyFefz}k__%952t;9efHNS=MgUwz*bZWgz>;s80OkOvI*)OC6i8AsK8(BF!j+LK zJ2B|2Eh?bSGXyxYr4iHQGo38Tn4o*G-&6L&HQPvKn zkxIH8bTl|Z2hbSB^YTwnb){H;s4iw7qVC3coI}K(7X_!`$Ib#M5u~_ z>^S41!D?L#L^sHo2&6U$?n6in%cBkzt=oj5(sA@M5M|_mSJd!?*uYnjAVq+!C?5o$ zK0QsS;uYMRwuqN(DRxNFuJ@D}3=!7}2y0>u;6g;f)+3=DkV0@p5Xmf0tTDNFm^R=E z5G(0wPG9p1GTfHFi!^P4JB-V8!C9ls4y;XtQ>liFe1(utG`6PCpy-#aEEgVh!i$7O z%75{je9~c*2r{cB!`Kxr5H^VzG2AeqhjjT-?hipJp=Jc!DPT3oFW_EXKQ>J|hKnso z<@*UsQoTFvq702RD#Qv3*7c_-%Oh_BGGlV40AmC8rYT6il;nwpJd}(FkHUV`pcO$t z0q+LtofaSxa_&gr!3d2;d8C#vH%uO~hCFaYV}7uPNh>aVv6tS8_up;ay0n~5{cMnlQbTM^K z6fHy(WwJ@~LjJTOG<%RXs3Ihu=&Q)DFy^lyzfwD#z_3EMr{!2lC5#hTRz6CjKrKmp zz|OBE`3vR}p2QUwe-X$Fvd+$O*y_h z3H{brJSQRtaD$KbRr6%c>U>b0?*u=ptOY{>fBLW6`C5{A$|;x;WGJQT6&u%3YO z<3rGJ2<(Gc5jM~_)P-tvd`f|Y;c$@QvV2PBL!I^$ahjtKr0^vz#aB~UfDPH}S zCdM~db2037dL+qMQIBJKVu*2qeIg0{Gbb$a6y}1Y4wkkc;Cklt!t)HvP1zQhuto+- z0o=fkJk#)%t=(sRM7>#4OnO%fQ+Jut^=TH0;>R`$Ww>TRmR2XCROEYu4Fy!>l+kZz zrTdPYQ3+IAfKclBck#4EvmLh456Ymgtl|~e=lDy#UdNv>fy*sI)2#11QNw7|!T?kl410{zJwZeek1bL(kX-~bYN)$#*~d}%!^Y^BK1nzMEPDXkUpCKD_cc_W(& z$a*;h*qM$@wwo|KkRLTDfyI68oxosg34c_;CYUsIEh;X%sJIBF5)M!Itjx)UNVm%; z2?0h_d04WEgUWs#aDSIkFba;rci`%qrP#raO(di@LGF;xB?=z=jubp#dK{Mt7TX+9 zc`ErM=;I;<5d30YJCSZCcu~-RoJ<(<1kMmhqBq;pVM(vX{PB`1ijxZIqpv8?-V`_$ zw4?WjQ1sclih$|^WEWRfjOVg9hrRmAd zx%5Qcu2Vuw^VViI*QugFnXjbIsayHp6d@uI2qoGP!6JCYlZlRK%L&IC8EUZK z*0nHpMSOocdQTYv5Aik2>ADGfM zrch9oU-D|nU>Wc^PL~a+yFDPUb!LP6q^|GbYlIyj;%398kJ&A4#li^wRbCSsqd+}< z#P+oaJ1u%_p^|O1+oxcDNISVg52dDUCZ$tOWmpRLt$d_QyA7)vQo|s;ngb%l)8=4% z@PtLm1mR)KFtJ)BZ?3K%fzKlzf}7kdYp-MatuEzcDR0Rn4eV56R-c-;Wr^H1;*7E| z6jYT<><*5a_kguic9pP(jaD~Px=|iUTp@HLusw>dmbN-7T`Ipcun{587+xgdj^`V( zbG*tE-YHkbqcCs)5E%dvgHO(9Pvj<0-^{j>IRLpc2)-dh(2IIGX?oHPZ|d!-O>atL zv+!tMzR57OH-dRByCI@+@5y^2{8Vxpf~iw zd5lzbDJVJTDf|e&qvTHT;}MeW+6Mbl+rbJbl;=$ujRS+@JLzo;lK>%Yf^R6Uzrg%o z2dX1Sc8eQeKAxpP5QRheX<7Qj){Fv*#pe+xT@~nxe;k0NzS114QAW`hKe2H6KEfvQ zYj&*B_r5pB^k2H7mz@ET9{s<$=#JtNE7;FDhQ&peYF33~k5b-%If`Uv##+tuAmZieUomeg{16}dF^Mi!Zy z-kTx5R9b&YgUAAPv2Xd@o(6aT3IrVc<_hjZ=*X(Hr#Qky%3r8!4;)wEda8hSs+osy zBW!?&G6UzyfQ`fQ5fxJENScb6Aay9n(9WY(cg@}aiUkGeEDsJIp6ow4y?^i|tXwPC zr^RRqnu_VwFqjb~kpVP|1#l|}p5>Sx!O#HOsPAYVBVDVDwRt<8(kl{b2cpK9sdz^o zOVzx~YTeOpObhdd(wSlb2BJpb#6sXUngW}sz9&pg(nJsN-U1$no2s;9S!@z^0_N8C zjj{9sKm}zN)OGAXfEx@w-|1T)qh?3OSW`bK(#7RMhP@I(IHl)=D^UeK4I?wCNM#zD z((%I*lyx<8(MWP7+iTE;l4_^n4i;D?In6HAUU|c#-gKOv$+j5)QJ93ebOt^dBmt7p zkHM-$;vug+ugl_jot5)$*52TycIf60yO_MUPg~9qA=6X$H$72wkMnlR?{gau@H1d* zCSe?*Kad@XePD5zs&>84pObwq)>z8wU%z7e{L(nc1UhcaoP~q|*V4kb)PflMfj$T%VxcM5*3U@OVn^1Ac0+hm(yQaX@sKNk8#DCz`( zqtv4bRFN^qSr67Bpp9_=N(ybc#)_KZs>>aj8?h$lr+_C*(H8pPZnpXI@`yBHYa~NT zt*kB+n$$GwAUCGeYAyq15^|%8WeAS^xQpppYF&yPpkhmGQKtO7?t@tgc%dNBWce-> z+nHayOA0bOHE)2m*Do%(bqXptrjE8RU(NW zT7W7nG6qJX{Ko;?S7dnW6~)I6BHUnS8T~;Iqe2a(2m@{=FS7NpSd!-lm$WY18K{)O z>$bl8_+a%~KrZJvkHz5U9f%3|QG7zm;_3ozbzgSRSsn~4KU!%`E9GzjMF*1l`8J8Y*zJ+ zs@_=5VWmmkN|Or3qzG(Ke}J&!M^Hon9M4pX!^dPWiA)bM>L}guDDVLLb(PRzh2W!9 zo5?880w2Pod+Mva4D-gir1@6wBhY{AZON zrbi}^ualUZm^X$z&5(qNDKm<`6nQSmRM|=;3lmZVHK=fXm?AVsX_Fq_kBN<69r-os z-Q_XM40a~feM+_y*7a8z+vADBT#+J83v-T*b{jLbgx*cZN8A9yBlBdW6x2Pt6aljI z{IbQ|Gy2W8kv98T=I*ULFU30Y$0o{ROCDvO&GORtvz>=oE}B4Mle1n@ zRjwuU#LU%*GgTVG%!V@$`6d$4wHV^h#oL52Od#!M1|*U=TreIHTb<6&#Qw+KOmXhH z5&>%u>J2LKh^tkdG8mNNv++7Iux?e^j91tb4kezm4OO?vr0x%y%(q336D+bx^+~B1 zD#tNZ5$EOCG^J_{3V|!!71kg4V`_F)Vybv16FuAEwzXJhd$@@p(|q+>-CbxXCKHJV zu4Vg0?QN6d3l&W?&JU*NK}#1;nK@o~;_~|yU)iZf>I_~!H^i_qa(lX^`{q(bEl*w@ zn^pbhm0BT-n5*h@yA0FcxK&gO9D?3mDy;SAF^>zQnr2|LIxi_o& zttxnCw!_4$VmyUB*`h-{2Jv2v;C8#DM zQ&C~EGsM!uonhH*S6S_$(NlCKm@!Q1??VxYmIKD_3k7Tw%XMpose^>B8D5RLSP5!= zpa&K&Qo?f(*))}Q%lG936_;b0Jg ze|E3M;OWI+Rc?#R!f%inqpAlAEB`&WTs&QznaN9&7LU103n*KhBAfpGOuRKl+2Rmq z)2(gsHcVjoZ%QX39 zmDv@j+vOI?!`fyFh|% zhxaA*DF8jwfFz2w+N@EniT}lxsV19kyrv@yrNQAW3@$1Qp%q zl&#B8EEA0rY*;BmoLnFzzhw>Y&7#LyxEI%l*-{>6iUBgC9!c?oEN=BI2{Re5F-x@_ zsJ1=M9+tOJYeFa%rYdGi@-vE^c*dF4lBXLL=5138u?jHW6|#ZAu;zD=5jJPxUM*uW z^rZp?z}TCD)(vCMfp_BU6Dulu0Ain)>9C_Hqmn0l+9;{fISsQ}*$Luo^3Hq4W=bDp zV|LqqUZsd9%)}glV#*tlW>`1%Qu$rss;NuM%Vs%}2@Iv0CwpoJ-8emEOac(Uizdcq zEyLB~+jil$xtJ&Wvh8wl5%gM(SuQo^^b{Y$(P(5Xz>tYpu0 zuV}i6yE+YbPFdBkX0gO8V&3~sm9{5e#{xu%uVBO0(iU;6Ya-GTTXjPp7IRDBNK>f_ zUfuNCyj|*OSEjAdFxYZ}#E`4B{FVOBaQ&-?WAZ_XKca`^p=0mydJvCzDG#$B2oPlR zWl{v9*wKNUbc#lrNv%%2O+hlU0PV;%243_c>UoiCvX*h=`V^HrqeGvfj6|r?#yJym z06;}biAp^j0$EW@zzqzS4c7;;62s91QjFF&4Vy!i#hR%Gs4@Xyi+nH%DHPpvDJi@f zVWQyYZAX_M20W-(4Uq&{Y=B)0qyb1mBZer!4-H%5A7X*u1fj%nQ_3xai~yh4;$lWz z%D9#o!mk`VeRB`~y7GcU>9Nc>6J+i)OlyCpv%IqU4xHyn@Lg(|GEs^Nd7w8O00;mo zEYN>ohUgv=-Xhd_bE*0G8nR7N^x@AMZ-sQ;kl#sayh2&hJ42@HwN2k(YQDt5JQ1EO z(QT1eo2N?y!*6vJy953mHayU!6w3oZoaM4SU@KCR42%zL@X{IV?BfO6!VqUMWHS-S z92DBC>kl|}Xd>}LVkVW=;R)UxR>;!e^q}N`XdzZdNw{vB7#72e_ThmYOHJ0`P*OXF z`f8-O`DNC9n7yO0Oe94aRW_9^q*j-lHhy|?z#;bXTC1ayvXv*6UGRpz|DAp$e2*t25S&uyBAiG$`k?V=@U|DTeU? z{zj2nPw${KC}Dkrz&*wT{Lz0c>oG5B7V;7j5!U z!?x7}$0>BwFb$rFGh5(SyItA&KqPFtFm!Adm~N-oI3WwuGkcw>M_CZ!R-DFgT=}qW zv(KT4BxS>{vxVoI?(!40S_UU|x|tXRTVuvp!mM$nP*-e7+|W?GX2t1g->~e{(>mL@ zbw>XZ*`$z6Iyx1m_=5JqF#F7u?PAn6ysRkR)AZF;lBZ<1JJ(8)XzcUHHTXHj7Ow2T zA+C%dzY>wb*jLN)f=ukTNKbRe^vO4-rA_fK=A2^NrK%zmUSUBLbv#Yz$=vvkGF^)? z;HL88scj5{sY;$YOgEdN?y35;&vZA_ub|#d0vOR zBAN`^xE-|7ZS3sPbD284Xe(WFhnLs|Gtk>v)3Fc<;IBfI;~^nnO;H0o14R_ffw=GY+pk2vH2@Nb(_V+mt1DK-b!~q<}SH8L5{__E#nn=ljm_s zw-vV_h32`cM`n&+kaIB+@#P>xxIj5y)=5PXMyc0s`0;Y}P_G1v(8ZBF=m}CP%G6}l z5^J(joO>wUji>pXL#$9t>mWlK)unHbZKH3&uj8uTG(ZvI!jokWhL=$eYcAy~XXf82 zR!DN@W%Q=5Jh}7&)&h#`%^wG1W3e6FDBQu#CFSyhzi;GW*}&vRhOJbPVk{4JJ=G|c zXuMe=(+#|Yb*VG}*#;F=eX2^_9;`AP#eL*}o`~VnZHH_!mRHyJsW2A3s|Bg{^`y)u zjQ(I+7KE9modFmK!@F{Y3RYh`Kd!4S7e6HX)BDZmcTirb`pgRpKu}Ermr!x>dRION zHPD}z4K`i%^Am@i^L^*s404PUq=BG7xlkvCRMRxO#<|55-Kwy#YlSKwKj&uNX<`Fz z&!sZuH6JR#hqBL^YZkPKyp89*kn`=_3D^lN6=T8xb-qb;nowl|=m`-(_QV`eC_u~@ zsHxEt$e=vZ4bk`}+F2Pg&8`=|2BnxUy2jA+$?>m=qvP0j1_$sIm=6{EB|0+OtJf~Q zlosDuM%UV#tBc+VjYWTO<2hi3my?SY+3AxkWx$#u)i)(K0mGJz1MmpuP6h%YGp&m{>(7fw%Icwv9T5e7luP#+Z&;9*Zcf=eOEr88Ty*k{Eni4dcau}jnD39p)H#vz7`FsLFH?R96U_l+_6Gs3W_z9U@$DA7G& z0;d^DS)l7(!-Jj$qG_*3egq!I#tj3Ketgl;(-_!B2@V{>RY`NzU+3u$ZBDM{n5Ww^ z0&77gYYI|YMn>V=9U-aXc#^8ssze-<06n(Xvrhgfw@L}`>P&M=Q@$GKzE5*z#9&@(&3UJM>jMgHRHH6j62$Qn>!5@wWIL}?3!9r+Nw zjY1kdL(4@J{sJbT8U{7|ri-FjI}*!BnF*M&hKjn;bcPiA0*ebF0ja5`>5rg}JbwF9 z^mH2PvL&S=Z5vDPdYWr#cBH|^JDUcf)tS4@a=FD5dTr6&-6+@HjoIz8d4*V(S?%+R zrkv+A<_(;z6V+w>B>laSBaHGS1j#N0Ecl;-Fxy4N9?-`Uqs&>uOmFw`B;-O8jTVuG zNKj(U!N~}SL+tc3Jcs18wi8$Z(DXsb3SDC`Fzsv2TOjE;{;6?_bGk6r4YOSa;gR*V zX4JTlJh!x<;u=~Ml`%gBbfr<+)}nLv7Z?me&@U@^_{)qokt zvJpey=^H-fL#*PxOthI&PAF%jAEnLc1v z^bQnt+pe5DR-2=iwKpreJM5V-9>>OFwJoQ2<~l>DT>9Ysm_#YXQ>)!z^lH3Gz8=2~@1y0yv6+~x z1h0V%9jbgpcJ#mlu)?mQV9bSQt!MJutzh7H4Xa00JcdB7q1`rJujRO=w^~Q%7Q16A zaSJ>i#K)q<>;qa5D5qc&sUYq-9Uowp`VvOW zHQycr#1ZwAQ-+dC&P?A!jQDfY9V0$Gxu$oDr*R^@AC9rIbAmhdsH5*W0GIE3+`+ktZw-5_|2=Cb zmsVH7J%TgG%acJ%?CtzbNH9WyHdwrg#6Yj4Xs+T-Pw-A>JEnurtpQbWPHyfzc1=j9 z0)2X5wHV!RBHafP+0g;GFt3t0dCH0k|Kp1EKs4U!8Ur6z0!~g1`zN^23EQgh`$MY< z1;(hKgB{+#L-WGV-?zZ1F|ltpG%Wk|7+%!x%i3h2UTp3lA9`$@naaYHy^h2TL+FQoCL02m~U$JuI-EyXHtkylY zHdfYGK__^X%EudXW zkg;#LXO>;Vi(7hQeQ=?iAi6I1%9&{^3`T6$51KZJ4?2ROMYi@1KCkYTw5}w6P+=J| z04Kr>q8|j-fhNqaDfPvK@l9rn(LM;)n$nNtvlc(osIS)>Xt4xLB|e?3k(XTK?V)oQ zo6_Y<5|f*x9Oi{OnKn5>C)#?wD$DtpcT;%mo)4P#hHW}K_}10c@i>b39JHh5T-R$@ zMpbT*q3dPr=b2BpZP(S1^^oSx4+AQ%;6aspUWTQ2UUzBd2CqV^L!7za*cX>OSDEa0 zC)pdVw`N90xV{b4t+v~1Zu#?Vi*4OLoemddojYw#X5J5=-rk5H7#=-)=kL(oni{__ z%TJ_p#1!2%UgI~$uH1oeo2^o8?fyz4{Rj`zk_K$=#47oV#c zwOv|vANF+S(jOuJ6KLTWU=f)SNK@};qwy>pQD(jH>Kq9ES%>6;pw3I^*ZUL>`ejndK{Z{dMJ32czfckE>DI~M&ZumM*<&0ds!;+*ry55}b4Q`E&{%VXv zUtajSid_jlIsYfs;`)D~TKrTr$o`9J8E*1&)%Kkn>`G6F24Rb(#5Rnabj`|1U6QUN z=p#Y-^N6f!N-7{5_Di&Y+EL;w%r_a0z6DyH{cq|c! z)da7wGMHR9NbN^78LMj0yAg))>Jh657F}^6&@b?US3S4*%xH$>bKrvdFc6e0f+Vii zi9*u{jXe^g#-9WcchLMx)(SE6c#1QHQ{e`$S-ed5UXL#_e_Z|)pHjwoj6xfEeL8f3 z4*b$CS#;xFukHWNfo9QT{Ei?693Fl5i@v`k~Vgm9PPU(rt zK-rb`TLR({eFUYc3L-SL3hIv|E*sx7Lc=%Xfk*+E5fLyQf=qO;HK#Y5YYJ{n?CxX8 z{M_6ls_L?sPKk&8XxRE7Lx2N8%6$`d=$&cgG#6=Dz&HjR|5yV8X?p;PvNmzeARYs& zgoAFm@hM|LgeIJ@#^mU$N)-j7ztZo;MG4SMEs>pyW1O#6^ZUX+cMy8AuGp;l?>@qY)OQ`AcNX_Os2jI%Tvt#^%i`L32p$J{v8`Ue5H9=DIM<<22yeCIFepTH?F-p~8 z$kD{1j+J$TQLpA~3!Wm*PbcIW6S4-|esmo5)T>a2 zg%1-)(*|y;ZDz33?ifIJwnc-2V~G&0V2kXT%izQ~`Ls;l5FXr@2#@bpG>2j`wQ(^O z8qZD&w;bx?XOaAS&Lq&M^x-)?kanGr5n$R0 z1Pm-grS;AmlJ6L{rHp|y#au{b$iCQmXFCZFjMUUrOkHcOJ7eLn?ikX-N8Y!>l$}vA zvl}JJp7Mv)7ESlIHDb_{&MAKC@$m;?g+SoJ!6}OYme7yT4R;1Ma_Mm#3^MwHTrqaM zSWZ`R!Z$sdp%mq$NHg?5JE{sFF7zZJ$#o$H2Ym!8^Yw)^+207xkiM7aX`f13NOr=y zX?CuA2#;t4NimjKPTHR>j!j+eqqYh;&a|?nMBcK0iOg8qO@6JdH((6MiXz6l2`Cs)VP;N>#qj@Hm;AXPVjBa~>XsMnZij<{W^e^@S0B zcC!Uvl|NbYIB8c&K0;9oFz+<1E0}X08h(hC4xDA5B-*@&hHsD#GP941bwWv*i;i=7 z=?rvH z-#KP0q1nUlOz#dLp8@IF=yy|tTp3N*j1aSCV>32aUH@M4zoc%J@?vbMGpqS1Xc~^b zVj7<@N00GIgSna5kJ`qRG&5F-_1_gD@dIXtE7R);k*&8BgeH_=asYl8m|vzFe(}{+ z=RJ2Y(tthN%!IktLXg1f8sv5LZweN4cohDy0c8oVJy3{Dx#c}H*j*S_qYe`WkMv23 zYU^7HX-lMjPwrt-GS>ohCSE2ikEBZLVXcbl=NS6Ro-A}>-6(004K7^=_`Ty{z z6P7I*E6dnZ01xE(Lc~DN{BWfl$}H2W#~k%0IO43R|5ylxu0I8=rjQEJM4f-Z;x>G9`4TFTc0p1(_^hE8GMa`a1E|9@4Q_H`X_i6+ z)a>3Rh{Pe6X67=QA+LQmw+QNuLbbCf;4pNL?P zFZEztn3wMOv$5#?tdn7bGe!z+xBp1lB~8ZEy{z$UMFxE)iFIsS5z;HOrKoPc`>fBSr`J+kciiA6I?-!>=%xx%ym=e#j8}d2?5t~c-2K12AD-Wj->bov ze0#ecIvsR=yb*u4s~0QG98WkmE@QY-f)&`CTrXmEz*h#*nAo3RteowjEBYJxl@i!@loge2-^4 zZBOh!`~A7TPo>-MQ}o_HwLe84c0ZH&?Jggoc+tEsH+&DP-~d>3Ef-mllWb6P)-&30>_0Y7hFx!Z5^y-Sr}*`B^FPyRnHH%ex?7Cz1g ze4q4u54f{FZ(n-1x5h^&P4Jtqg+I6OJs0zOy56%pwVyMidau73x`OE3x3O05lat!d zNc?xYm+qT)p&!c^bl>;kSl=fry_b2{uT5~Ro$8;RUY1Y#?-jl8bl0sf=G?E4oj0DF z9iP<;z0WiHukPFzr`)g5o!9i6*KPJ|pBwxif8VF>orl(+CAFVh{O|Bp{4dwg+>eIs zm#ddS31~wY@*RxZOXVK5yHu-g|03lRMm> z^SR%BcHSio-;I2)A$P6YulsyYzb~d5|BYJj4tM8uyq3>%Hr98q_Im|i{jKSHn{VyZ z_UkZr^DXD*?dazmoWAGTNYCf?>Z{lH2iy0-toP+9$B?dMqPyLIE|gzx)U?Ezq;4z zDE8}_JUTJ=E9&7;%6F*tr_k;l*!O+aXUF%w{^u;QmG22V*Ym@w=LP?#F`Mrbz2|4c z=N{hXYqisk`?Hz;`$bOo<5=(K+qL`6WEr3HmAd!&UC!&`<|o}@!iVx*j>2(4B34pePG|bk9mGS{XWNOXRi0!8~SJ4%Lu&JbFS^rwb=Kf z=+kWPbG7dc@z0x8??vwN&ja-8kLl1)C@*rR0H(Wv!spM*J8ke!tsTLS*=Qf@k6vFd zImSwWLa6jEuvFnTjwX-($u+{cPl33K6^rFX>tpoD%5inIR%_E0(+|rPFFIwba}sB> z=4O7*gLBN$yon|xKg|&NHOXx_mxR~;%#xR( z5fLaGQctHs6p&6MyS|{S0Po!|XTh~EyAadnL|WFzLjh?#RwQ&F>y>PoAK5?9wb+Kl zHDL79Y~839ht%Q2B^$m0xz+B?%3++vX<8Fl^ff2Gi4c9}I^;#^$CSZ-`2y>TgF58* zV{;n_AFZ}D6KAm()|2YE#q7P^9F%D}+iVql#<}_vpg#+G<{Ncm%Z8=!p%+;0zxuud z^lkB?+vVHjdjEdljZ3EE`}vq03hwDq+|u%#Ki%Ej{6YTm1mEj%e@dwS`G~w)Ct~v6 z-25eU%Lx(qZq8B>%Qm0n^FIenyMhZ%p0D$fKC{m)$XJ$LpZAlGyf4}rqM4l-?W~b2m%d+be`czS9K z{oUqJNM+a6@^hHR6TSL`ElziIy*)n|+8G=BA_ot5bK~n4iOa+@3uDX2;nwEs@%h*v z2>ka3tbyR@NX<1?E;crYcWuM0`r~@;(3RIAmCHhT*6jJ$%xnWn;&pMAe-?9LCqN-^ zCW=tCWmGwm)j(L+&mlW2Wl5%v(8CPz29)?aY`Wf(QrBebICEF3O{gH;KFkn1@7&c- zx(Of$=nP;ithbc9?TO)KsSm!1XTCarPmNZceC#qicI$MMPhVKWA#*YQqsZr}p1$6T z<3uZV%=oksORdC_hKy+;3(kCCRxd)VSwRBI9+qjzVE9R?9(_l?KO1CAWG6H2C8$ub zk`fA8@`u&XOxn~|sVZ7|)V2r1)%jk79W0}9uU*;7y zKVu78<(#xHMl_oY7kjW67o$@yZ+#PKQmhM|lF3JD-C02&P+rczAu6yJ>gu>9Tdh-o zM_2s4+JitgVml_9sHEneC7N2mNEeejg&;-H}2}qGhjH*)#;QT0>~|2v!PV+_T*3Y6~?fuZj)H??#Pvv zxyfAmzs*SSG3f>>m=pH21-7xciRMP8^)ctFtWa_Q5hb_#%XBbwpsW9S1X3FoRMC;rVUM2D$-k zYl)&dZDLw(ZhnQ_@3+G3=de>NY@n`_R?34WAAn($@nUiUQBmA*)O_Wb&;3e>NLbx3 z+b_J>3JU7a;D5c7UA+|tjJy}_tuk>VQ)KG^Hh2-5yNQ``geHgmvh9NEXbxA(MPHDH zoAZ;r_pH1J*=D3$XW%3uzD7iVHWg!4ShFq<=s0X`kr8k8^spodK>jLC0!gd#fL?wNEuWM0wF4&b?<;KyZp9s+c6PaN}XF0!ky(fslc z1Ptc4IBbf_SI318*aRVo?l=wTMwSi}l~Z+@mDteo@P+WvP4tBiT&}kTO-ZktrCqIe za0I9X%S!6&WeB6=#l6MLChwn#8^j3LLC)3vw{sjkjz&*|^Y>eT>W?o>FmxsU z96^||x+5o44$ZZ&QiDXzF7>?HS%Ed|%-=tNu>{Vzago+a;R2O* zW`Jo>*7tc8(AW%9dCW{(Gj(E}azv!%kpoD`1T#kMHyB+0@j$@?a%IT*5~8t}z^)q1 z`j($00j&YJ$Qc;*0vA|ewMgaT$YO+cXxIKQQlNUTC=q7=$n4Xnj{e!K6rd@)?zJZN zlJEODXn`y=bZD26#J(0CQGEa#opT=am&!w=hSmho_m6K9-s#zcClg0wd~iVXr<}h7 zxA-uu2^4M%#u^LYoI^5NKuxTw<)O}~i2NZqDX8=?hv^u_s0wL1&;rzg6<+2JZK&{G zjF(>Yra}{c)sNZELOUf`&;^nYM9IBZZHJ47z^W0LYl~r?V0V?8q>%3fX8%gV>E37F113qtGWw{bSS>??UH+X+)H7 z1gQquRxdbQ8L$<$87bk1bd?hxmIE&>80Zh#BSq^ZLoif342gR=(_-Wi|6K7&L^ol`3U>7U#LMu)6@nz?&%zzt7mxS1b)!sut~r@VRQ$FPiJWeApm!#$gjhhsBn zI*`n4y!DR20QPs(2nT4iBr9!>PYKv@)T8`{msdQEqND_7zReHCM}Y>Msj@7LfP%pB zd3b$`xeEZAu4-zxEv@f%s*o`rVc^{eD{XY}eIPRBt}u-mv#8aIslq|Oy~OBA+7*CI z8rFhhBDvj?TAKF8@JtQ@$Ox)Oxr>J*>pWaB#iTVIDDcoA>4tNL*+62CM~F4MEVy5J zC?>h&ocv>yyfilVl8@uHjsuz11o_SD&fXo-DMqM40$;6!T&jFNPzc-D_l@BxiL9Zf zd&W#70!_bNK=nu~%AfgpwVqC&A5X3;~s#sT*^I#wEitF z?fO5Ruu1&LYMbJ6QAJ}`@r7NzD5zRUdM9p*@hl@I7Rk39N>BP>3mL>xR7_hD$u7u- zlZqJY5F4jdH(ABibDPSe+NFypm3EZnPVW}$YJpkhT=}E`1V8yxM6yN@3|W4xdI|@| zWz8rhw*}s1utCVfi4t|0E@P+gG;qoXNLhGXl+T#}D(Wmh2ULr@VI?59G@?9MpzWha z6ea;#xeFw&BH^{G`!QDl9CVF6Lr}YT{$@Bt-I;%CG>l-vcgP4HMsqSlg zTl2Dg0Bl)^9dg*Mm-@qp&)XBG`~sGs=_tlzl*40y%%Cs-E_`*?ZrD=t?PuD}VL@d8 zMu4wD5}@65eNZ!if!X7F9MPzdTYOY_azpN@E!lZRex#}5ViNru3US8>TkHntprqHp z7{N=5b`WN<8pnItj`BFWi25yF~az8VJVaf zSK#=t@MZ#;!^)ahSW-Rz)LAN zVUkeDN&uf$lNta_{R2Iy#rBhKUP>2m_QcGRY>ImMFC&&CyWW~9_*2~%`a+)+`m?Cw zI#sJ3WW~VPVV8Ap(~ul+C{`pzXZ^0hN@<>zgSc<8@P%=z-6Dht^s-N_6eBp65#)AP zT=M60s0U;b?cYD0(%i0)z9IU~j3yoa^*(}bWq5(tCr4?jMXf|ld>0cuJmmg;8X-qn(+^u1Y}WULOs09UvcE7s>jJw=k|Vo zz7@EvuILCsc`&(<4aFEo;dL11UDG)3I|xQJ)_;W7=I!WyG!sR_?wL) z28+WMQ_T)2=~wrc(DzFBH>_d<<1Sm z#E3~`J_5KfG`T5xqG%G89o81b$b>6Bk=4T;GgGO3=mfFnu6>gS;VbN4n>tiuOCTT2 zSmXJq;j3E0u9^Sc8dp`bw|Mvclv?YG5>!^37B|tBfWBYG>{-;?_gBoU0Ffo?6Ch;i z5#cNjPJ~~=N*+IX;n5oE*5$NLw}gyl#5B&-%WV#Oxo#8D2P5%k3eZG;?M5y zbX_)eP&K~3sam=hPAiJ6%X6uso883*nEw7OBrpo-Y<+47tQ6$L`oa~{$6{Jzq15v5?`R?D zeR`--{(o>QB``n+)^ovw_#-4|sTl;k_k(2m$agX8xakAJ=}dbqI^Ln=SfEeQjgdjv zHj;y~PE-uWMNY?tP}b~qlnL#G9i^d!h%P5^Ce3-RS@C=oVNJ3~xl4nJloOG4C?yz{ zeX-ye&oV=zpW)$c@E!asYxqDEczp^hiji#$sUUr%$8s!Fg2<%bd&Kz?oq|k%`$WkF zKOeUl#%D1*wu3f_U^|ywaFS@Q(v_zWDwW?+ zX~#O>x{_9DdD5hqw@Uj}Zi7b6SWQVsKPpd(T9TciR)h z8)CQ0S*STxvCu#lizhi_!cD)HkVrt1Z80bS21GlD9XVVrH<^JH&LnV9l&!a{72HG~ z_6io2c`|ld8~EGSNbV+Ugx_?lURuXJfu^b$X22&bEGN+#w}i=*qd+KO#Na0qp#!L} zs9)JPEY0GmQ9qc%M}#!ZU@&^?BI*PJhwrzchq7HZF=d4TZwM`~Te0@iBw%-XX6{6S zkma=E%djqU-N`^NIY*KMKqt(TB<+UMBx#4z2~iBvIh%2smgK*L*+fPh%$Gen*h7}`o$d7>&@83Nju2|e+5^~p9r%fM28*-uRz$b`cA4h`6 zl;o(6OEU%es)SoVlO|nz=MNA90035GB1=9U7O|W_nui=el)B$E@i2Y4`5Ct@{AL10 zAOvWk_eGQX)NHMxM^AZif=Po>vmvNAd~8TFYy{mt`VZ30EFROmnl8^oI420#Vtt!o zM4#deKqD5YJ{UIr??xrP9)luZ*a=XS{lfTE8Nm|U^KX<2&8+VJuvsawc zf*D9Z$wam?s7W-aTm%v&1^gTc%Zo*GQVwq~qae4M+|;xg3(Q78=52cIM(Ip`n#Y;$ zHtt)LLPaTIwL(j5^S#<|XF+Qlbc|<8c?#0JF~sO2t># zYw>P(*>NV&)2e(5^>Qs54$gh@eyIRTONZ1cXUk7I_ooE=+B*%^-*s}L3M^!h*huQ( zh9N~2WYywjeF<7oTJaEoITs^3R{SLl0}3$wb|M)iA?2xx%%yv|ISup!sd93}XnRVx z(IuM(-cVZ#?k6Ia$bT^f3VB-jSfT|nk+QA;gHz^ti&vt*S=FtQ|7 zL5<8b(jp2bN>fo~XPly>^m@K zti23+ctjTan({Lh)LqGI6x;qE>SG8}Kuan8a){+a^kno?M%Tv}f90vJ-3ths|1`>? zGHJ?;5mS%#6Ce~hEbHKCG)bGdQNA`<{9!||EIeiZj8}TZ&SXyQdoWU>F~u#RABrZ$ z-VXwqU=rHwB2k-Rl5sN1$Ftdc0 z63ZD!Jep{1t5`$kBr{TE$viU*Y6)7#yFLH4YgP+wO2r2F*F8%(YPXZk<*K!z#u7EX z5o5%T40irIz$itfk}C$WuC~;-lad97&@bsue|I`2CMk7oIO^qs^yQZjUNri2Ve-0AqSsTQkF91Hsq&CiWRt6fIx&olq@?_3 zGsx~(tUtL~Z4Sg~LnG+Z{0C6hK#>v|bUphuNtAP=z$em2fALxDu)-Y5r)-LFHb2Hp zwr}Q8E1ukZ$Z*oFe@X#_lXOK!w}hT?fSys9VZHD1OvMk)LRhg1X<%5%u@vc{>NrcD z^!`#Lx1Iw-IMoo8D2iYxuymD}!l%D|LmkE@ivt6pDrQz0}>{tx@K#n^!TXlo+%z)F6K9UcEepk#P2i1`1HYM2u7G ztViaz!E7p6pFzZ%#T}5O#F_ac&TQ@D`<8Z zQ8`B*84+VA3t97nyHmSBQv3~w&;?I40F?L*W)mImkwdzI4Xs?NKwZ* z*;V+J;(de}nLrq!4xmp8;5?^mAZ&mzODN}zFS-TrI>XJNrUm&$e6ao+#v7Ifa?V=9G>XArid6fG zKs7-d5regvOu)Rz#RcNYRT$IXf8Jvx$SUVV43ro?`m(6OqQXl?aC!HO60(Ys(3d{- zqR2XXPO;rLVO!}5Q@gF)o4US72^klF^^*uMy)55PkJb(;lgyKjxCfUU7NB| zBgF}A=2)gNT4cf6$bcmiTK{bh#*>QXxeW@cyO~P>H+a*AI?EN?@$oJlowJmgxOwVPyr!d30<2WWI;!`u`3tUO zrJ={NJV_(0aR|1mA1q!)et3=yJr6eHXo5eM zW}B)VP-6PS+d4ih*M1CYD#sz|0U*I}!TUd|om-6v)|+|i?ut$%jt+3~TFAe+MEQUBMY~86rSW(+PVl+;_sFOTvmN#O2L7njJ&? zp3JWc_4Or}ww<291W40h^Fj9@$^37~9;_0a_% zECCQG@DOY_`?szySlEeBhKHYdFxd+=*p_*eC5SG-MAr4Y5r?B1oKjoqXf=xosNr0? zQAS!0q#^5Z{r}Ja(6^++c~p5hN94#Pn~_3$$W^(;!9v4MFsPnqxyy`Lt2`8yxw%QG z_gaJIl73gfWFeplbUrz+;`1MLvP!UD7e^DgS_a#$5y; z5QW-*34D#yt@rGe_rrw)1JibBsYGH3%fi+(N)gkJ)S3%qBlm!bQ&qiP(ET+7>XvNU z1h7p@Zz3;6Y+4-gfpEzm=!16lyVfDkug?;Do?Mwc_BD1hd$R~x; zaSd@}x%m8IH_Trp@k*@no z8n*5OF4Ig9(^d6f;w0T4LTO^~Lg?RmfJnKbWu(73K|^Qp2fRXNs}XiUz3keR?7GWZ zI)l8#R?>c%F{o&e1bB;sx8lw;edWOF+9T7fgJfCUqilD5;7z!HJU;-O!Ef9j;X+kI zD^sQ+ESf__V|^r31DH*vCX9()c^rO~oYiu-6GZ@_^-! z*8<&)+*GB&3mu@V6;se{l9;}L?cJV1=JHNBX8F@F?Crgr`>eP_=Ge4KP6!!+b4g}B zU)&xNm1y!yoIu%q7fqaaRLxwmf)5V&>Dqcc`u z`1}Wo`WYXRPXfpZHiZHt&p?dMw4}L}Gm5J*kc`FZ0UdL@*0ake3^`{e3#4*vFZPxJ&)2NKUNQ7CJ$Sx9Xu`s zT!7B_+l$mqkM{#zPiH{J~dlZ4&WGh&HbTJIPkv_T+R$bn7&jP$iRChi%jL|O)yp`C~z40=>#9lQ) z56%|9lRA@&e#Cm+UL8H~17UWx;V4%pg{VfUK>FTIyZab5B0sK?7$irt+kf0u&ztw2 zMghnJ^zBiFf9TY;NK{&0H4hQRRI*_Pn1CR4jfAlo;<2IBtac?1vIHf$tQ8(iB945` zp8(PS!X^zeNDUx>TTUiru}V&HMWv-mi6z~ToN=%rZ9o(Zw1$k*)DUgmdaoLea&9Ei zA~aPv7ZBjyo7qH(7QVL|HK#MoP#mX()+~C54~@Z%8tY(U@L(u%2J;Vh7%=CjlD&Xi{_vXZAt;ahdmR

HDd;pS#DWOva(FeF_BETC%5_)Vi4C|0>e5dOPpA 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 z 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 FDga*nhCKiP diff --git a/gpMgmt/test/behave/mgmt_utils/steps/mirrors_mgmt_utils.py b/gpMgmt/test/behave/mgmt_utils/steps/mirrors_mgmt_utils.py index 47d4a400056..1b8c1caa7f0 100644 --- a/gpMgmt/test/behave/mgmt_utils/steps/mirrors_mgmt_utils.py +++ b/gpMgmt/test/behave/mgmt_utils/steps/mirrors_mgmt_utils.py @@ -479,7 +479,7 @@ def make_temp_dir_on_remote(context, hostname, tmp_base_dir_remote, mode='700'): raise Exception("tmp_base_dir cannot be empty") tempfile_cmd = Command(name="Create temp directory on remote host", - cmdStr=""" python -c "import tempfile; t=tempfile.mkdtemp(dir='{}');print(t)" """ + cmdStr=""" python3 -c "import tempfile; t=tempfile.mkdtemp(dir='{}');print(t)" """ .format(tmp_base_dir_remote), remoteHost=hostname, ctxt=REMOTE) tempfile_cmd.run(validateAfter=True) diff --git a/gpcontrib/gpcloud/regress/input/5_01_normal_http_param.source b/gpcontrib/gpcloud/regress/input/5_01_normal_http_param.source index 6b18334c0d9..66f3564a100 100644 --- a/gpcontrib/gpcloud/regress/input/5_01_normal_http_param.source +++ b/gpcontrib/gpcloud/regress/input/5_01_normal_http_param.source @@ -1,6 +1,6 @@ SET client_min_messages TO 'warning'; CREATE EXTERNAL WEB TABLE dummyHttpServerstart (x text) -execute E'((python @abs_srcdir@/dummyHTTPServer.py -p 8553 -f @config_file@ -t Parameter_Server >/dev/null 2>&1 &);for i in `seq 1 30`; do curl http://127.0.0.1:8553 >/dev/null 2>&1 && break; sleep 1; done; echo "starting...") ' +execute E'((python3 @abs_srcdir@/dummyHTTPServer.py -p 8553 -f @config_file@ -t Parameter_Server >/dev/null 2>&1 &);for i in `seq 1 30`; do curl http://127.0.0.1:8553 >/dev/null 2>&1 && break; sleep 1; done; echo "starting...") ' on SEGMENT 0 FORMAT 'text' (delimiter '|'); diff --git a/gpcontrib/gpcloud/regress/output/5_01_normal_http_param.source b/gpcontrib/gpcloud/regress/output/5_01_normal_http_param.source index dbe5349e385..68b4d131d52 100644 --- a/gpcontrib/gpcloud/regress/output/5_01_normal_http_param.source +++ b/gpcontrib/gpcloud/regress/output/5_01_normal_http_param.source @@ -1,6 +1,6 @@ SET client_min_messages TO 'warning'; CREATE EXTERNAL WEB TABLE dummyHttpServerstart (x text) -execute E'((python @abs_srcdir@/dummyHTTPServer.py -p 8553 -f @config_file@ -t Parameter_Server >/dev/null 2>&1 &);for i in `seq 1 30`; do curl http://127.0.0.1:8553 >/dev/null 2>&1 && break; sleep 1; done; echo "starting...") ' +execute E'((python3 @abs_srcdir@/dummyHTTPServer.py -p 8553 -f @config_file@ -t Parameter_Server >/dev/null 2>&1 &);for i in `seq 1 30`; do curl http://127.0.0.1:8553 >/dev/null 2>&1 && break; sleep 1; done; echo "starting...") ' on SEGMENT 0 FORMAT 'text' (delimiter '|'); CREATE EXTERNAL WEB TABLE dummyHttpServerstop (x text) From a1261cdf9223de11a249244d4d962c18d7e2b756 Mon Sep 17 00:00:00 2001 From: Zhang Hao Date: Wed, 28 Jun 2023 11:44:55 +0800 Subject: [PATCH 3/7] [7X] Replace pygresql with psycopg2 in isolation2 driver. (#15736) We're going to replace pygresql with psycopg2 in Greenplum, since it's maintained actively and offered by many system package managers which eases our pain in packing python packages. Besides, psycopg2 provides real status message returned by the server and we don't need to fake it ourselves. Co-Authored-By: Hao Zhang Co-Authored-By: Hao Zhang Co-authored-by: Yongtao Huang Co-authored-by: Xing Guo --- .../gpdb_pitr/expected/gpdb_pitr_setup.out | 24 +- .../gpdb_pitr/expected/test_gp_switch_wal.out | 11 + ...d_column_after_vacuum_skip_drop_column.out | 10 +- .../alter_blocks_for_update_and_viceversa.out | 10 +- src/test/isolation2/expected/ao_blkdir.out | 632 +++++- .../expected/ao_index_build_progress.out | 22 +- .../isolation2/expected/ao_partition_lock.out | 12 +- .../expected/ao_same_trans_truncate_crash.out | 6 +- .../isolation2/expected/ao_unique_index.out | 201 +- .../expected/aoco_column_rewrite.out | 1706 +++++++++++++++++ .../isolation2/expected/aocs_unique_index.out | 201 +- .../expected/bitmap_index_ao_sparse.out | 14 +- .../expected/bitmap_index_concurrent.out | 62 +- .../expected/bitmap_index_crash.out | 12 +- .../expected/bitmap_index_inspect.out | 14 +- .../bitmap_update_words_backup_block.out | 18 +- src/test/isolation2/expected/brin_heap.out | 18 +- .../isolation2/expected/cancel_plpython.out | 14 +- src/test/isolation2/expected/cancel_query.out | 10 +- .../expected/checkpoint_dtx_info.out | 48 +- .../commit_transaction_block_checkpoint.out | 4 +- .../concurrent_drop_truncate_tablespace.out | 106 +- ...ent_index_creation_should_not_deadlock.out | 8 +- .../isolation2/expected/crash_recovery.out | 2 +- .../expected/crash_recovery_dtm.out | 60 +- .../expected/crash_recovery_redundant_dtx.out | 2 +- .../create_memory_accounting_tables.out | 398 ++-- .../deadlock_under_entry_db_singleton.out | 6 +- .../expected/disable_autovacuum.out | 2 +- .../expected/distributed_transactions.out | 8 +- .../expected/distributedlog-bug.out | 4 +- src/test/isolation2/expected/drop_rename.out | 40 +- .../isolation2/expected/enable_autovacuum.out | 2 +- .../expected/execute_on_utilitymode.out | 14 +- .../expected/export_distributed_snapshot.out | 52 +- .../expected/frozen_insert_crash.out | 68 +- src/test/isolation2/expected/fsync_ao.out | 42 +- src/test/isolation2/expected/fts_errors.out | 26 +- src/test/isolation2/expected/fts_errors_1.out | 24 +- .../isolation2/expected/fts_segment_reset.out | 4 +- .../isolation2/expected/fts_session_reset.out | 31 +- .../expected/gdd/avoid-qd-deadlock.out | 8 +- .../expected/gdd/concurrent_update.out | 94 +- .../gdd/concurrent_update_optimizer.out | 94 +- ...elete-deadlock-root-leaf-concurrent-op.out | 8 +- .../expected/gdd/dist-deadlock-01.out | 6 +- .../expected/gdd/dist-deadlock-04.out | 10 +- .../expected/gdd/dist-deadlock-05.out | 10 +- .../expected/gdd/dist-deadlock-06.out | 6 +- .../expected/gdd/dist-deadlock-07.out | 14 +- .../expected/gdd/dist-deadlock-102.out | 6 +- .../expected/gdd/dist-deadlock-103.out | 6 +- .../expected/gdd/dist-deadlock-104.out | 6 +- .../expected/gdd/dist-deadlock-106.out | 6 +- .../expected/gdd/dist-deadlock-upsert.out | 14 +- src/test/isolation2/expected/gdd/end.out | 4 +- ...nsert_root_partition_truncate_deadlock.out | 6 +- .../expected/gdd/local-deadlock-03.out | 8 +- .../isolation2/expected/gdd/non-lock-105.out | 6 +- src/test/isolation2/expected/gdd/prepare.out | 24 +- ...pdate-deadlock-root-leaf-concurrent-op.out | 8 +- .../expected/gp_terminate_mpp_backends.out | 2 +- src/test/isolation2/expected/gpdispatch.out | 18 +- src/test/isolation2/expected/gpdispatch_1.out | 16 +- .../expected/gpexpand_catalog_lock.out | 44 +- ...artition_truncate_deadlock_without_gdd.out | 8 +- .../expected/instr_in_shmem_terminate.out | 30 +- .../expected/invalidated_toast_index.out | 18 +- src/test/isolation2/expected/lockmodes.out | 304 +-- .../expected/lockmodes_optimizer.out | 307 +-- .../expected/mark_all_aoseg_await_drop.out | 12 +- src/test/isolation2/expected/misc.out | 16 +- .../expected/modify_table_data_corrupt.out | 30 +- .../modify_table_data_corrupt_optimizer.out | 34 +- .../isolation2/expected/orphan_temp_table.out | 2 +- .../expected/pg_rewind_fail_missing_xlog.out | 58 +- .../expected/pg_terminate_backend.out | 2 +- .../expected/pg_views_concurrent_drop.out | 6 +- .../isolation2/expected/prepare_limit.out | 24 +- .../prepared_xact_deadlock_pg_rewind.out | 8 +- .../isolation2/expected/prevent_ao_wal.out | 16 +- .../expected/reader_waits_for_lock.out | 8 +- src/test/isolation2/expected/reindex.out | 16 +- .../expected/reindex/abort_reindex.out | 12 +- .../createidx_while_reindex_idx_ao_bitmap.out | 12 +- .../createidx_while_reindex_idx_ao_btree.out | 12 +- ...reateidx_while_reindex_idx_aoco_bitmap.out | 12 +- ...createidx_while_reindex_idx_aoco_btree.out | 12 +- ...reateidx_while_reindex_idx_heap_bitmap.out | 12 +- ...createidx_while_reindex_idx_heap_btree.out | 12 +- ...indextable_while_addpart_ao_part_btree.out | 22 +- ...dextable_while_addpart_aoco_part_btree.out | 22 +- ...dextable_while_addpart_heap_part_btree.out | 22 +- ...extable_while_altertable_ao_part_btree.out | 20 +- ...table_while_altertable_aoco_part_btree.out | 20 +- ...table_while_altertable_heap_part_btree.out | 20 +- ...indextable_while_reindex_idx_ao_bitmap.out | 16 +- ...xtable_while_reindex_idx_ao_part_btree.out | 18 +- ...dextable_while_reindex_idx_aoco_bitmap.out | 16 +- ...able_while_reindex_idx_aoco_part_btree.out | 18 +- ...dextable_while_reindex_idx_heap_bitmap.out | 16 +- ...able_while_reindex_idx_heap_part_btree.out | 18 +- ...peatable_read_reindex_with_insert_heap.out | 22 +- ...alizable_reindex_with_drop_column_heap.out | 30 +- ...erializable_reindex_with_drop_index_ao.out | 30 +- ...ializable_reindex_with_drop_index_heap.out | 28 +- .../vacuum_analyze_while_reindex_ao_btree.out | 14 +- .../vacuum_while_reindex_ao_bitmap.out | 14 +- .../vacuum_while_reindex_heap_btree.out | 14 +- .../vacuum_while_reindex_heap_btree_toast.out | 14 +- .../expected/reindex_gpfastsequence.out | 10 +- .../reorganize_after_ao_vacuum_skip_drop.out | 10 +- .../resgroup/resgroup_alter_concurrency.out | 86 +- .../resgroup/resgroup_assign_slot_fail.out | 14 +- .../resgroup/resgroup_auxiliary_tools_v1.out | 10 +- .../resgroup/resgroup_auxiliary_tools_v2.out | 32 +- .../expected/resgroup/resgroup_bypass.out | 22 +- .../resgroup/resgroup_bypass_catalog.out | 6 +- .../resgroup_cancel_terminate_concurrency.out | 60 +- .../resgroup/resgroup_concurrency.out | 140 +- .../resgroup/resgroup_cpu_max_percent.out | 58 +- .../expected/resgroup/resgroup_cpuset.out | 66 +- .../resgroup_cpuset_empty_default.out | 4 +- .../resgroup/resgroup_disable_resgroup.out | 4 +- .../expected/resgroup/resgroup_dumpinfo.out | 28 +- .../expected/resgroup/resgroup_functions.out | 4 +- .../resgroup/resgroup_large_group_id.out | 4 +- .../resgroup/resgroup_memory_limit.out | 34 +- .../expected/resgroup/resgroup_move_query.out | 40 +- .../resgroup/resgroup_name_convention.out | 180 +- .../expected/resgroup/resgroup_recreate.out | 22 +- .../resgroup/resgroup_seg_down_2pc.out | 17 +- .../expected/resgroup/resgroup_syntax.out | 154 +- .../resgroup/resgroup_transaction.out | 50 +- .../resgroup/resgroup_unassign_entrydb.out | 10 +- .../isolation2/expected/resource_queue.out | 16 +- .../expected/resource_queue_cancel.out | 18 +- .../expected/resource_queue_deadlock.out | 16 +- .../expected/resource_queue_multi_portal.out | 32 +- .../isolation2/expected/runaway_query.out | 6 +- .../expected/runaway_query_optimizer.out | 6 +- .../cancel_commit_pending_replication.out | 8 +- .../expected/segwalrep/commit_blocking.out | 12 +- .../segwalrep/commit_blocking_on_standby.out | 14 +- .../die_commit_pending_replication.out | 16 +- .../segwalrep/dtm_recovery_on_standby.out | 6 +- .../segwalrep/dtx_recovery_wait_lsn.out | 34 +- .../segwalrep/failover_with_many_records.out | 6 +- .../segwalrep/fts_unblock_primary.out | 12 +- .../expected/segwalrep/master_wal_switch.out | 8 +- .../expected/segwalrep/mirror_promotion.out | 23 +- .../segwalrep/recoverseg_from_file.out | 2 +- .../segwalrep/replication_keeps_crash.out | 12 +- .../expected/segwalrep/select_throttle.out | 18 +- ...ophase_tolerance_with_mirror_promotion.out | 6 +- .../expected/select_dropped_table.out | 6 +- src/test/isolation2/expected/setup.out | 62 +- .../isolation2/expected/spilling_hashagg.out | 6 +- .../expected/spilling_hashagg_optimizer.out | 6 +- .../expected/standby_replay_dtx_info.out | 12 +- src/test/isolation2/expected/starve_case.out | 26 +- src/test/isolation2/expected/sync_guc.out | 26 +- .../isolation2/expected/tcp_ic_teardown.out | 4 +- .../expected/terminate_in_gang_creation.out | 16 +- .../truncate_after_ao_vacuum_skip_drop.out | 10 +- .../expected/uao_crash_compaction_column.out | 58 +- .../expected/uao_crash_compaction_row.out | 52 +- .../udf_exception_blocks_panic_scenarios.out | 38 +- .../expected/unlogged_appendonly_tables.out | 12 +- .../expected/unlogged_heap_tables.out | 12 +- .../expected/update_hash_col_utilitymode.out | 4 +- .../expected/upgrade_numsegments.out | 8 +- .../vacuum_after_vacuum_skip_drop_column.out | 8 +- .../expected/vacuum_full_interrupt.out | 8 +- .../expected/vacuum_progress_column.out | 18 +- .../expected/vacuum_progress_row.out | 24 +- ...dead_tuple_due_to_distributed_snapshot.out | 6 +- .../expected/vacuum_skip_locked_onseg.out | 8 +- src/test/isolation2/isolation2_main.c | 9 + .../output/autovacuum-analyze.source | 32 +- .../output/distributed_snapshot.source | 164 +- .../isolation2/output/external_table.source | 26 +- .../isolation2/output/fts_manual_probe.source | 34 +- .../isolation2/output/gp_collation.source | 24 +- .../output/idle_gang_cleaner.source | 51 +- .../parallel_retrieve_cursor/corner.source | 168 +- .../parallel_retrieve_cursor/explain.source | 16 +- .../fault_inject.source | 36 +- .../parallel_retrieve_cursor/privilege.source | 54 +- .../replicated_table.source | 44 +- .../retrieve_quit_check.source | 14 +- .../retrieve_quit_wait.source | 18 +- .../parallel_retrieve_cursor/security.source | 10 +- .../special_query.source | 34 +- .../status_check.source | 36 +- .../status_wait.source | 50 +- .../parallel_retrieve_cursor/syntax.source | 22 +- .../pg_basebackup_large_database_oid.source | 4 +- .../pg_basebackup_with_tablespaces.source | 40 +- .../output/uao/alter_while_vacuum.source | 6 +- .../output/uao/alter_while_vacuum2.source | 16 +- .../output/uao/ao_unique_index_vacuum.source | 18 +- .../output/uao/bitmapindex_rescan.source | 14 +- src/test/isolation2/output/uao/brin.source | 60 +- .../isolation2/output/uao/brin_chain.source | 24 +- .../output/uao/compaction_full_stats.source | 10 +- .../output/uao/compaction_utility.source | 8 +- .../output/uao/compaction_utility_2.source | 8 +- .../uao/compaction_utility_insert.source | 10 +- .../uao/compaction_utility_insert_2.source | 12 +- .../uao/create_index_allows_readonly.source | 20 +- .../output/uao/cursor_before_delete.source | 14 +- .../uao/cursor_before_deletevacuum.source | 14 +- .../output/uao/cursor_before_update.source | 14 +- .../output/uao/cursor_withhold.source | 14 +- .../output/uao/cursor_withhold2.source | 14 +- .../output/uao/delete_while_vacuum.source | 10 +- .../output/uao/index_build_reltuples.source | 36 +- .../output/uao/insert_policy.source | 20 +- .../output/uao/insert_policy_2.source | 268 +-- .../output/uao/insert_while_vacuum.source | 50 +- .../output/uao/limit_indexscan_inits.source | 24 +- .../output/uao/max_concurrency.source | 262 +-- .../output/uao/max_concurrency2.source | 262 +-- .../isolation2/output/uao/modcount.source | 8 +- .../output/uao/modcount_vacuum.source | 6 +- .../output/uao/parallel_delete.source | 6 +- .../output/uao/parallel_delete_2.source | 6 +- .../uao/parallel_delete_optimizer.source | 6 +- .../output/uao/parallel_update.source | 6 +- .../output/uao/parallel_update_2.source | 6 +- .../uao/parallel_update_optimizer.source | 6 +- .../uao/parallel_update_readcommitted.source | 6 +- .../output/uao/phantom_reads.source | 8 +- .../output/uao/phantom_reads_delete.source | 6 +- .../phantom_reads_delete_serializable.source | 6 +- .../uao/phantom_reads_serializable.source | 8 +- .../output/uao/phantom_reads_update.source | 6 +- .../phantom_reads_update_serializable.source | 6 +- .../output/uao/select_after_vacuum.source | 54 +- .../select_after_vacuum_serializable.source | 54 +- .../output/uao/select_before_vacuum.source | 48 +- .../output/uao/select_while_delete.source | 8 +- .../uao/select_while_full_vacuum.source | 50 +- .../output/uao/select_while_vacuum.source | 50 +- .../select_while_vacuum_serializable.source | 48 +- .../select_while_vacuum_serializable2.source | 48 +- .../uao/selectinsert_while_vacuum.source | 48 +- .../selectinsertupdate_while_vacuum.source | 12 +- .../uao/selectupdate_while_vacuum.source | 40 +- .../uao/snapshot_index_corruption.source | 14 +- .../uao/test_pg_appendonly_version.source | 14 +- .../output/uao/update_while_vacuum.source | 10 +- .../output/uao/vacuum_cleanup.source | 32 +- .../output/uao/vacuum_index_stats.source | 8 +- .../output/uao/vacuum_self_function.source | 8 +- .../uao/vacuum_self_serializable.source | 6 +- .../uao/vacuum_self_serializable2.source | 10 +- .../uao/vacuum_self_serializable3.source | 10 +- .../output/uao/vacuum_while_insert.source | 52 +- .../output/uao/vacuum_while_vacuum.source | 18 +- .../output/workfile_mgr_test.source | 24 +- src/test/isolation2/sql_isolation_testcase.py | 162 +- .../sql/prevent_ao_wal.sql | 10 +- 264 files changed, 6440 insertions(+), 4103 deletions(-) diff --git a/src/test/gpdb_pitr/expected/gpdb_pitr_setup.out b/src/test/gpdb_pitr/expected/gpdb_pitr_setup.out index 48df10e656d..52fb6f56c3f 100644 --- a/src/test/gpdb_pitr/expected/gpdb_pitr_setup.out +++ b/src/test/gpdb_pitr/expected/gpdb_pitr_setup.out @@ -1,26 +1,26 @@ -- Create some tables and load some data -- We do 1 row for gpdb_one_phase_commit to bypass autostats later CREATE TABLE gpdb_two_phase_commit_before_acquire_share_lock(num int); -CREATE +CREATE TABLE CREATE TABLE gpdb_two_phase_commit_after_acquire_share_lock(num int); -CREATE +CREATE TABLE CREATE TABLE gpdb_one_phase_commit(num int); -CREATE +CREATE TABLE CREATE TABLE gpdb_two_phase_commit_after_restore_point(num int); -CREATE +CREATE TABLE INSERT INTO gpdb_two_phase_commit_before_acquire_share_lock SELECT generate_series(1, 10); -INSERT 10 +INSERT 0 10 INSERT INTO gpdb_two_phase_commit_after_acquire_share_lock SELECT generate_series(1, 10); -INSERT 10 +INSERT 0 10 INSERT INTO gpdb_one_phase_commit VALUES (1); -INSERT 1 +INSERT 0 1 -- Inject suspend faults that will be used later to test different -- distributed commit scenarios, and to also test the commit blocking -- requirement which should only block twophase commits during -- distributed commit broadcast when a restore point is being created. 1: CREATE EXTENSION IF NOT EXISTS gp_inject_fault; -CREATE +CREATE EXTENSION 1: SELECT gp_inject_fault('dtm_broadcast_prepare', 'suspend', 1); gp_inject_fault ----------------- @@ -50,7 +50,7 @@ DELETE 10 4: BEGIN; BEGIN 4: INSERT INTO gpdb_two_phase_commit_after_restore_point SELECT generate_series(1, 10); -INSERT 10 +INSERT 0 10 4&: SELECT gp_segment_id, count(*) FROM gp_create_restore_point('test_restore_point') GROUP BY gp_segment_id ORDER BY gp_segment_id; 1: SELECT gp_wait_until_triggered_fault('gp_create_restore_point_acquired_lock', 1, 1); gp_wait_until_triggered_fault @@ -72,7 +72,7 @@ INSERT 10 3&: COMMIT; -- One-phase commit query should not block. 1: INSERT INTO gpdb_one_phase_commit VALUES (2); -INSERT 1 +INSERT 0 1 -- Read-only query should not block. 1: SELECT * FROM gpdb_two_phase_commit_before_acquire_share_lock; num @@ -154,7 +154,7 @@ SELECT * FROM gpdb_two_phase_commit_after_restore_point ORDER BY num; -- must do this in a plpgsql cursor because of a known limitation with -- CTAS on an EXECUTE ON COORDINATOR function. CREATE TEMP TABLE switch_walfile_names(content_id smallint, walfilename text); -CREATE +CREATE TABLE CREATE OR REPLACE FUNCTION populate_switch_walfile_names() RETURNS void AS $$ DECLARE curs CURSOR FOR SELECT * FROM gp_switch_wal(); /*in func*/ DECLARE rec record; /*in func*/ BEGIN /*in func*/ OPEN curs; /*in func*/ LOOP FETCH curs INTO rec; /*in func*/ EXIT WHEN NOT FOUND; /*in func*/ INSERT INTO switch_walfile_names VALUES (rec.gp_segment_id, rec.pg_walfile_name); /*in func*/ END LOOP; /*in func*/ END $$ LANGUAGE plpgsql; /*in func*/ SELECT populate_switch_walfile_names(); populate_switch_walfile_names @@ -166,7 +166,7 @@ INSERT INTO switch_walfile_names VALUES (rec.gp_segment_id, rec.pg_walfile_name) -- This function loops until the archival is complete. It times out after -- approximately 10mins. CREATE OR REPLACE FUNCTION check_archival() RETURNS BOOLEAN AS $$ DECLARE archived BOOLEAN; /*in func*/ DECLARE archived_count INTEGER; /*in func*/ BEGIN /*in func*/ FOR i in 1..3000 LOOP SELECT bool_and(seg_archived), count(*) FROM (SELECT last_archived_wal = l.walfilename AS seg_archived FROM switch_walfile_names l INNER JOIN gp_stat_archiver a ON l.content_id = a.gp_segment_id) s INTO archived, archived_count; /*in func*/ IF archived AND archived_count = 4 THEN RETURN archived; /*in func*/ END IF; /*in func*/ PERFORM pg_sleep(0.2); /*in func*/ END LOOP; /*in func*/ END $$ LANGUAGE plpgsql; -CREATE +CREATE FUNCTION SELECT check_archival(); check_archival diff --git a/src/test/gpdb_pitr/expected/test_gp_switch_wal.out b/src/test/gpdb_pitr/expected/test_gp_switch_wal.out index 6eb3a2d6a0a..8f81bcbf8e4 100644 --- a/src/test/gpdb_pitr/expected/test_gp_switch_wal.out +++ b/src/test/gpdb_pitr/expected/test_gp_switch_wal.out @@ -71,3 +71,14 @@ SELECT gp_switch_wal() FROM gp_dist_random('gp_id'); ERROR: function with EXECUTE ON restrictions cannot be used in the SELECT list of a query with FROM CREATE TABLE this_ctas_should_fail AS SELECT gp_segment_id AS contentid, pg_switch_wal, pg_walfile_name FROM gp_switch_wal(); ERROR: cannot use gp_switch_wal() when not in QD mode (xlogfuncs_gp.c:LINE_NUM) + +CREATE ROLE switch_wal_error_role; +CREATE ROLE +SET ROLE TO switch_wal_error_role; +SET +SELECT * FROM gp_switch_wal(); +ERROR: permission denied for function gp_switch_wal +RESET ROLE; +RESET +DROP ROLE switch_wal_error_role; +DROP ROLE diff --git a/src/test/isolation2/expected/add_column_after_vacuum_skip_drop_column.out b/src/test/isolation2/expected/add_column_after_vacuum_skip_drop_column.out index 62468f7904a..55cf5abd109 100644 --- a/src/test/isolation2/expected/add_column_after_vacuum_skip_drop_column.out +++ b/src/test/isolation2/expected/add_column_after_vacuum_skip_drop_column.out @@ -4,9 +4,9 @@ -- the test expected result were adjusted accordingly. -- CREATE TABLE aoco_add_column_after_vacuum_skip_drop (a INT, b INT) WITH (appendonly=true, orientation=column); -CREATE +CREATE TABLE INSERT INTO aoco_add_column_after_vacuum_skip_drop SELECT i as a, i as b FROM generate_series(1, 10) AS i; -INSERT 10 +INSERT 0 10 DELETE FROM aoco_add_column_after_vacuum_skip_drop; DELETE 10 @@ -30,7 +30,7 @@ BEGIN 2: VACUUM aoco_add_column_after_vacuum_skip_drop; VACUUM 1: END; -END +COMMIT -- We should see an aocsseg in state 2 (AOSEG_STATE_AWAITING_DROP) 0U: SELECT segno, column_num, state FROM gp_toolkit.__gp_aocsseg('aoco_add_column_after_vacuum_skip_drop'); @@ -44,7 +44,7 @@ END -- The ADD COLUMN should clean up aocssegs in state 2 (AOSEG_STATE_AWAITING_DROP) 1: ALTER TABLE aoco_add_column_after_vacuum_skip_drop ADD COLUMN c INT DEFAULT 0; -ALTER +ALTER TABLE 0U: SELECT segno, column_num, state FROM gp_toolkit.__gp_aocsseg('aoco_add_column_after_vacuum_skip_drop'); segno | column_num | state -------+------------+------- @@ -58,7 +58,7 @@ ALTER -- Check if insert goes into segno 1 instead of segno 2 1: INSERT INTO aoco_add_column_after_vacuum_skip_drop SELECT i as a, i as b, i as c FROM generate_series(1, 100) AS i; -INSERT 100 +INSERT 0 100 0U: SELECT segno, tupcount > 0, state FROM gp_toolkit.__gp_aocsseg('aoco_add_column_after_vacuum_skip_drop'); segno | ?column? | state -------+----------+------- diff --git a/src/test/isolation2/expected/alter_blocks_for_update_and_viceversa.out b/src/test/isolation2/expected/alter_blocks_for_update_and_viceversa.out index 18ef845b750..7f9e1a7004a 100644 --- a/src/test/isolation2/expected/alter_blocks_for_update_and_viceversa.out +++ b/src/test/isolation2/expected/alter_blocks_for_update_and_viceversa.out @@ -1,10 +1,10 @@ -- setup 1: drop table if exists alter_block; -DROP +DROP TABLE 1: create table alter_block(a int, b int) distributed by (a); -CREATE +CREATE TABLE 1: insert into alter_block select 1, 1; -INSERT 1 +INSERT 0 1 -- Validate UPDATE blocks the Alter 2: BEGIN; BEGIN @@ -20,12 +20,12 @@ UPDATE 1 2: COMMIT; COMMIT 1<: <... completed> -ALTER +ALTER TABLE -- Now validate ALTER blocks the UPDATE 2: BEGIN; BEGIN 2: ALTER TABLE alter_block SET DISTRIBUTED BY (a); -ALTER +ALTER TABLE 1&: UPDATE alter_block SET b = b + 1; 2: SELECT wait_event_type FROM pg_stat_activity where query like 'UPDATE alter_block SET %'; wait_event_type diff --git a/src/test/isolation2/expected/ao_blkdir.out b/src/test/isolation2/expected/ao_blkdir.out index f202d8ec4da..e626105b911 100644 --- a/src/test/isolation2/expected/ao_blkdir.out +++ b/src/test/isolation2/expected/ao_blkdir.out @@ -7,12 +7,12 @@ -------------------------------------------------------------------------------- CREATE TABLE ao_blkdir_test(i int, j int) USING ao_row DISTRIBUTED BY (j); -CREATE +CREATE TABLE CREATE INDEX ao_blkdir_test_idx ON ao_blkdir_test(i); -CREATE +CREATE INDEX 1: INSERT INTO ao_blkdir_test SELECT i, 2 FROM generate_series(1, 10) i; -INSERT 10 +INSERT 0 10 -- There should be 1 block directory row with a single entry covering 10 rows SELECT (gp_toolkit.__gp_aoblkdir('ao_blkdir_test')).* FROM gp_dist_random('gp_id') WHERE gp_segment_id = 0 ORDER BY 1,2,3,4,5; tupleid | segno | columngroup_no | entry_no | first_row_no | file_offset | row_count @@ -21,7 +21,7 @@ SELECT (gp_toolkit.__gp_aoblkdir('ao_blkdir_test')).* FROM gp_dist_random('gp_id (1 row) 1: INSERT INTO ao_blkdir_test SELECT i, 2 FROM generate_series(11, 30) i; -INSERT 20 +INSERT 0 20 -- There should be 2 block directory entries in a new block directory row, and -- the row from the previous INSERT should not be visible. The entry from the -- first INSERT should remain unchanged. @@ -35,11 +35,11 @@ SELECT (gp_toolkit.__gp_aoblkdir('ao_blkdir_test')).* FROM gp_dist_random('gp_id 1: BEGIN; BEGIN 1: INSERT INTO ao_blkdir_test SELECT i, 2 FROM generate_series(31, 60) i; -INSERT 30 +INSERT 0 30 2: BEGIN; BEGIN 2: INSERT INTO ao_blkdir_test SELECT i, 2 FROM generate_series(71, 110) i; -INSERT 40 +INSERT 0 40 1: COMMIT; COMMIT 2: COMMIT; @@ -57,14 +57,10 @@ SELECT (gp_toolkit.__gp_aoblkdir('ao_blkdir_test')).* FROM gp_dist_random('gp_id (4 rows) TRUNCATE ao_blkdir_test; -TRUNCATE -set gp_appendonly_insert_files = 0; -SET +TRUNCATE TABLE -- Insert enough rows to overflow the first block directory minipage by 2. INSERT INTO ao_blkdir_test SELECT i, 2 FROM generate_series(1, 292700) i; -INSERT 292700 -reset gp_appendonly_insert_files; -RESET +INSERT 0 292700 -- There should be 2 block directory rows, one with 161 entries covering 292698 -- rows and the other with 1 entry covering the 2 overflow rows. SELECT (gp_toolkit.__gp_aoblkdir('ao_blkdir_test')).* FROM gp_dist_random('gp_id') WHERE gp_segment_id = 0 ORDER BY 1,2,3,4,5; @@ -236,9 +232,9 @@ SELECT (gp_toolkit.__gp_aoblkdir('ao_blkdir_test')).* FROM gp_dist_random('gp_id -- Unique index white box tests DROP TABLE ao_blkdir_test; -DROP +DROP TABLE CREATE TABLE ao_blkdir_test(i int UNIQUE, j int) USING ao_row DISTRIBUTED BY (i); -CREATE +CREATE TABLE SELECT gp_inject_fault('appendonly_insert', 'suspend', '', '', 'ao_blkdir_test', 1, 1, 0, dbid) FROM gp_segment_configuration WHERE role = 'p' AND content = 0; gp_inject_fault @@ -284,7 +280,7 @@ SELECT gp_inject_fault('appendonly_insert', 'reset', dbid) FROM gp_segment_confi Success: (1 row) 1<: <... completed> -INSERT 1 +INSERT 0 1 -- The placeholder row is invisible to the INSERTing transaction. Since the -- INSERT finished, there should be 1 visible blkdir row representing the INSERT. @@ -317,19 +313,297 @@ COMMIT (1 row) DROP TABLE ao_blkdir_test; -DROP +DROP TABLE + +-- Test `tupcount` in pg_aoseg == sum of number of `row_count` across all +-- aoblkdir entries for each segno. Test with commits, aborts and deletes. + +-- Case1: without VACUUM ANALYZE +CREATE TABLE ao_blkdir_test_rowcount(i int, j int) USING ao_row DISTRIBUTED BY (j); +CREATE TABLE +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +3: BEGIN; +BEGIN +4: BEGIN; +BEGIN +1: INSERT INTO ao_blkdir_test_rowcount SELECT i, 2 FROM generate_series(1, 10) i; +INSERT 0 10 +2: INSERT INTO ao_blkdir_test_rowcount SELECT i, 3 FROM generate_series(1, 20) i; +INSERT 0 20 +3: INSERT INTO ao_blkdir_test_rowcount SELECT i, 4 FROM generate_series(1, 30) i; +INSERT 0 30 +3: ABORT; +ROLLBACK +3: BEGIN; +BEGIN +3: INSERT INTO ao_blkdir_test_rowcount SELECT i, 4 FROM generate_series(1, 40) i; +INSERT 0 40 +4: INSERT INTO ao_blkdir_test_rowcount SELECT i, 7 FROM generate_series(1, 50) i; +INSERT 0 50 +1: COMMIT; +COMMIT +2: COMMIT; +COMMIT +3: COMMIT; +COMMIT +4: COMMIT; +COMMIT +DELETE FROM ao_blkdir_test_rowcount WHERE j = 7; +DELETE 50 + +CREATE INDEX ao_blkdir_test_rowcount_idx ON ao_blkdir_test_rowcount(i); +CREATE INDEX + +SELECT segno, sum(row_count) AS totalrows FROM (SELECT (gp_toolkit.__gp_aoblkdir('ao_blkdir_test_rowcount')).* FROM gp_dist_random('gp_id') WHERE gp_segment_id = 0)s GROUP BY segno, columngroup_no ORDER BY segno; + segno | totalrows +-------+----------- + 1 | 10 + 2 | 20 + 3 | 40 + 4 | 50 +(4 rows) +SELECT segno, sum(tupcount) AS totalrows FROM gp_toolkit.__gp_aoseg('ao_blkdir_test_rowcount') WHERE segment_id = 0 GROUP BY segno; + segno | totalrows +-------+----------- + 1 | 10 + 2 | 20 + 3 | 40 + 4 | 50 +(4 rows) + +-- Case2: with VACUUM ANALYZE +DROP TABLE ao_blkdir_test_rowcount; +DROP TABLE +CREATE TABLE ao_blkdir_test_rowcount(i int, j int) USING ao_row DISTRIBUTED BY (j); +CREATE TABLE +CREATE INDEX ao_blkdir_test_rowcount_idx ON ao_blkdir_test_rowcount(i); +CREATE INDEX +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +3: BEGIN; +BEGIN +4: BEGIN; +BEGIN +1: INSERT INTO ao_blkdir_test_rowcount SELECT i, 2 FROM generate_series(1, 10) i; +INSERT 0 10 +1: INSERT INTO ao_blkdir_test_rowcount SELECT i, 2 FROM ao_blkdir_test_rowcount; +INSERT 0 10 +1: INSERT INTO ao_blkdir_test_rowcount SELECT i, 2 FROM ao_blkdir_test_rowcount; +INSERT 0 20 +2: INSERT INTO ao_blkdir_test_rowcount SELECT i, 3 FROM generate_series(1, 20) i; +INSERT 0 20 +2: INSERT INTO ao_blkdir_test_rowcount SELECT i, 3 FROM ao_blkdir_test_rowcount; +INSERT 0 20 +2: INSERT INTO ao_blkdir_test_rowcount SELECT i, 3 FROM ao_blkdir_test_rowcount; +INSERT 0 40 +3: INSERT INTO ao_blkdir_test_rowcount SELECT i, 4 FROM generate_series(1, 30) i; +INSERT 0 30 +3: INSERT INTO ao_blkdir_test_rowcount SELECT i, 4 FROM ao_blkdir_test_rowcount; +INSERT 0 30 +3: INSERT INTO ao_blkdir_test_rowcount SELECT i, 4 FROM ao_blkdir_test_rowcount; +INSERT 0 60 +4: INSERT INTO ao_blkdir_test_rowcount SELECT i, 7 FROM generate_series(1, 50) i; +INSERT 0 50 +4: INSERT INTO ao_blkdir_test_rowcount SELECT i, 7 FROM ao_blkdir_test_rowcount; +INSERT 0 50 +4: INSERT INTO ao_blkdir_test_rowcount SELECT i, 7 FROM ao_blkdir_test_rowcount; +INSERT 0 100 +1: COMMIT; +COMMIT +2: COMMIT; +COMMIT +3: ABORT; +ROLLBACK +4: COMMIT; +COMMIT + +DELETE FROM ao_blkdir_test_rowcount WHERE j = 7; +DELETE 200 +VACUUM ANALYZE ao_blkdir_test_rowcount; +VACUUM + +SELECT segno, sum(row_count) AS totalrows FROM (SELECT (gp_toolkit.__gp_aoblkdir('ao_blkdir_test_rowcount')).* FROM gp_dist_random('gp_id') WHERE gp_segment_id = 0)s GROUP BY segno, columngroup_no ORDER BY segno; + segno | totalrows +-------+----------- + 1 | 40 + 2 | 80 +(2 rows) +SELECT segno, sum(tupcount) AS totalrows FROM gp_toolkit.__gp_aoseg('ao_blkdir_test_rowcount') WHERE segment_id = 0 GROUP BY segno; + segno | totalrows +-------+----------- + 1 | 40 + 2 | 80 + 3 | 0 + 4 | 0 +(4 rows) + +UPDATE ao_blkdir_test_rowcount SET i = i + 1; +UPDATE 120 +VACUUM ANALYZE ao_blkdir_test_rowcount; +VACUUM + +SELECT segno, sum(row_count) AS totalrows FROM (SELECT (gp_toolkit.__gp_aoblkdir('ao_blkdir_test_rowcount')).* FROM gp_dist_random('gp_id') WHERE gp_segment_id = 0)s GROUP BY segno, columngroup_no ORDER BY segno; + segno | totalrows +-------+----------- + 3 | 120 +(1 row) +SELECT segno, sum(tupcount) AS totalrows FROM gp_toolkit.__gp_aoseg('ao_blkdir_test_rowcount') WHERE segment_id = 0 GROUP BY segno; + segno | totalrows +-------+----------- + 1 | 0 + 2 | 0 + 3 | 120 + 4 | 0 +(4 rows) + +DROP TABLE ao_blkdir_test_rowcount; +DROP TABLE + +-- +-- Test tuple fetch with holes from ABORTs +-- +CREATE TABLE ao_fetch_hole(i int, j int) USING ao_row; +CREATE TABLE +CREATE INDEX ON ao_fetch_hole(i); +CREATE INDEX +INSERT INTO ao_fetch_hole VALUES (2, 0); +INSERT 0 1 +-- Create a hole after the last entry (of the last minipage) in the blkdir. +BEGIN; +BEGIN +INSERT INTO ao_fetch_hole SELECT 3, j FROM generate_series(1, 20) j; +INSERT 0 20 +ABORT; +ROLLBACK +SELECT (gp_toolkit.__gp_aoblkdir('ao_fetch_hole')).* FROM gp_dist_random('gp_id') WHERE gp_segment_id = 0 ORDER BY 1,2,3,4,5; + tupleid | segno | columngroup_no | entry_no | first_row_no | file_offset | row_count +---------+-------+----------------+----------+--------------+-------------+----------- + (0,1) | 1 | 0 | 0 | 1 | 0 | 1 +(1 row) + +-- Ensure we will do an index scan. +SET enable_seqscan TO off; +SET +SET enable_indexonlyscan TO off; +SET +SET optimizer TO off; +SET +EXPLAIN SELECT count(*) FROM ao_fetch_hole WHERE i = 3; + QUERY PLAN +----------------------------------------------------------------------------------------------------- + Finalize Aggregate (cost=39.80..39.81 rows=1 width=8) + -> Gather Motion 1:1 (slice1; segments: 1) (cost=39.74..39.79 rows=3 width=8) + -> Partial Aggregate (cost=39.74..39.75 rows=1 width=8) + -> Bitmap Heap Scan on ao_fetch_hole (cost=4.82..39.67 rows=29 width=0) + Recheck Cond: (i = 3) + -> Bitmap Index Scan on ao_fetch_hole_i_idx (cost=0.00..4.81 rows=29 width=0) + Index Cond: (i = 3) + Optimizer: Postgres query optimizer +(8 rows) + +SELECT gp_inject_fault_infinite('AppendOnlyBlockDirectory_GetEntry_sysscan', 'skip', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +SELECT count(*) FROM ao_fetch_hole WHERE i = 3; + count +------- + 0 +(1 row) +-- Since the hole is at the end of the minipage, we can't avoid a sysscan for +-- each tuple. +SELECT gp_inject_fault('AppendOnlyBlockDirectory_GetEntry_sysscan', 'status', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Success: fault name:'AppendOnlyBlockDirectory_GetEntry_sysscan' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'20' + +(1 row) + +SELECT gp_inject_fault('AppendOnlyBlockDirectory_GetEntry_sysscan', 'reset', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) + +-- Now do 1 more insert, so that the hole is sandwiched between two successive +-- minipage entries. +INSERT INTO ao_fetch_hole VALUES (4, 21); +INSERT 0 1 +SELECT (gp_toolkit.__gp_aoblkdir('ao_fetch_hole')).* FROM gp_dist_random('gp_id') WHERE gp_segment_id = 0 ORDER BY 1,2,3,4,5; + tupleid | segno | columngroup_no | entry_no | first_row_no | file_offset | row_count +---------+-------+----------------+----------+--------------+-------------+----------- + (0,3) | 1 | 0 | 0 | 1 | 0 | 1 + (0,3) | 1 | 0 | 1 | 201 | 40 | 1 +(2 rows) + +SELECT gp_inject_fault_infinite('AppendOnlyBlockDirectory_GetEntry_sysscan', 'skip', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +SELECT gp_inject_fault_infinite('AppendOnlyBlockDirectory_GetEntry_inter_entry_hole', 'skip', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +SELECT count(*) FROM ao_fetch_hole WHERE i = 3; + count +------- + 0 +(1 row) +-- Since the hole is between two entries, we are always able to find the last +-- entry in the minipage, determine that the target row doesn't lie within it +-- and early return, thereby avoiding an expensive per-tuple sysscan. We only +-- do 1 sysscan - for the first tuple fetch in the hole and avoid it for all +-- subsequent fetches in the hole. +SELECT gp_inject_fault('AppendOnlyBlockDirectory_GetEntry_sysscan', 'status', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Success: fault name:'AppendOnlyBlockDirectory_GetEntry_sysscan' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'1' + +(1 row) +SELECT gp_inject_fault('AppendOnlyBlockDirectory_GetEntry_inter_entry_hole', 'status', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Success: fault name:'AppendOnlyBlockDirectory_GetEntry_inter_entry_hole' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'19' + +(1 row) + +SELECT gp_inject_fault('AppendOnlyBlockDirectory_GetEntry_sysscan', 'reset', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) +SELECT gp_inject_fault('AppendOnlyBlockDirectory_GetEntry_inter_entry_hole', 'reset', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) + +RESET enable_seqscan; +RESET +RESET enable_indexonlyscan; +RESET +RESET optimizer; +RESET -------------------------------------------------------------------------------- -- AOCO tables -------------------------------------------------------------------------------- CREATE TABLE aoco_blkdir_test(i int, j int) USING ao_column DISTRIBUTED BY (j); -CREATE +CREATE TABLE CREATE INDEX aoco_blkdir_test_idx ON aoco_blkdir_test(i); -CREATE +CREATE INDEX 1: INSERT INTO aoco_blkdir_test SELECT i, 2 FROM generate_series(1, 10) i; -INSERT 10 +INSERT 0 10 -- There should be 2 block directory rows with a single entry covering 10 rows, -- (1 for each column). SELECT (gp_toolkit.__gp_aoblkdir('aoco_blkdir_test')).* FROM gp_dist_random('gp_id') WHERE gp_segment_id = 0 ORDER BY 1,2,3,4,5; @@ -340,7 +614,7 @@ SELECT (gp_toolkit.__gp_aoblkdir('aoco_blkdir_test')).* FROM gp_dist_random('gp_ (2 rows) 1: INSERT INTO aoco_blkdir_test SELECT i, 2 FROM generate_series(11, 30) i; -INSERT 20 +INSERT 0 20 -- There should be 2 block directory rows, carrying 2 entries each. The rows -- from the previous INSERT should not be visible. The entries from the first -- INSERT should remain unchanged. @@ -356,11 +630,11 @@ SELECT (gp_toolkit.__gp_aoblkdir('aoco_blkdir_test')).* FROM gp_dist_random('gp_ 1: BEGIN; BEGIN 1: INSERT INTO aoco_blkdir_test SELECT i, 2 FROM generate_series(31, 60) i; -INSERT 30 +INSERT 0 30 2: BEGIN; BEGIN 2: INSERT INTO aoco_blkdir_test SELECT i, 2 FROM generate_series(71, 110) i; -INSERT 40 +INSERT 0 40 1: COMMIT; COMMIT 2: COMMIT; @@ -382,14 +656,12 @@ SELECT (gp_toolkit.__gp_aoblkdir('aoco_blkdir_test')).* FROM gp_dist_random('gp_ (8 rows) TRUNCATE aoco_blkdir_test; -TRUNCATE +TRUNCATE TABLE -- Insert enough rows to overflow the first block directory minipage by 2. set gp_appendonly_insert_files = 0; SET INSERT INTO aoco_blkdir_test SELECT i, 2 FROM generate_series(1, 1317143) i; -INSERT 1317143 -reset gp_appendonly_insert_files; -RESET +INSERT 0 1317143 -- There should be 2 block directory rows, 2 for each column, one with 161 -- entries covering 1317141 rows and the other with 1 entry covering the 2 -- overflow rows. @@ -724,9 +996,9 @@ SELECT (gp_toolkit.__gp_aoblkdir('aoco_blkdir_test')).* FROM gp_dist_random('gp_ -- Unique index white box tests DROP TABLE aoco_blkdir_test; -DROP +DROP TABLE CREATE TABLE aoco_blkdir_test(h int, i int UNIQUE, j int) USING ao_column DISTRIBUTED BY (i); -CREATE +CREATE TABLE SELECT gp_inject_fault('appendonly_insert', 'suspend', '', '', 'aoco_blkdir_test', 1, 1, 0, dbid) FROM gp_segment_configuration WHERE role = 'p' AND content = 0; gp_inject_fault @@ -777,7 +1049,7 @@ SELECT gp_inject_fault('appendonly_insert', 'reset', dbid) FROM gp_segment_confi Success: (1 row) 1<: <... completed> -INSERT 1 +INSERT 0 1 -- The placeholder row is invisible to the INSERTing transaction. Since the -- INSERT finished, there should be 3 visible blkdir rows representing the @@ -818,10 +1090,308 @@ COMMIT -- properly resolve uniqueness checks (by consulting the first non-dropped -- column's block directory row). 3<: <... completed> -ALTER +ALTER TABLE 4: INSERT INTO aoco_blkdir_test VALUES (2, 2); ERROR: duplicate key value violates unique constraint "aoco_blkdir_test_i_key" (seg0 192.168.0.148:7002 pid=176693) DETAIL: Key (i)=(2) already exists. DROP TABLE aoco_blkdir_test; -DROP +DROP TABLE + +-- Test `tupcount` in pg_ao(cs)seg == sum of number of `row_count` across all +-- aoblkdir entries for each . Test with commits, aborts +-- and deletes. + +-- Case1: without VACUUM ANALYZE +CREATE TABLE aoco_blkdir_test_rowcount(i int, j int) USING ao_column DISTRIBUTED BY (j); +CREATE TABLE +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +3: BEGIN; +BEGIN +4: BEGIN; +BEGIN +1: INSERT INTO aoco_blkdir_test_rowcount SELECT i, 2 FROM generate_series(1, 10) i; +INSERT 0 10 +2: INSERT INTO aoco_blkdir_test_rowcount SELECT i, 3 FROM generate_series(1, 20) i; +INSERT 0 20 +3: INSERT INTO aoco_blkdir_test_rowcount SELECT i, 4 FROM generate_series(1, 30) i; +INSERT 0 30 +3: ABORT; +ROLLBACK +3: BEGIN; +BEGIN +3: INSERT INTO aoco_blkdir_test_rowcount SELECT i, 4 FROM generate_series(1, 40) i; +INSERT 0 40 +4: INSERT INTO aoco_blkdir_test_rowcount SELECT i, 7 FROM generate_series(1, 50) i; +INSERT 0 50 +1: COMMIT; +COMMIT +2: COMMIT; +COMMIT +3: COMMIT; +COMMIT +4: COMMIT; +COMMIT +DELETE FROM aoco_blkdir_test_rowcount WHERE j = 7; +DELETE 50 + +CREATE INDEX aoco_blkdir_test_rowcount_idx ON aoco_blkdir_test_rowcount(i); +CREATE INDEX + +SELECT segno, columngroup_no, sum(row_count) AS totalrows FROM (SELECT (gp_toolkit.__gp_aoblkdir('aoco_blkdir_test_rowcount')).* FROM gp_dist_random('gp_id') WHERE gp_segment_id = 0)s GROUP BY segno, columngroup_no ORDER BY segno, columngroup_no; + segno | columngroup_no | totalrows +-------+----------------+----------- + 1 | 0 | 10 + 1 | 1 | 10 + 2 | 0 | 20 + 2 | 1 | 20 + 3 | 0 | 40 + 3 | 1 | 40 + 4 | 0 | 50 + 4 | 1 | 50 +(8 rows) +SELECT segno, column_num, sum(tupcount) AS totalrows FROM gp_toolkit.__gp_aocsseg('aoco_blkdir_test_rowcount') WHERE segment_id = 0 GROUP BY segno, column_num; + segno | column_num | totalrows +-------+------------+----------- + 1 | 0 | 10 + 1 | 1 | 10 + 2 | 0 | 20 + 2 | 1 | 20 + 3 | 0 | 40 + 3 | 1 | 40 + 4 | 0 | 50 + 4 | 1 | 50 +(8 rows) + +-- Case2: with VACUUM ANALYZE +DROP TABLE aoco_blkdir_test_rowcount; +DROP TABLE +CREATE TABLE aoco_blkdir_test_rowcount(i int, j int) USING ao_column DISTRIBUTED BY (j); +CREATE TABLE +CREATE INDEX aoco_blkdir_test_rowcount_idx ON aoco_blkdir_test_rowcount(i); +CREATE INDEX +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +3: BEGIN; +BEGIN +4: BEGIN; +BEGIN +1: INSERT INTO aoco_blkdir_test_rowcount SELECT i, 2 FROM generate_series(1, 10) i; +INSERT 0 10 +1: INSERT INTO aoco_blkdir_test_rowcount SELECT i, 2 FROM aoco_blkdir_test_rowcount; +INSERT 0 10 +1: INSERT INTO aoco_blkdir_test_rowcount SELECT i, 2 FROM aoco_blkdir_test_rowcount; +INSERT 0 20 +2: INSERT INTO aoco_blkdir_test_rowcount SELECT i, 3 FROM generate_series(1, 20) i; +INSERT 0 20 +2: INSERT INTO aoco_blkdir_test_rowcount SELECT i, 3 FROM aoco_blkdir_test_rowcount; +INSERT 0 20 +2: INSERT INTO aoco_blkdir_test_rowcount SELECT i, 3 FROM aoco_blkdir_test_rowcount; +INSERT 0 40 +3: INSERT INTO aoco_blkdir_test_rowcount SELECT i, 4 FROM generate_series(1, 30) i; +INSERT 0 30 +3: INSERT INTO aoco_blkdir_test_rowcount SELECT i, 4 FROM aoco_blkdir_test_rowcount; +INSERT 0 30 +3: INSERT INTO aoco_blkdir_test_rowcount SELECT i, 4 FROM aoco_blkdir_test_rowcount; +INSERT 0 60 +4: INSERT INTO aoco_blkdir_test_rowcount SELECT i, 7 FROM generate_series(1, 50) i; +INSERT 0 50 +4: INSERT INTO aoco_blkdir_test_rowcount SELECT i, 7 FROM aoco_blkdir_test_rowcount; +INSERT 0 50 +4: INSERT INTO aoco_blkdir_test_rowcount SELECT i, 7 FROM aoco_blkdir_test_rowcount; +INSERT 0 100 +1: COMMIT; +COMMIT +2: COMMIT; +COMMIT +3: ABORT; +ROLLBACK +4: COMMIT; +COMMIT + +DELETE FROM aoco_blkdir_test_rowcount WHERE j = 7; +DELETE 200 +VACUUM ANALYZE aoco_blkdir_test_rowcount; +VACUUM + +SELECT segno, columngroup_no, sum(row_count) AS totalrows FROM (SELECT (gp_toolkit.__gp_aoblkdir('aoco_blkdir_test_rowcount')).* FROM gp_dist_random('gp_id') WHERE gp_segment_id = 0)s GROUP BY segno, columngroup_no ORDER BY segno, columngroup_no; + segno | columngroup_no | totalrows +-------+----------------+----------- + 1 | 0 | 40 + 1 | 1 | 40 + 2 | 0 | 80 + 2 | 1 | 80 +(4 rows) +SELECT segno, column_num, sum(tupcount) AS totalrows FROM gp_toolkit.__gp_aocsseg('aoco_blkdir_test_rowcount') WHERE segment_id = 0 GROUP BY segno, column_num; + segno | column_num | totalrows +-------+------------+----------- + 1 | 0 | 40 + 1 | 1 | 40 + 2 | 0 | 80 + 2 | 1 | 80 + 3 | 0 | 0 + 3 | 1 | 0 + 4 | 0 | 0 + 4 | 1 | 0 +(8 rows) + +UPDATE aoco_blkdir_test_rowcount SET i = i + 1; +UPDATE 120 +VACUUM ANALYZE aoco_blkdir_test_rowcount; +VACUUM + +SELECT segno, columngroup_no, sum(row_count) AS totalrows FROM (SELECT (gp_toolkit.__gp_aoblkdir('aoco_blkdir_test_rowcount')).* FROM gp_dist_random('gp_id') WHERE gp_segment_id = 0)s GROUP BY segno, columngroup_no ORDER BY segno, columngroup_no; + segno | columngroup_no | totalrows +-------+----------------+----------- + 3 | 0 | 120 + 3 | 1 | 120 +(2 rows) +SELECT segno, column_num, sum(tupcount) AS totalrows FROM gp_toolkit.__gp_aocsseg('aoco_blkdir_test_rowcount') WHERE segment_id = 0 GROUP BY segno, column_num; + segno | column_num | totalrows +-------+------------+----------- + 1 | 0 | 0 + 1 | 1 | 0 + 2 | 0 | 0 + 2 | 1 | 0 + 3 | 0 | 120 + 3 | 1 | 120 + 4 | 0 | 0 + 4 | 1 | 0 +(8 rows) + +DROP TABLE aoco_blkdir_test_rowcount; +DROP TABLE + +-- +-- Test tuple fetch with holes from ABORTs +-- +CREATE TABLE aoco_fetch_hole(i int, j int) USING ao_row; +CREATE TABLE +CREATE INDEX ON aoco_fetch_hole(i); +CREATE INDEX +INSERT INTO aoco_fetch_hole VALUES (2, 0); +INSERT 0 1 +-- Create a hole after the last entry (of the last minipage) in the blkdir. +BEGIN; +BEGIN +INSERT INTO aoco_fetch_hole SELECT 3, j FROM generate_series(1, 20) j; +INSERT 0 20 +ABORT; +ROLLBACK +SELECT (gp_toolkit.__gp_aoblkdir('aoco_fetch_hole')).* FROM gp_dist_random('gp_id') WHERE gp_segment_id = 0 ORDER BY 1,2,3,4,5; + tupleid | segno | columngroup_no | entry_no | first_row_no | file_offset | row_count +---------+-------+----------------+----------+--------------+-------------+----------- + (0,1) | 1 | 0 | 0 | 1 | 0 | 1 +(1 row) + +-- Ensure we will do an index scan. +SET enable_seqscan TO off; +SET +SET enable_indexonlyscan TO off; +SET +SET optimizer TO off; +SET +EXPLAIN SELECT count(*) FROM aoco_fetch_hole WHERE i = 3; + QUERY PLAN +------------------------------------------------------------------------------------------------------- + Finalize Aggregate (cost=39.80..39.81 rows=1 width=8) + -> Gather Motion 1:1 (slice1; segments: 1) (cost=39.74..39.79 rows=3 width=8) + -> Partial Aggregate (cost=39.74..39.75 rows=1 width=8) + -> Bitmap Heap Scan on aoco_fetch_hole (cost=4.82..39.67 rows=29 width=0) + Recheck Cond: (i = 3) + -> Bitmap Index Scan on aoco_fetch_hole_i_idx (cost=0.00..4.81 rows=29 width=0) + Index Cond: (i = 3) + Optimizer: Postgres query optimizer +(8 rows) + +SELECT gp_inject_fault_infinite('AppendOnlyBlockDirectory_GetEntry_sysscan', 'skip', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +SELECT count(*) FROM aoco_fetch_hole WHERE i = 3; + count +------- + 0 +(1 row) +-- Since the hole is at the end of the minipage, we can't avoid a sysscan for +-- each tuple. +SELECT gp_inject_fault('AppendOnlyBlockDirectory_GetEntry_sysscan', 'status', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Success: fault name:'AppendOnlyBlockDirectory_GetEntry_sysscan' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'20' + +(1 row) + +SELECT gp_inject_fault('AppendOnlyBlockDirectory_GetEntry_sysscan', 'reset', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) + +-- Now do 1 more insert, so that the hole is sandwiched between two successive +-- minipage entries. +INSERT INTO aoco_fetch_hole VALUES (4, 21); +INSERT 0 1 +SELECT (gp_toolkit.__gp_aoblkdir('aoco_fetch_hole')).* FROM gp_dist_random('gp_id') WHERE gp_segment_id = 0 ORDER BY 1,2,3,4,5; + tupleid | segno | columngroup_no | entry_no | first_row_no | file_offset | row_count +---------+-------+----------------+----------+--------------+-------------+----------- + (0,3) | 1 | 0 | 0 | 1 | 0 | 1 + (0,3) | 1 | 0 | 1 | 201 | 40 | 1 +(2 rows) + +SELECT gp_inject_fault_infinite('AppendOnlyBlockDirectory_GetEntry_sysscan', 'skip', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +SELECT gp_inject_fault_infinite('AppendOnlyBlockDirectory_GetEntry_inter_entry_hole', 'skip', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault_infinite +-------------------------- + Success: +(1 row) +SELECT count(*) FROM aoco_fetch_hole WHERE i = 3; + count +------- + 0 +(1 row) +-- Since the hole is between two entries, we are always able to find the last +-- entry in the minipage, determine that the target row doesn't lie within it +-- and early return, thereby avoiding an expensive per-tuple sysscan. We only +-- do 1 sysscan - for the first tuple fetch in the hole and avoid it for all +-- subsequent fetches in the hole. +SELECT gp_inject_fault('AppendOnlyBlockDirectory_GetEntry_sysscan', 'status', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Success: fault name:'AppendOnlyBlockDirectory_GetEntry_sysscan' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'1' + +(1 row) +SELECT gp_inject_fault('AppendOnlyBlockDirectory_GetEntry_inter_entry_hole', 'status', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Success: fault name:'AppendOnlyBlockDirectory_GetEntry_inter_entry_hole' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'19' + +(1 row) + +SELECT gp_inject_fault('AppendOnlyBlockDirectory_GetEntry_sysscan', 'reset', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) +SELECT gp_inject_fault('AppendOnlyBlockDirectory_GetEntry_inter_entry_hole', 'reset', dbid) FROM gp_segment_configuration WHERE content = 0 AND role = 'p'; + gp_inject_fault +----------------- + Success: +(1 row) + +RESET enable_seqscan; +RESET +RESET enable_indexonlyscan; +RESET +RESET optimizer; +RESET diff --git a/src/test/isolation2/expected/ao_index_build_progress.out b/src/test/isolation2/expected/ao_index_build_progress.out index 1048076ce9f..f98be86ea65 100644 --- a/src/test/isolation2/expected/ao_index_build_progress.out +++ b/src/test/isolation2/expected/ao_index_build_progress.out @@ -3,11 +3,15 @@ -- AO table CREATE TABLE ao_index_build_progress(i int, j bigint) USING ao_row WITH (compresstype=zstd, compresslevel=2); -CREATE +CREATE TABLE -- Insert all tuples to seg1. INSERT INTO ao_index_build_progress SELECT 0, i FROM generate_series(1, 100000) i; -INSERT 100000 +INSERT 0 100000 +INSERT INTO ao_index_build_progress SELECT 2, i FROM generate_series(1, 100000) i; +INSERT 0 100000 +INSERT INTO ao_index_build_progress SELECT 5, i FROM generate_series(1, 100000) i; +INSERT 0 100000 -- Suspend execution when some blocks have been read. SELECT gp_inject_fault('AppendOnlyStorageRead_ReadNextBlock_success', 'suspend', '', '', '', 10, 10, 0, dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p'; @@ -40,15 +44,19 @@ SELECT gp_inject_fault('AppendOnlyStorageRead_ReadNextBlock_success', 'reset', d (1 row) 1<: <... completed> -CREATE +CREATE INDEX -- AOCO table CREATE TABLE aoco_index_build_progress(i int, j int ENCODING (compresstype=zstd, compresslevel=2)) USING ao_column; -CREATE +CREATE TABLE -- Insert all tuples to seg1. INSERT INTO aoco_index_build_progress SELECT 0, i FROM generate_series(1, 100000) i; -INSERT 100000 +INSERT 0 100000 +INSERT INTO aoco_index_build_progress SELECT 2, i FROM generate_series(1, 100000) i; +INSERT 0 100000 +INSERT INTO aoco_index_build_progress SELECT 5, i FROM generate_series(1, 100000) i; +INSERT 0 100000 -- Suspend execution when some blocks have been read. SELECT gp_inject_fault('AppendOnlyStorageRead_ReadNextBlock_success', 'suspend', '', '', '', 5, 5, 0, dbid) FROM gp_segment_configuration WHERE content = 1 AND role = 'p'; @@ -83,7 +91,7 @@ SELECT gp_inject_fault('AppendOnlyStorageRead_ReadNextBlock_success', 'reset', d (1 row) 1<: <... completed> -CREATE +CREATE INDEX -- Repeat the test for another index build @@ -120,4 +128,4 @@ SELECT gp_inject_fault('AppendOnlyStorageRead_ReadNextBlock_success', 'reset', d (1 row) 1<: <... completed> -CREATE +CREATE INDEX diff --git a/src/test/isolation2/expected/ao_partition_lock.out b/src/test/isolation2/expected/ao_partition_lock.out index 8802c69acc9..97f1ed97358 100644 --- a/src/test/isolation2/expected/ao_partition_lock.out +++ b/src/test/isolation2/expected/ao_partition_lock.out @@ -5,25 +5,25 @@ -- lock is not acquired. create table test_ao_partition_lock ( field_dk integer ,field_part integer) with (appendonly=true) DISTRIBUTED BY (field_dk) PARTITION BY LIST(field_part) ( partition val1 values(1), partition val2 values(2), partition val3 values(3) ); -CREATE +CREATE TABLE 1: begin; BEGIN 1: insert into test_ao_partition_lock_1_prt_val1 values(1,1); -INSERT 1 +INSERT 0 1 2: begin; BEGIN 2: alter table test_ao_partition_lock truncate partition for (2); -ALTER +ALTER TABLE 2: end; -END +COMMIT 1: end; -END +COMMIT 1q: ... 2q: ... drop table test_ao_partition_lock; -DROP +DROP TABLE diff --git a/src/test/isolation2/expected/ao_same_trans_truncate_crash.out b/src/test/isolation2/expected/ao_same_trans_truncate_crash.out index 318de3ce104..6999ec36dbc 100644 --- a/src/test/isolation2/expected/ao_same_trans_truncate_crash.out +++ b/src/test/isolation2/expected/ao_same_trans_truncate_crash.out @@ -43,11 +43,11 @@ CHECKPOINT 1: BEGIN; BEGIN 1: CREATE TABLE ao_same_trans_truncate(a int, b int) WITH (appendonly=true, orientation=column); -CREATE +CREATE TABLE 1: TRUNCATE TABLE ao_same_trans_truncate; -TRUNCATE +TRUNCATE TABLE 1: ABORT; -ABORT +ROLLBACK -- restart (immediate) to invoke crash recovery 1: SELECT pg_ctl(datadir, 'restart') FROM gp_segment_configuration WHERE role = 'p' AND content <> -1; pg_ctl diff --git a/src/test/isolation2/expected/ao_unique_index.out b/src/test/isolation2/expected/ao_unique_index.out index d737b1feedc..a1638304ee2 100644 --- a/src/test/isolation2/expected/ao_unique_index.out +++ b/src/test/isolation2/expected/ao_unique_index.out @@ -8,9 +8,9 @@ -- Case 1: Conflict with committed transaction---------------------------------- CREATE TABLE unique_index_ao_row (a INT unique) USING ao_row DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE INSERT INTO unique_index_ao_row SELECT * FROM generate_series(1, 329729); -INSERT 329729 +INSERT 0 329729 -- should conflict INSERT INTO unique_index_ao_row VALUES (1); ERROR: duplicate key value violates unique constraint "unique_index_ao_row_a_key" (seg1 192.168.0.148:7003 pid=205740) @@ -20,73 +20,73 @@ ERROR: duplicate key value violates unique constraint "unique_index_ao_row_a_ke DETAIL: Key (a)=(329729) already exists. -- should not conflict INSERT INTO unique_index_ao_row VALUES (329730); -INSERT 1 +INSERT 0 1 DROP TABLE unique_index_ao_row; -DROP +DROP TABLE -- Case 2: Conflict within the same transaction--------------------------------- CREATE TABLE unique_index_ao_row (a INT unique) USING ao_row DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE BEGIN; BEGIN INSERT INTO unique_index_ao_row SELECT * FROM generate_series(1, 329729); -INSERT 329729 +INSERT 0 329729 -- should conflict INSERT INTO unique_index_ao_row VALUES (1); ERROR: duplicate key value violates unique constraint "unique_index_ao_row_a_key" (seg0 192.168.0.148:7002 pid=205739) DETAIL: Key (a)=(1) already exists. END; -END +ROLLBACK DROP TABLE unique_index_ao_row; -DROP +DROP TABLE CREATE TABLE unique_index_ao_row (a INT unique) USING ao_row DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE BEGIN; BEGIN INSERT INTO unique_index_ao_row SELECT * FROM generate_series(1, 329729); -INSERT 329729 +INSERT 0 329729 -- should conflict INSERT INTO unique_index_ao_row VALUES (329729); ERROR: duplicate key value violates unique constraint "unique_index_ao_row_a_key" (seg0 192.168.0.148:7002 pid=205739) DETAIL: Key (a)=(329729) already exists. END; -END +ROLLBACK DROP TABLE unique_index_ao_row; -DROP +DROP TABLE CREATE TABLE unique_index_ao_row (a INT unique) USING ao_row DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE BEGIN; BEGIN INSERT INTO unique_index_ao_row SELECT * FROM generate_series(1, 329729); -INSERT 329729 +INSERT 0 329729 -- should not conflict INSERT INTO unique_index_ao_row VALUES (329730); -INSERT 1 +INSERT 0 1 END; -END +COMMIT DROP TABLE unique_index_ao_row; -DROP +DROP TABLE -- Case 3: Conflict with aborted transaction is not a conflict------------------ CREATE TABLE unique_index_ao_row (a INT unique) USING ao_row DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE BEGIN; BEGIN INSERT INTO unique_index_ao_row SELECT * FROM generate_series(1, 329729); -INSERT 329729 +INSERT 0 329729 ABORT; -ABORT +ROLLBACK -- should not conflict INSERT INTO unique_index_ao_row VALUES (1); -INSERT 1 +INSERT 0 1 INSERT INTO unique_index_ao_row VALUES (329729); -INSERT 1 +INSERT 0 1 INSERT INTO unique_index_ao_row VALUES (329730); -INSERT 1 +INSERT 0 1 DROP TABLE unique_index_ao_row; -DROP +DROP TABLE -- Case 4: Conflict with to-be-committed transaction---------------------------- -- @@ -106,21 +106,21 @@ DROP -- 9. Tx 1 commits -- CREATE TABLE unique_index_ao_row (a INT unique) USING ao_row DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE 1: BEGIN; BEGIN 1: INSERT INTO unique_index_ao_row VALUES (0); -INSERT 1 +INSERT 0 1 2: BEGIN; BEGIN 2: INSERT INTO unique_index_ao_row SELECT * FROM generate_series(1, 329729); -INSERT 329729 +INSERT 0 329729 3&: INSERT INTO unique_index_ao_row VALUES (1); 4&: INSERT INTO unique_index_ao_row VALUES (329728); 5&: INSERT INTO unique_index_ao_row VALUES (329729); -- should succeed immediately 6: INSERT INTO unique_index_ao_row VALUES (329730); -INSERT 1 +INSERT 0 1 2: COMMIT; COMMIT 3<: <... completed> @@ -135,7 +135,7 @@ DETAIL: Key (a)=(329729) already exists. 1: COMMIT; COMMIT DROP TABLE unique_index_ao_row; -DROP +DROP TABLE -- Case 5: Conflict with to-be-aborted transaction------------------------------ -- @@ -155,37 +155,37 @@ DROP -- 10. Tx 1 commits -- CREATE TABLE unique_index_ao_row (a INT unique) USING ao_row DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE 1: BEGIN; BEGIN 1: INSERT INTO unique_index_ao_row VALUES (0); -INSERT 1 +INSERT 0 1 2: BEGIN; BEGIN 2: INSERT INTO unique_index_ao_row SELECT * FROM generate_series(1, 329729); -INSERT 329729 +INSERT 0 329729 3&: INSERT INTO unique_index_ao_row VALUES (1); 4&: INSERT INTO unique_index_ao_row VALUES (329728); 5&: INSERT INTO unique_index_ao_row VALUES (329729); -- should succeed immediately 6: INSERT INTO unique_index_ao_row VALUES (329730); -INSERT 1 +INSERT 0 1 2: ABORT; -ABORT +ROLLBACK 3<: <... completed> -INSERT 1 +INSERT 0 1 4<: <... completed> -INSERT 1 +INSERT 0 1 5<: <... completed> -INSERT 1 +INSERT 0 1 1: COMMIT; COMMIT DROP TABLE unique_index_ao_row; -DROP +DROP TABLE -- Case 6: Conflict with aborted rows following some committed rows ------------ CREATE TABLE unique_index_ao_row (a INT unique) USING ao_row DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE -- 1. Tx 1 commits rows 1-100. -- 2. Tx 2 inserts rows 101-200 and then aborts. -- 3. Tx 3 tries to insert row in range [101,200] and is immediately successful. @@ -193,22 +193,22 @@ CREATE -- constraint violation. -- 5. Tx 5 tries to insert row in range [201, ) and is immediately successful. 1: INSERT INTO unique_index_ao_row SELECT generate_series(1, 100); -INSERT 100 +INSERT 0 100 2: BEGIN; BEGIN 2: INSERT INTO unique_index_ao_row SELECT generate_series(101, 200); -INSERT 100 +INSERT 0 100 2: ABORT; -ABORT +ROLLBACK 3: INSERT INTO unique_index_ao_row VALUES(102); -INSERT 1 +INSERT 0 1 4: INSERT INTO unique_index_ao_row VALUES(2); ERROR: duplicate key value violates unique constraint "unique_index_ao_row_a_key" (seg0 192.168.0.148:7002 pid=659656) DETAIL: Key (a)=(2) already exists. 5: INSERT INTO unique_index_ao_row VALUES(202); -INSERT 1 +INSERT 0 1 DROP TABLE unique_index_ao_row; -DROP +DROP TABLE -------------------------------------------------------------------------------- ----------------- More concurrent tests with fault injection ------------------ @@ -232,7 +232,7 @@ DROP -- 6. Tx 2 succeeds as Tx 1 aborted. CREATE TABLE unique_index_ao_row (a INT unique) USING ao_row DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE SELECT gp_inject_fault('appendonly_insert', 'suspend', '', '', 'unique_index_ao_row', 4, 4, 0, dbid) FROM gp_segment_configuration WHERE role = 'p' AND content <> -1; gp_inject_fault ----------------- @@ -252,9 +252,9 @@ SELECT gp_wait_until_triggered_fault('appendonly_insert', 4, dbid) FROM gp_segme (3 rows) 2&: INSERT INTO unique_index_ao_row VALUES(2); 4: INSERT INTO unique_index_ao_row VALUES(11); -INSERT 1 +INSERT 0 1 3: INSERT INTO unique_index_ao_row VALUES(4); -INSERT 1 +INSERT 0 1 SELECT gp_inject_fault('appendonly_insert', 'reset', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content <> -1; gp_inject_fault ----------------- @@ -266,9 +266,9 @@ SELECT gp_inject_fault('appendonly_insert', 'reset', dbid) FROM gp_segment_confi ERROR: duplicate key value violates unique constraint "unique_index_ao_row_a_key" (seg1 192.168.0.148:7003 pid=828519) DETAIL: Key (a)=(4) already exists. 2<: <... completed> -INSERT 1 +INSERT 0 1 DROP TABLE unique_index_ao_row; -DROP +DROP TABLE -- Case 8: Conflict with to-be-committed transaction - generalization of case 7 -- where there are multiple minipages (and block directory rows) in play from @@ -293,7 +293,7 @@ DROP -- 7. All blocked Txs succeed. CREATE TABLE unique_index_ao_row (a INT unique) USING ao_row DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE SELECT gp_inject_fault('insert_new_entry_curr_minipage_full', 'suspend', '', '', '', 2, 2, 0, dbid) FROM gp_segment_configuration WHERE role = 'p' AND content <> -1; gp_inject_fault @@ -349,7 +349,7 @@ SELECT gp_wait_until_triggered_fault('appendonly_insert', 4, dbid) FROM gp_segme 8&: INSERT INTO unique_index_ao_row VALUES(661507); -- no index entry exists for it, so should not conflict. 9: INSERT INTO unique_index_ao_row VALUES(661510); -INSERT 1 +INSERT 0 1 SELECT gp_inject_fault('appendonly_insert', 'reset', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content <> -1; gp_inject_fault @@ -363,29 +363,29 @@ SELECT gp_inject_fault('appendonly_insert', 'reset', dbid) FROM gp_segment_confi ERROR: duplicate key value violates unique constraint "unique_index_ao_row_a_key" (seg1 192.168.0.148:7003 pid=630215) DETAIL: Key (a)=(661510) already exists. 2<: <... completed> -INSERT 1 +INSERT 0 1 3<: <... completed> -INSERT 1 +INSERT 0 1 4<: <... completed> -INSERT 1 +INSERT 0 1 5<: <... completed> -INSERT 1 +INSERT 0 1 6<: <... completed> -INSERT 1 +INSERT 0 1 7<: <... completed> -INSERT 1 +INSERT 0 1 8<: <... completed> -INSERT 1 +INSERT 0 1 DROP TABLE unique_index_ao_row; -DROP +DROP TABLE -------------------------------------------------------------------------------- --------------------------- Smoke tests for COPY ------------------------------- -------------------------------------------------------------------------------- CREATE TABLE unique_index_ao_row (a INT unique) USING ao_row DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE 1: BEGIN; BEGIN @@ -405,23 +405,23 @@ CONTEXT: COPY unique_index_ao_row, line 1 2<: <... completed> COPY 1 1: END; -END +ROLLBACK DROP TABLE unique_index_ao_row; -DROP +DROP TABLE -------------------------------------------------------------------------------- -------------------- Smoke tests for subtransactions --------------------------- -------------------------------------------------------------------------------- CREATE TABLE unique_index_ao_row (a INT unique) USING ao_row DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE 1: BEGIN; BEGIN 1: SAVEPOINT a; SAVEPOINT 1: INSERT INTO unique_index_ao_row VALUES(1); -INSERT 1 +INSERT 0 1 -- concurrent tx inserting conflicting row should block. 2: BEGIN; @@ -429,7 +429,7 @@ BEGIN 2&: INSERT INTO unique_index_ao_row VALUES(1); -- concurrent tx inserting non-conflicting row should be successful. 3: INSERT INTO unique_index_ao_row VALUES(2); -INSERT 1 +INSERT 0 1 -- conflict should be detected within the same subtx. 1: INSERT INTO unique_index_ao_row VALUES(1); @@ -437,15 +437,15 @@ ERROR: duplicate key value violates unique constraint "unique_index_ao_row_a_ke DETAIL: Key (a)=(1) already exists. -- the concurrent tx should now succeed. 2<: <... completed> -INSERT 1 +INSERT 0 1 2: ABORT; -ABORT +ROLLBACK -- after rolling back to the savepoint, we should be able to re-insert the key 1: ROLLBACK TO SAVEPOINT a; ROLLBACK 1: INSERT INTO unique_index_ao_row VALUES(1); -INSERT 1 +INSERT 0 1 1: COMMIT; COMMIT @@ -457,7 +457,7 @@ SELECT * FROM unique_index_ao_row; (2 rows) DROP TABLE unique_index_ao_row; -DROP +DROP TABLE -------------------------------------------------------------------------------- -------------------- Smoke tests for repeatable read --------------------------- @@ -467,7 +467,7 @@ DROP -- boundaries. CREATE TABLE unique_index_ao_row (a INT unique) USING ao_row DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE -- Begin two txs with tx level snapshot taken early. 1: BEGIN ISOLATION LEVEL REPEATABLE READ; @@ -487,11 +487,11 @@ BEGIN 3: BEGIN; BEGIN 3: INSERT INTO unique_index_ao_row VALUES(1); -INSERT 1 +INSERT 0 1 -- And another transaction inserts a key and commits. INSERT INTO unique_index_ao_row VALUES(2); -INSERT 1 +INSERT 0 1 -- Tx should block on insert of conflicting key, even though it can't "see" the -- conflicting key due to its isolation level. @@ -502,11 +502,11 @@ INSERT 1 1&: INSERT INTO unique_index_ao_row VALUES(1); 3: ABORT; -ABORT +ROLLBACK 1<: <... completed> -INSERT 1 +INSERT 0 1 1: ABORT; -ABORT +ROLLBACK -- Tx should raise a conflict, even though it can't "see" the conflicting key -- due to its isolation level. @@ -522,52 +522,3 @@ ABORT DROP TABLE unique_index_ao_row; DROP - - --------------------------------------------------------------------------------- ------------------------ Smoke tests for ADD CONSTRAINT ------------------------ --------------------------------------------------------------------------------- -CREATE TABLE unique_index_ao_row (a INT) USING ao_row DISTRIBUTED REPLICATED; -CREATE -INSERT INTO unique_index_ao_row SELECT * FROM generate_series(1, 5); -INSERT 5 - -ALTER table unique_index_ao_row ADD CONSTRAINT a_unique UNIQUE(a); -ALTER --- should conflict -INSERT INTO unique_index_ao_row VALUES (1); -DETAIL: Key (a)=(1) already exists. -ERROR: duplicate key value violates unique constraint "a_unique" -ALTER table unique_index_ao_row DROP CONSTRAINT a_unique; -ALTER - -INSERT INTO unique_index_ao_row VALUES (1); -INSERT 1 --- should failed -ALTER table unique_index_ao_row ADD CONSTRAINT a_unique UNIQUE(a); -DETAIL: Key (a)=(1) is duplicated. -ERROR: could not create unique index "a_unique" - -DROP TABLE unique_index_ao_row; -DROP - - --------------------------------------------------------------------------------- ------------------------ Smoke tests for Multiple Key --------------------------- --------------------------------------------------------------------------------- -CREATE TABLE unique_index_ao_row (a INT, b INT) USING ao_row DISTRIBUTED REPLICATED; -CREATE -INSERT INTO unique_index_ao_row SELECT i,i FROM generate_series(1, 5) i; -INSERT 5 - -CREATE UNIQUE INDEX a_b_unique ON unique_index_ao_row(a,b); -CREATE --- should not conflict -INSERT INTO unique_index_ao_row VALUES (1,2); -INSERT 1 --- should conflict -INSERT INTO unique_index_ao_row VALUES (1,1); -DETAIL: Key (a, b)=(1, 1) already exists. -ERROR: duplicate key value violates unique constraint "a_b_unique" -DROP TABLE unique_index_ao_row; -DROP diff --git a/src/test/isolation2/expected/aoco_column_rewrite.out b/src/test/isolation2/expected/aoco_column_rewrite.out index 58c20004c57..2d3933ee7eb 100644 --- a/src/test/isolation2/expected/aoco_column_rewrite.out +++ b/src/test/isolation2/expected/aoco_column_rewrite.out @@ -9,3 +9,1709 @@ * So when we cherry-pick the commit 20f39c76f3dd03b0feb8b05011c1e0637df6c77e, please * also bring the changes in 17b0aac07bebc771b2d3a32bbd22cc8318201f57, or we will lost it. */ +-------------------------------------------------------------------------------- +-- Tests for various scenarios with the column rewrite optimization +-- for AT on AOCO tables +-------------------------------------------------------------------------------- + +PREPARE attribute_encoding_check AS SELECT c.relname, a.attname, e.filenum, e.attoptions FROM pg_attribute_encoding e, pg_class c, pg_attribute a WHERE e.attrelid = c.oid AND e.attnum = a.attnum and e.attrelid = a.attrelid AND c.relname LIKE $1; +PREPARE + +CREATE TABLE if not exists relfilenodecheck(segid int, relname text, relfilenodebefore int, relfilenodeafter int, casename text); +CREATE TABLE + +PREPARE capturerelfilenodebefore AS INSERT INTO relfilenodecheck SELECT -1 segid, relname, pg_relation_filenode(relname::text) as relfilenode, NULL::int, $1 as casename FROM pg_class WHERE relname LIKE $2 UNION SELECT gp_segment_id segid, relname, pg_relation_filenode(relname::text) as relfilenode, NULL::int, $1 as casename FROM gp_dist_random('pg_class') WHERE relname LIKE $2 ORDER BY segid; +PREPARE + +PREPARE checkrelfilenodediff AS SELECT a.segid, b.casename, b.relname, (relfilenodebefore != a.relfilenode) rewritten FROM ( SELECT -1 segid, relname, pg_relation_filenode(relname::text) as relfilenode FROM pg_class WHERE relname LIKE $2 UNION SELECT gp_segment_id segid, relname, pg_relation_filenode(relname::text) as relfilenode FROM gp_dist_random('pg_class') WHERE relname LIKE $2 ORDER BY segid )a, relfilenodecheck b WHERE b.casename LIKE $1 and b.relname LIKE $2 and a.segid = b.segid; +PREPARE + +-------------------------------------------------------------------------------- +-- Test if ALTER COLUMN TYPE and ADD COLUMN on AOCO doesn't rewrite the entire table +-------------------------------------------------------------------------------- + +CREATE TABLE alter_type_aoco(a int, b int, c int) using ao_column; +CREATE TABLE +INSERT INTO alter_type_aoco VALUES (20,1,2); +INSERT 0 1 +EXECUTE attribute_encoding_check ('alter_type_aoco'); + relname | attname | filenum | attoptions +-----------------+---------+---------+------------------------------------------------------------- + alter_type_aoco | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_type_aoco | b | 2 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_type_aoco | c | 3 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(3 rows) +SELECT * FROM gp_toolkit.__gp_aocsseg('alter_type_aoco') ORDER BY segment_id, column_num; + segment_id | segno | column_num | physical_segno | tupcount | eof | eof_uncompressed | modcount | formatversion | state +------------+-------+------------+----------------+----------+-----+------------------+----------+---------------+------- + 1 | 1 | 0 | 1 | 1 | 48 | 48 | 1 | 3 | 1 + 1 | 1 | 1 | 129 | 1 | 48 | 48 | 1 | 3 | 1 + 1 | 1 | 2 | 257 | 1 | 48 | 48 | 1 | 3 | 1 +(3 rows) +EXECUTE capturerelfilenodebefore ('alter_column', 'alter_type_aoco'); +INSERT 0 4 +SELECT * FROM alter_type_aoco; + a | b | c +----+---+--- + 20 | 1 | 2 +(1 row) + +ALTER TABLE alter_type_aoco ALTER COLUMN b TYPE text; +ALTER TABLE + +EXECUTE attribute_encoding_check ('alter_type_aoco'); + relname | attname | filenum | attoptions +-----------------+---------+---------+------------------------------------------------------------- + alter_type_aoco | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_type_aoco | c | 3 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_type_aoco | b | 1602 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(3 rows) +SELECT * FROM gp_toolkit.__gp_aocsseg('alter_type_aoco') ORDER BY segment_id, column_num; + segment_id | segno | column_num | physical_segno | tupcount | eof | eof_uncompressed | modcount | formatversion | state +------------+-------+------------+----------------+----------+-----+------------------+----------+---------------+------- + 1 | 1 | 0 | 1 | 1 | 48 | 48 | 2 | 3 | 1 + 1 | 1 | 1 | 204929 | 1 | 48 | 48 | 2 | 3 | 1 + 1 | 1 | 2 | 257 | 1 | 48 | 48 | 2 | 3 | 1 +(3 rows) +EXECUTE checkrelfilenodediff ('alter_column', 'alter_type_aoco'); + segid | casename | relname | rewritten +-------+--------------+-----------------+----------- + 0 | alter_column | alter_type_aoco | f + 1 | alter_column | alter_type_aoco | f + -1 | alter_column | alter_type_aoco | f + 2 | alter_column | alter_type_aoco | f +(4 rows) +-- data is intact +SELECT * FROM alter_type_aoco; + a | b | c +----+---+--- + 20 | 1 | 2 +(1 row) +INSERT INTO alter_type_aoco VALUES (20,'1',2); +INSERT 0 1 +-- data is intact +SELECT * FROM alter_type_aoco; + a | b | c +----+---+--- + 20 | 1 | 2 + 20 | 1 | 2 +(2 rows) + +ALTER TABLE alter_type_aoco ADD COLUMN d int; +ALTER TABLE + +INSERT INTO alter_type_aoco VALUES (20,'1',2, 3); +INSERT 0 1 +-- check if we chose correct filenum for newly added column +EXECUTE attribute_encoding_check ('alter_type_aoco'); + relname | attname | filenum | attoptions +-----------------+---------+---------+------------------------------------------------------------- + alter_type_aoco | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_type_aoco | c | 3 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_type_aoco | b | 1602 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_type_aoco | d | 4 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(4 rows) +SELECT * FROM gp_toolkit.__gp_aocsseg('alter_type_aoco') ORDER BY segment_id, column_num; + segment_id | segno | column_num | physical_segno | tupcount | eof | eof_uncompressed | modcount | formatversion | state +------------+-------+------------+----------------+----------+-----+------------------+----------+---------------+------- + 1 | 1 | 0 | 1 | 3 | 144 | 144 | 5 | 3 | 1 + 1 | 1 | 1 | 204929 | 3 | 144 | 144 | 5 | 3 | 1 + 1 | 1 | 2 | 257 | 3 | 144 | 144 | 5 | 3 | 1 + 1 | 1 | 3 | 385 | 3 | 144 | 144 | 5 | 3 | 1 +(4 rows) +DROP TABLE alter_type_aoco; +DROP TABLE +CHECKPOINT; +CHECKPOINT +-- check if all files are dropped correctly +SELECT * FROM gp_toolkit.gp_check_orphaned_files WHERE split_part(filename,'.',1) = (SELECT oid::text FROM pg_class WHERE relname = 'alter_type_aoco'); + gp_segment_id | tablespace | filename +---------------+------------+---------- +(0 rows) + +-------------------------------------------------------------------------------- +-- Test if column rewrite handles deleted rows in blockdirectory correctly for +-- more than 1 minipage + +-- We create a table and its blkdir and insert enough data to have more than one +-- minipage in the block directory, and check if the column rewrite rewrites the +-- blockdirectory correctly +-------------------------------------------------------------------------------- +CREATE TABLE alter_type_aoco_delete(a int, b int, c int) USING ao_column; +CREATE TABLE +CREATE INDEX at_aoco_idx on alter_type_aoco_delete(c); +CREATE INDEX +INSERT INTO alter_type_aoco_delete SELECT 1,i,i FROM generate_series(1,10000)i; +INSERT 0 10000 +DELETE FROM alter_type_aoco_delete WHERE b%3 = 1; +DELETE 3334 +EXECUTE capturerelfilenodebefore ('alter_column', 'alter_type_aoco_delete'); +INSERT 0 4 +SELECT count(*) FROM alter_type_aoco_delete; + count +------- + 6666 +(1 row) + +-- test both ALTER COLUMN TYPE and ALTER COLUMN SET ENCODING together +ALTER TABLE alter_type_aoco_delete ALTER COLUMN b TYPE text, ALTER COLUMN c SET ENCODING (compresstype=rle_type, compresslevel=4); +ALTER TABLE + +EXECUTE attribute_encoding_check ('alter_type_aoco_delete'); + relname | attname | filenum | attoptions +------------------------+---------+---------+----------------------------------------------------------------- + alter_type_aoco_delete | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_type_aoco_delete | c | 1603 | ['compresstype=rle_type', 'blocksize=32768', 'compresslevel=4'] + alter_type_aoco_delete | b | 1602 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(3 rows) +SELECT * FROM gp_toolkit.__gp_aocsseg('alter_type_aoco_delete') ORDER BY segment_id, column_num; + segment_id | segno | column_num | physical_segno | tupcount | eof | eof_uncompressed | modcount | formatversion | state +------------+-------+------------+----------------+----------+-------+------------------+----------+---------------+------- + 1 | 1 | 0 | 1 | 10000 | 40088 | 40088 | 3 | 3 | 1 + 1 | 1 | 1 | 204929 | 10000 | 48984 | 48984 | 3 | 3 | 1 + 1 | 1 | 2 | 205057 | 10000 | 88 | 40047 | 3 | 3 | 1 +(3 rows) +SELECT gp_segment_id, (gp_toolkit.__gp_aoblkdir('alter_type_aoco_delete')).* FROM gp_dist_random('gp_id'); + gp_segment_id | tupleid | segno | columngroup_no | entry_no | first_row_no | file_offset | row_count +---------------+---------+-------+----------------+----------+--------------+-------------+----------- + 1 | (0,1) | 1 | 0 | 0 | 1 | 0 | 8181 + 1 | (0,1) | 1 | 0 | 1 | 8182 | 32768 | 1819 + 1 | (0,4) | 1 | 1 | 0 | 1 | 0 | 6766 + 1 | (0,4) | 1 | 1 | 1 | 6767 | 32768 | 3234 + 1 | (0,5) | 1 | 2 | 0 | 1 | 0 | 10000 +(5 rows) +EXECUTE checkrelfilenodediff ('alter_column', 'alter_type_aoco_delete'); + segid | casename | relname | rewritten +-------+--------------+------------------------+----------- + 2 | alter_column | alter_type_aoco_delete | f + 0 | alter_column | alter_type_aoco_delete | f + 1 | alter_column | alter_type_aoco_delete | f + -1 | alter_column | alter_type_aoco_delete | f +(4 rows) +SELECT count(b) FROM alter_type_aoco_delete; + count +------- + 6666 +(1 row) +SELECT count(*) FROM alter_type_aoco_delete; + count +------- + 6666 +(1 row) + +-------------------------------------------------------------------------------- +-- Test if column rewrite handles blockdirectory and visimap +-- for deleted rows correctly with multiple blocks in same segfile + +-- Here, we insert data into two different blocks and delete all rows from first +-- block. We test if that block is still replicated in the rewritten col +-------------------------------------------------------------------------------- +CREATE TABLE alter_type_aoco_delete1(a int, b int, c int) USING ao_column; +CREATE TABLE +CREATE INDEX at_aoco_idx1 on alter_type_aoco_delete1(c); +CREATE INDEX +INSERT INTO alter_type_aoco_delete1 VALUES (1,2,2); +INSERT 0 1 +INSERT INTO alter_type_aoco_delete1 VALUES (1,3,3); +INSERT 0 1 +DELETE FROM alter_type_aoco_delete1 WHERE b = 2; +DELETE 1 +EXECUTE attribute_encoding_check ('alter_type_aoco_delete1'); + relname | attname | filenum | attoptions +-------------------------+---------+---------+------------------------------------------------------------- + alter_type_aoco_delete1 | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_type_aoco_delete1 | b | 2 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_type_aoco_delete1 | c | 3 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(3 rows) +SELECT * FROM gp_toolkit.__gp_aocsseg('alter_type_aoco_delete1') ORDER BY segment_id, column_num; + segment_id | segno | column_num | physical_segno | tupcount | eof | eof_uncompressed | modcount | formatversion | state +------------+-------+------------+----------------+----------+-----+------------------+----------+---------------+------- + 1 | 1 | 0 | 1 | 2 | 96 | 96 | 3 | 3 | 1 + 1 | 1 | 1 | 129 | 2 | 96 | 96 | 3 | 3 | 1 + 1 | 1 | 2 | 257 | 2 | 96 | 96 | 3 | 3 | 1 +(3 rows) +SELECT (gp_toolkit.__gp_aovisimap('alter_type_aoco_delete1')).* FROM gp_dist_random('gp_id'); + tid | segno | row_num +--------------+-------+--------- + (33554432,2) | 1 | 1 +(1 row) +SELECT gp_segment_id, (gp_toolkit.__gp_aoblkdir('alter_type_aoco_delete1')).* FROM gp_dist_random('gp_id'); + gp_segment_id | tupleid | segno | columngroup_no | entry_no | first_row_no | file_offset | row_count +---------------+---------+-------+----------------+----------+--------------+-------------+----------- + 1 | (0,4) | 1 | 0 | 0 | 1 | 0 | 1 + 1 | (0,4) | 1 | 0 | 1 | 101 | 48 | 1 + 1 | (0,5) | 1 | 1 | 0 | 1 | 0 | 1 + 1 | (0,5) | 1 | 1 | 1 | 101 | 48 | 1 + 1 | (0,6) | 1 | 2 | 0 | 1 | 0 | 1 + 1 | (0,6) | 1 | 2 | 1 | 101 | 48 | 1 +(6 rows) +EXECUTE capturerelfilenodebefore ('alter_column', 'alter_type_aoco_delete1'); +INSERT 0 4 +SELECT * FROM alter_type_aoco_delete1; + a | b | c +---+---+--- + 1 | 3 | 3 +(1 row) + +-- test both ALTER COLUMN TYPE and ALTER COLUMN SET ENCODING together +ALTER TABLE alter_type_aoco_delete1 ALTER COLUMN b TYPE text, ALTER COLUMN c SET ENCODING (compresstype=rle_type, compresslevel=4); +ALTER TABLE + +EXECUTE attribute_encoding_check ('alter_type_aoco_delete1'); + relname | attname | filenum | attoptions +-------------------------+---------+---------+----------------------------------------------------------------- + alter_type_aoco_delete1 | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_type_aoco_delete1 | c | 1603 | ['compresstype=rle_type', 'blocksize=32768', 'compresslevel=4'] + alter_type_aoco_delete1 | b | 1602 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(3 rows) +SELECT * FROM gp_toolkit.__gp_aocsseg('alter_type_aoco_delete1') ORDER BY segment_id, column_num; + segment_id | segno | column_num | physical_segno | tupcount | eof | eof_uncompressed | modcount | formatversion | state +------------+-------+------------+----------------+----------+-----+------------------+----------+---------------+------- + 1 | 1 | 0 | 1 | 2 | 96 | 96 | 4 | 3 | 1 + 1 | 1 | 1 | 204929 | 2 | 96 | 96 | 4 | 3 | 1 + 1 | 1 | 2 | 205057 | 2 | 96 | 96 | 4 | 3 | 1 +(3 rows) +SELECT (gp_toolkit.__gp_aovisimap('alter_type_aoco_delete1')).* FROM gp_dist_random('gp_id'); + tid | segno | row_num +--------------+-------+--------- + (33554432,2) | 1 | 1 +(1 row) +SELECT gp_segment_id, (gp_toolkit.__gp_aoblkdir('alter_type_aoco_delete1')).* FROM gp_dist_random('gp_id'); + gp_segment_id | tupleid | segno | columngroup_no | entry_no | first_row_no | file_offset | row_count +---------------+---------+-------+----------------+----------+--------------+-------------+----------- + 1 | (0,4) | 1 | 0 | 0 | 1 | 0 | 1 + 1 | (0,4) | 1 | 0 | 1 | 101 | 48 | 1 + 1 | (0,7) | 1 | 1 | 0 | 1 | 0 | 1 + 1 | (0,7) | 1 | 1 | 1 | 101 | 48 | 1 + 1 | (0,8) | 1 | 2 | 0 | 1 | 0 | 1 + 1 | (0,8) | 1 | 2 | 1 | 101 | 48 | 1 +(6 rows) +EXECUTE checkrelfilenodediff ('alter_column', 'alter_type_aoco_delete1'); + segid | casename | relname | rewritten +-------+--------------+-------------------------+----------- + 2 | alter_column | alter_type_aoco_delete1 | f + -1 | alter_column | alter_type_aoco_delete1 | f + 0 | alter_column | alter_type_aoco_delete1 | f + 1 | alter_column | alter_type_aoco_delete1 | f +(4 rows) +SELECT b FROM alter_type_aoco_delete1; + b +--- + 3 +(1 row) +SELECT * FROM alter_type_aoco_delete1; + a | b | c +---+---+--- + 1 | 3 | 3 +(1 row) + +-------------------------------------------------------------------------------- +-- Test if column rewrite handles blockdirectory and visimap +-- for deleted rows correctly with multiple blocks in same segfile + +-- Here, we insert data into two different blocks and delete all rows from second +-- block. We test if that block is still replicated in the rewritten col +-------------------------------------------------------------------------------- +CREATE TABLE alter_type_aoco_delete2(a int, b int, c int) USING ao_column; +CREATE TABLE +CREATE INDEX at_aoco_idx2 on alter_type_aoco_delete2(c); +CREATE INDEX +INSERT INTO alter_type_aoco_delete2 VALUES (1,2,2); +INSERT 0 1 +INSERT INTO alter_type_aoco_delete2 VALUES (1,3,3); +INSERT 0 1 +DELETE FROM alter_type_aoco_delete2 WHERE b = 3; +DELETE 1 +EXECUTE attribute_encoding_check ('alter_type_aoco_delete2'); + relname | attname | filenum | attoptions +-------------------------+---------+---------+------------------------------------------------------------- + alter_type_aoco_delete2 | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_type_aoco_delete2 | b | 2 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_type_aoco_delete2 | c | 3 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(3 rows) +SELECT * FROM gp_toolkit.__gp_aocsseg('alter_type_aoco_delete2') ORDER BY segment_id, column_num; + segment_id | segno | column_num | physical_segno | tupcount | eof | eof_uncompressed | modcount | formatversion | state +------------+-------+------------+----------------+----------+-----+------------------+----------+---------------+------- + 1 | 1 | 0 | 1 | 2 | 96 | 96 | 3 | 3 | 1 + 1 | 1 | 1 | 129 | 2 | 96 | 96 | 3 | 3 | 1 + 1 | 1 | 2 | 257 | 2 | 96 | 96 | 3 | 3 | 1 +(3 rows) +SELECT (gp_toolkit.__gp_aovisimap('alter_type_aoco_delete2')).* FROM gp_dist_random('gp_id'); + tid | segno | row_num +----------------+-------+--------- + (33554432,102) | 1 | 101 +(1 row) +SELECT gp_segment_id, (gp_toolkit.__gp_aoblkdir('alter_type_aoco_delete2')).* FROM gp_dist_random('gp_id'); + gp_segment_id | tupleid | segno | columngroup_no | entry_no | first_row_no | file_offset | row_count +---------------+---------+-------+----------------+----------+--------------+-------------+----------- + 1 | (0,4) | 1 | 0 | 0 | 1 | 0 | 1 + 1 | (0,4) | 1 | 0 | 1 | 101 | 48 | 1 + 1 | (0,5) | 1 | 1 | 0 | 1 | 0 | 1 + 1 | (0,5) | 1 | 1 | 1 | 101 | 48 | 1 + 1 | (0,6) | 1 | 2 | 0 | 1 | 0 | 1 + 1 | (0,6) | 1 | 2 | 1 | 101 | 48 | 1 +(6 rows) +EXECUTE capturerelfilenodebefore ('alter_column', 'alter_type_aoco_delete2'); +INSERT 0 4 +SELECT * FROM alter_type_aoco_delete2; + a | b | c +---+---+--- + 1 | 2 | 2 +(1 row) + +-- test both ALTER COLUMN TYPE and ALTER COLUMN SET ENCODING together +ALTER TABLE alter_type_aoco_delete2 ALTER COLUMN b TYPE text, ALTER COLUMN c SET ENCODING (compresstype=rle_type, compresslevel=4); +ALTER TABLE + +EXECUTE attribute_encoding_check ('alter_type_aoco_delete2'); + relname | attname | filenum | attoptions +-------------------------+---------+---------+----------------------------------------------------------------- + alter_type_aoco_delete2 | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_type_aoco_delete2 | c | 1603 | ['compresstype=rle_type', 'blocksize=32768', 'compresslevel=4'] + alter_type_aoco_delete2 | b | 1602 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(3 rows) +SELECT * FROM gp_toolkit.__gp_aocsseg('alter_type_aoco_delete2') ORDER BY segment_id, column_num; + segment_id | segno | column_num | physical_segno | tupcount | eof | eof_uncompressed | modcount | formatversion | state +------------+-------+------------+----------------+----------+-----+------------------+----------+---------------+------- + 1 | 1 | 0 | 1 | 2 | 96 | 96 | 4 | 3 | 1 + 1 | 1 | 1 | 204929 | 2 | 96 | 96 | 4 | 3 | 1 + 1 | 1 | 2 | 205057 | 2 | 96 | 96 | 4 | 3 | 1 +(3 rows) +SELECT (gp_toolkit.__gp_aovisimap('alter_type_aoco_delete2')).* FROM gp_dist_random('gp_id'); + tid | segno | row_num +----------------+-------+--------- + (33554432,102) | 1 | 101 +(1 row) +SELECT gp_segment_id, (gp_toolkit.__gp_aoblkdir('alter_type_aoco_delete2')).* FROM gp_dist_random('gp_id'); + gp_segment_id | tupleid | segno | columngroup_no | entry_no | first_row_no | file_offset | row_count +---------------+---------+-------+----------------+----------+--------------+-------------+----------- + 1 | (0,4) | 1 | 0 | 0 | 1 | 0 | 1 + 1 | (0,4) | 1 | 0 | 1 | 101 | 48 | 1 + 1 | (0,7) | 1 | 1 | 0 | 1 | 0 | 1 + 1 | (0,7) | 1 | 1 | 1 | 101 | 48 | 1 + 1 | (0,8) | 1 | 2 | 0 | 1 | 0 | 1 + 1 | (0,8) | 1 | 2 | 1 | 101 | 48 | 1 +(6 rows) +EXECUTE checkrelfilenodediff ('alter_column', 'alter_type_aoco_delete2'); + segid | casename | relname | rewritten +-------+--------------+-------------------------+----------- + 0 | alter_column | alter_type_aoco_delete2 | f + 1 | alter_column | alter_type_aoco_delete2 | f + -1 | alter_column | alter_type_aoco_delete2 | f + 2 | alter_column | alter_type_aoco_delete2 | f +(4 rows) +SELECT b FROM alter_type_aoco_delete2; + b +--- + 2 +(1 row) +SELECT * FROM alter_type_aoco_delete2; + a | b | c +---+---+--- + 1 | 2 | 2 +(1 row) + +-------------------------------------------------------------------------------- +-- Test if AT ALTER COLUMN TYPE works fine when we need a full table rewrite. + +-- We perform a AT subcmd which requires a full table rewrite, and check results +-- for the AT ALTER COLUMN TYPE after the table is fully rewritten +-------------------------------------------------------------------------------- + + +CREATE TABLE alter_type_aoco_fullrewrite(a int, b int, c int) using ao_column; +CREATE TABLE +INSERT INTO alter_type_aoco_fullrewrite VALUES (20,1,2); +INSERT 0 1 +EXECUTE attribute_encoding_check ('alter_type_aoco_fullrewrite'); + relname | attname | filenum | attoptions +-----------------------------+---------+---------+------------------------------------------------------------- + alter_type_aoco_fullrewrite | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_type_aoco_fullrewrite | b | 2 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_type_aoco_fullrewrite | c | 3 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(3 rows) +SELECT * FROM gp_toolkit.__gp_aocsseg('alter_type_aoco_fullrewrite') ORDER BY segment_id, column_num; + segment_id | segno | column_num | physical_segno | tupcount | eof | eof_uncompressed | modcount | formatversion | state +------------+-------+------------+----------------+----------+-----+------------------+----------+---------------+------- + 1 | 1 | 0 | 1 | 1 | 48 | 48 | 1 | 3 | 1 + 1 | 1 | 1 | 129 | 1 | 48 | 48 | 1 | 3 | 1 + 1 | 1 | 2 | 257 | 1 | 48 | 48 | 1 | 3 | 1 +(3 rows) +EXECUTE capturerelfilenodebefore ('alter_column', 'alter_type_aoco_fullrewrite'); +INSERT 0 4 +SELECT * FROM alter_type_aoco_fullrewrite; + a | b | c +----+---+--- + 20 | 1 | 2 +(1 row) + +ALTER TABLE alter_type_aoco_fullrewrite ALTER COLUMN b TYPE text, SET UNLOGGED; +ALTER TABLE + +EXECUTE attribute_encoding_check ('alter_type_aoco_fullrewrite'); + relname | attname | filenum | attoptions +-----------------------------+---------+---------+------------------------------------------------------------- + alter_type_aoco_fullrewrite | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_type_aoco_fullrewrite | c | 3 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_type_aoco_fullrewrite | b | 2 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(3 rows) +SELECT * FROM gp_toolkit.__gp_aocsseg('alter_type_aoco_fullrewrite') ORDER BY segment_id, column_num; + segment_id | segno | column_num | physical_segno | tupcount | eof | eof_uncompressed | modcount | formatversion | state +------------+-------+------------+----------------+----------+-----+------------------+----------+---------------+------- + 1 | 0 | 0 | 0 | 1 | 48 | 48 | 1 | 3 | 1 + 1 | 0 | 1 | 128 | 1 | 48 | 48 | 1 | 3 | 1 + 1 | 0 | 2 | 256 | 1 | 48 | 48 | 1 | 3 | 1 +(3 rows) +EXECUTE checkrelfilenodediff ('alter_column', 'alter_type_aoco_fullrewrite'); + segid | casename | relname | rewritten +-------+--------------+-----------------------------+----------- + 0 | alter_column | alter_type_aoco_fullrewrite | t + 1 | alter_column | alter_type_aoco_fullrewrite | t + 2 | alter_column | alter_type_aoco_fullrewrite | t + -1 | alter_column | alter_type_aoco_fullrewrite | t +(4 rows) +-- data is intact +SELECT * FROM alter_type_aoco_fullrewrite; + a | b | c +----+---+--- + 20 | 1 | 2 +(1 row) +INSERT INTO alter_type_aoco_fullrewrite VALUES (20,'1',2); +INSERT 0 1 +-- data is intact +SELECT * FROM alter_type_aoco_fullrewrite; + a | b | c +----+---+--- + 20 | 1 | 2 + 20 | 1 | 2 +(2 rows) + +-------------------------------------------------------------------------------- +-- Test if AT ALTER COLUMN TYPE reindexes rewrite-affected indexes + +-- We create indexes on columns and test if these indexes are rewritten +-- when any of the columns are rewritten on which the indexes depend on +-- but other indexes are unaffected +-------------------------------------------------------------------------------- + +CREATE TABLE alter_type_aoco(a int, b int, c int, d int) using ao_column; +CREATE TABLE + +INSERT INTO alter_type_aoco VALUES (20, 1, 2, 3); +INSERT 0 1 + +CREATE UNIQUE INDEX idx1 on alter_type_aoco(a,b); +CREATE INDEX +CREATE INDEX idx2 on alter_type_aoco using btree(c); +CREATE INDEX +CREATE INDEX idx3 on alter_type_aoco using bitmap(a,b,c,d); +CREATE INDEX + +EXECUTE capturerelfilenodebefore ('alter_column_b', 'idx1'); +INSERT 0 4 +EXECUTE capturerelfilenodebefore ('alter_column_b', 'idx2'); +INSERT 0 4 +EXECUTE capturerelfilenodebefore ('alter_column_b', 'idx3'); +INSERT 0 4 + +ALTER TABLE alter_type_aoco ALTER COLUMN b TYPE text; +ALTER TABLE + +EXECUTE checkrelfilenodediff ('alter_column_b', 'idx1'); + segid | casename | relname | rewritten +-------+----------------+---------+----------- + 2 | alter_column_b | idx1 | t + -1 | alter_column_b | idx1 | t + 0 | alter_column_b | idx1 | t + 1 | alter_column_b | idx1 | t +(4 rows) +EXECUTE checkrelfilenodediff ('alter_column_b', 'idx2'); + segid | casename | relname | rewritten +-------+----------------+---------+----------- + 2 | alter_column_b | idx2 | f + 0 | alter_column_b | idx2 | f + 1 | alter_column_b | idx2 | f + -1 | alter_column_b | idx2 | f +(4 rows) +EXECUTE checkrelfilenodediff ('alter_column_b', 'idx3'); + segid | casename | relname | rewritten +-------+----------------+---------+----------- + 2 | alter_column_b | idx3 | t + -1 | alter_column_b | idx3 | t + 0 | alter_column_b | idx3 | t + 1 | alter_column_b | idx3 | t +(4 rows) +INSERT INTO alter_type_aoco VALUES (20, '2', 3, 4); +INSERT 0 1 +EXECUTE capturerelfilenodebefore ('alter_column_c', 'idx1'); +INSERT 0 4 +EXECUTE capturerelfilenodebefore ('alter_column_c', 'idx2'); +INSERT 0 4 +EXECUTE capturerelfilenodebefore ('alter_column_c', 'idx3'); +INSERT 0 4 + +ALTER TABLE alter_type_aoco ALTER COLUMN c TYPE text; +ALTER TABLE + +EXECUTE checkrelfilenodediff ('alter_column_c', 'idx1'); + segid | casename | relname | rewritten +-------+----------------+---------+----------- + -1 | alter_column_c | idx1 | f + 2 | alter_column_c | idx1 | f + 0 | alter_column_c | idx1 | f + 1 | alter_column_c | idx1 | f +(4 rows) +EXECUTE checkrelfilenodediff ('alter_column_c', 'idx2'); + segid | casename | relname | rewritten +-------+----------------+---------+----------- + 2 | alter_column_c | idx2 | t + 0 | alter_column_c | idx2 | t + 1 | alter_column_c | idx2 | t + -1 | alter_column_c | idx2 | t +(4 rows) +EXECUTE checkrelfilenodediff ('alter_column_c', 'idx3'); + segid | casename | relname | rewritten +-------+----------------+---------+----------- + 0 | alter_column_c | idx3 | t + 1 | alter_column_c | idx3 | t + -1 | alter_column_c | idx3 | t + 2 | alter_column_c | idx3 | t +(4 rows) +INSERT INTO alter_type_aoco VALUES (20, '3', '4', 5); +INSERT 0 1 +EXECUTE capturerelfilenodebefore ('alter_column_d', 'idx1'); +INSERT 0 4 +EXECUTE capturerelfilenodebefore ('alter_column_d', 'idx2'); +INSERT 0 4 +EXECUTE capturerelfilenodebefore ('alter_column_d', 'idx3'); +INSERT 0 4 + +ALTER TABLE alter_type_aoco ALTER COLUMN d TYPE text; +ALTER TABLE + +EXECUTE checkrelfilenodediff ('alter_column_d', 'idx1'); + segid | casename | relname | rewritten +-------+----------------+---------+----------- + 2 | alter_column_d | idx1 | f + 0 | alter_column_d | idx1 | f + 1 | alter_column_d | idx1 | f + -1 | alter_column_d | idx1 | f +(4 rows) +EXECUTE checkrelfilenodediff ('alter_column_d', 'idx2'); + segid | casename | relname | rewritten +-------+----------------+---------+----------- + 0 | alter_column_d | idx2 | f + 1 | alter_column_d | idx2 | f + 2 | alter_column_d | idx2 | f + -1 | alter_column_d | idx2 | f +(4 rows) +EXECUTE checkrelfilenodediff ('alter_column_d', 'idx3'); + segid | casename | relname | rewritten +-------+----------------+---------+----------- + 0 | alter_column_d | idx3 | t + 1 | alter_column_d | idx3 | t + -1 | alter_column_d | idx3 | t + 2 | alter_column_d | idx3 | t +(4 rows) +INSERT INTO alter_type_aoco VALUES (20, '4', '5', '6'); +INSERT 0 1 +-- data is intact +SELECT * FROM alter_type_aoco; + a | b | c | d +----+---+---+--- + 20 | 1 | 2 | 3 + 20 | 2 | 3 | 4 + 20 | 3 | 4 | 5 + 20 | 4 | 5 | 6 +(4 rows) + + +-------------------------------------------------------------------------------- +-- Test if AT ALTER COLUMN TYPE for partitioned table + +-- create 2 level partitions with same schema (regular case) and create index on some column +-- alter column on the partition table root and on the partitions and we check rewrite status and data status +-- filenum for partition roots +-------------------------------------------------------------------------------- +CREATE TABLE part_alter_col(a int, b int, c int) PARTITION BY RANGE (A) (partition aa start (1) end (5) every (1)) USING ao_column; +CREATE TABLE +INSERT INTO part_alter_col VALUES (1,2,3); +INSERT 0 1 +CREATE INDEX part_alter_col_idx1 on part_alter_col(b); +CREATE INDEX +CREATE INDEX part_alter_col_idx2 on part_alter_col(c); +CREATE INDEX +EXECUTE capturerelfilenodebefore ('alter_column_b', 'part_alter_col_1_prt_aa_1'); +INSERT 0 4 +EXECUTE capturerelfilenodebefore ('alter_column_b', 'part_alter_col_1_prt_aa_1_b_idx'); +INSERT 0 4 +EXECUTE capturerelfilenodebefore ('alter_column_b', 'part_alter_col_1_prt_aa_1_c_idx'); +INSERT 0 4 +EXECUTE attribute_encoding_check ('part_alter_col'); + relname | attname | filenum | attoptions +----------------+---------+---------+------------------------------------------------------------- + part_alter_col | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + part_alter_col | b | 2 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + part_alter_col | c | 3 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(3 rows) + +ALTER TABLE part_alter_col ALTER COLUMN b TYPE text; +ALTER TABLE + +EXECUTE attribute_encoding_check ('part_alter_col'); + relname | attname | filenum | attoptions +----------------+---------+---------+------------------------------------------------------------- + part_alter_col | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + part_alter_col | c | 3 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + part_alter_col | b | 2 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(3 rows) +EXECUTE checkrelfilenodediff ('alter_column_b', 'part_alter_col_1_prt_aa_1'); + segid | casename | relname | rewritten +-------+----------------+---------------------------+----------- + 2 | alter_column_b | part_alter_col_1_prt_aa_1 | f + -1 | alter_column_b | part_alter_col_1_prt_aa_1 | f + 0 | alter_column_b | part_alter_col_1_prt_aa_1 | f + 1 | alter_column_b | part_alter_col_1_prt_aa_1 | f +(4 rows) +EXECUTE checkrelfilenodediff ('alter_column_b', 'part_alter_col_1_prt_aa_1_b_idx'); + segid | casename | relname | rewritten +-------+----------------+---------------------------------+----------- + 2 | alter_column_b | part_alter_col_1_prt_aa_1_b_idx | t + -1 | alter_column_b | part_alter_col_1_prt_aa_1_b_idx | t + 0 | alter_column_b | part_alter_col_1_prt_aa_1_b_idx | t + 1 | alter_column_b | part_alter_col_1_prt_aa_1_b_idx | t +(4 rows) +EXECUTE checkrelfilenodediff ('alter_column_b', 'part_alter_col_1_prt_aa_1_c_idx'); + segid | casename | relname | rewritten +-------+----------------+---------------------------------+----------- + -1 | alter_column_b | part_alter_col_1_prt_aa_1_c_idx | f + 2 | alter_column_b | part_alter_col_1_prt_aa_1_c_idx | f + 0 | alter_column_b | part_alter_col_1_prt_aa_1_c_idx | f + 1 | alter_column_b | part_alter_col_1_prt_aa_1_c_idx | f +(4 rows) +SELECT * FROM part_alter_col; + a | b | c +---+---+--- + 1 | 2 | 3 +(1 row) +DROP TABLE part_alter_col; +DROP TABLE +CHECKPOINT; +CHECKPOINT +-- check if all files are dropped correctly +SELECT * FROM gp_toolkit.gp_check_orphaned_files WHERE split_part(filename,'.',1) = (SELECT oid::text FROM pg_class WHERE relname = 'part_alter_col'); + gp_segment_id | tablespace | filename +---------------+------------+---------- +(0 rows) +-------------------------------------------------------------------------------- +-- Test if column rewrite works when AT ALTER COLUMN TYPE for a column +-- and then alter it back to the original type + +-- Check reloptions, pg_attribute_encoding, visimap, blkdirectory alongside the rewrite +-------------------------------------------------------------------------------- +CREATE TABLE alter_column_back(a int, b int ENCODING (compresstype='zlib', compresslevel=5), c int) using ao_column with (compresstype='zlib', compresslevel=2); +CREATE TABLE +INSERT INTO alter_column_back VALUES (1,2,3), (1,2,4), (1,2,5); +INSERT 0 3 +CREATE INDEX alter_column_back_idx1 ON alter_column_back(a,c); +CREATE INDEX +DELETE FROM alter_column_back WHERE c=5; +DELETE 1 +EXECUTE capturerelfilenodebefore ('alter_column', 'alter_column_back'); +INSERT 0 4 +SELECT atttypid::regtype FROM pg_attribute WHERE attrelid='alter_column_back'::regclass AND attname='b'; + atttypid +---------- + integer +(1 row) + +ALTER TABLE alter_column_back ALTER COLUMN b TYPE text; +ALTER TABLE + +SELECT c.relname, c.reloptions FROM pg_class c WHERE c.relname LIKE 'alter_column_back'; + relname | reloptions +-------------------+------------------------------------------------------------------------------ + alter_column_back | ['compresstype=zlib', 'compresslevel=2', 'blocksize=32768', 'checksum=true'] +(1 row) +EXECUTE checkrelfilenodediff ('alter_column', 'alter_column_back'); + segid | casename | relname | rewritten +-------+--------------+-------------------+----------- + 2 | alter_column | alter_column_back | f + 0 | alter_column | alter_column_back | f + 1 | alter_column | alter_column_back | f + -1 | alter_column | alter_column_back | f +(4 rows) +SELECT atttypid::regtype FROM pg_attribute WHERE attrelid='alter_column_back'::regclass AND attname='b'; + atttypid +---------- + text +(1 row) +INSERT INTO alter_column_back VALUES (1,'2',3); +INSERT 0 1 +DELETE FROM alter_column_back where c=4; +DELETE 1 +EXECUTE capturerelfilenodebefore ('alter_column_back', 'alter_column_back'); +INSERT 0 4 + +ALTER TABLE alter_column_back ALTER COLUMN b TYPE int using b::int; +ALTER TABLE + +SELECT c.relname, c.reloptions FROM pg_class c WHERE c.relname LIKE 'alter_column_back'; + relname | reloptions +-------------------+------------------------------------------------------------------------------ + alter_column_back | ['compresstype=zlib', 'compresslevel=2', 'blocksize=32768', 'checksum=true'] +(1 row) +EXECUTE attribute_encoding_check ('alter_column_back'); + relname | attname | filenum | attoptions +-------------------+---------+---------+------------------------------------------------------------- + alter_column_back | a | 1 | ['compresstype=zlib', 'compresslevel=2', 'blocksize=32768'] + alter_column_back | c | 3 | ['compresstype=zlib', 'compresslevel=2', 'blocksize=32768'] + alter_column_back | b | 2 | ['compresstype=zlib', 'compresslevel=5', 'blocksize=32768'] +(3 rows) +SELECT (gp_toolkit.__gp_aovisimap('alter_column_back')).* FROM gp_dist_random('gp_id'); + tid | segno | row_num +--------------+-------+--------- + (33554432,3) | 1 | 2 + (33554432,4) | 1 | 3 +(2 rows) +SELECT gp_segment_id, (gp_toolkit.__gp_aoblkdir('alter_column_back')).* FROM gp_dist_random('gp_id'); + gp_segment_id | tupleid | segno | columngroup_no | entry_no | first_row_no | file_offset | row_count +---------------+---------+-------+----------------+----------+--------------+-------------+----------- + 1 | (0,5) | 1 | 0 | 0 | 1 | 0 | 3 + 1 | (0,5) | 1 | 0 | 1 | 101 | 48 | 1 + 1 | (0,7) | 1 | 2 | 0 | 1 | 0 | 3 + 1 | (0,7) | 1 | 2 | 1 | 101 | 48 | 1 + 1 | (0,8) | 1 | 1 | 0 | 1 | 0 | 3 + 1 | (0,8) | 1 | 1 | 1 | 101 | 48 | 1 +(6 rows) +EXECUTE checkrelfilenodediff ('alter_column_back', 'alter_column_back'); + segid | casename | relname | rewritten +-------+-------------------+-------------------+----------- + 2 | alter_column_back | alter_column_back | f + 0 | alter_column_back | alter_column_back | f + 1 | alter_column_back | alter_column_back | f + -1 | alter_column_back | alter_column_back | f +(4 rows) +SELECT atttypid::regtype FROM pg_attribute WHERE attrelid='alter_column_back'::regclass AND attname='b'; + atttypid +---------- + integer +(1 row) +SELECT * FROM alter_column_back; + a | b | c +---+---+--- + 1 | 2 | 3 + 1 | 2 | 3 +(2 rows) +DROP TABLE alter_column_back; +DROP TABLE +CHECKPOINT; +CHECKPOINT +-- check if all files are dropped correctly +SELECT * FROM gp_toolkit.gp_check_orphaned_files WHERE split_part(filename,'.',1) = (SELECT oid::text FROM pg_class WHERE relname = 'alter_column_back'); + gp_segment_id | tablespace | filename +---------------+------------+---------- +(0 rows) + +-------------------------------------------------------------------------------- +-- Test if ALTER COLUMN TYPE and SET ACCESS METHOD can be done in the same command +-- Verify if we rewrite the table +-------------------------------------------------------------------------------- +CREATE TABLE alter_column_set_am(a int, b int, c int) using ao_column; +CREATE TABLE +INSERT INTO alter_column_set_am VALUES (1,2,3); +INSERT 0 1 +EXECUTE capturerelfilenodebefore ('alter_column_set_am_aorow', 'alter_column_set_am'); +INSERT 0 4 +EXECUTE attribute_encoding_check ('alter_column_set_am'); + relname | attname | filenum | attoptions +---------------------+---------+---------+------------------------------------------------------------- + alter_column_set_am | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_column_set_am | b | 2 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_column_set_am | c | 3 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(3 rows) + +ALTER TABLE alter_column_set_am SET ACCESS METHOD ao_row, ALTER COLUMN b TYPE text; +ALTER TABLE + +EXECUTE attribute_encoding_check ('alter_column_set_am'); + relname | attname | filenum | attoptions +---------+---------+---------+------------ +(0 rows) +EXECUTE checkrelfilenodediff ('alter_column_set_am_aorow', 'alter_column_set_am'); + segid | casename | relname | rewritten +-------+---------------------------+---------------------+----------- + -1 | alter_column_set_am_aorow | alter_column_set_am | t + 2 | alter_column_set_am_aorow | alter_column_set_am | t + 0 | alter_column_set_am_aorow | alter_column_set_am | t + 1 | alter_column_set_am_aorow | alter_column_set_am | t +(4 rows) +SELECT * FROM alter_column_set_am; + a | b | c +---+---+--- + 1 | 2 | 3 +(1 row) +INSERT INTO alter_column_set_am VALUES (1,'2',3); +INSERT 0 1 +EXECUTE capturerelfilenodebefore ('alter_column_set_am_aocol', 'alter_column_set_am'); +INSERT 0 4 +EXECUTE attribute_encoding_check ('alter_column_set_am'); + relname | attname | filenum | attoptions +---------+---------+---------+------------ +(0 rows) + +ALTER TABLE alter_column_set_am SET ACCESS METHOD ao_column, ALTER COLUMN c TYPE text; +ALTER TABLE + +EXECUTE attribute_encoding_check ('alter_column_set_am'); + relname | attname | filenum | attoptions +---------------------+---------+---------+------------------------------------------------------------- + alter_column_set_am | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_column_set_am | b | 2 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_column_set_am | c | 3 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(3 rows) +EXECUTE checkrelfilenodediff ('alter_column_set_am_aocol', 'alter_column_set_am'); + segid | casename | relname | rewritten +-------+---------------------------+---------------------+----------- + -1 | alter_column_set_am_aocol | alter_column_set_am | t + 2 | alter_column_set_am_aocol | alter_column_set_am | t + 0 | alter_column_set_am_aocol | alter_column_set_am | t + 1 | alter_column_set_am_aocol | alter_column_set_am | t +(4 rows) +SELECT * FROM alter_column_set_am; + a | b | c +---+---+--- + 1 | 2 | 3 + 1 | 2 | 3 +(2 rows) + +-------------------------------------------------------------------------------- +-- Test if ALTER COLUMN TYPE and ADD COLUMN can be done in the same command +-- Verify if we don't rewrite the table +-------------------------------------------------------------------------------- +CREATE TABLE alter_column_add_col(a int, b int, c int) using ao_column; +CREATE TABLE +INSERT INTO alter_column_add_col VALUES (1,2,3); +INSERT 0 1 +EXECUTE capturerelfilenodebefore ('alter_col_add_col', 'alter_column_add_col'); +INSERT 0 4 +EXECUTE attribute_encoding_check ('alter_column_add_col'); + relname | attname | filenum | attoptions +----------------------+---------+---------+------------------------------------------------------------- + alter_column_add_col | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_column_add_col | b | 2 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_column_add_col | c | 3 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(3 rows) + +ALTER TABLE alter_column_add_col ADD COLUMN d int, ALTER COLUMN b TYPE text; +ALTER TABLE + +EXECUTE attribute_encoding_check ('alter_column_add_col'); + relname | attname | filenum | attoptions +----------------------+---------+---------+------------------------------------------------------------- + alter_column_add_col | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_column_add_col | c | 3 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_column_add_col | b | 1602 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_column_add_col | d | 4 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(4 rows) +EXECUTE checkrelfilenodediff ('alter_column_add_col', 'alter_column_add_col'); + segid | casename | relname | rewritten +-------+----------+---------+----------- +(0 rows) +SELECT * FROM alter_column_add_col; + a | b | c | d +---+---+---+--- + 1 | 2 | 3 | +(1 row) +INSERT INTO alter_column_add_col VALUES (1,'2',3, 4); +INSERT 0 1 +SELECT * FROM alter_column_add_col; + a | b | c | d +---+---+---+--- + 1 | 2 | 3 | + 1 | 2 | 3 | 4 +(2 rows) + +-------------------------------------------------------------------------------- +-- Test if ALTER COLUMN TYPE and other AT commands can be done in the same command +-- Verify if we rewrite the table +-------------------------------------------------------------------------------- +CREATE TABLE alter_column_other(a int, b int, c int) using ao_column; +CREATE TABLE +INSERT INTO alter_column_other VALUES (1,2,3); +INSERT 0 1 +EXECUTE capturerelfilenodebefore ('alter_column_other', 'alter_column_other'); +INSERT 0 4 +EXECUTE attribute_encoding_check ('alter_column_other'); + relname | attname | filenum | attoptions +--------------------+---------+---------+------------------------------------------------------------- + alter_column_other | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_column_other | b | 2 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_column_other | c | 3 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(3 rows) + +ALTER TABLE alter_column_other ALTER COLUMN b TYPE text, ALTER COLUMN c SET DEFAULT 5; +ALTER TABLE + +EXECUTE attribute_encoding_check ('alter_column_other'); + relname | attname | filenum | attoptions +--------------------+---------+---------+------------------------------------------------------------- + alter_column_other | b | 2 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_column_other | c | 3 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + alter_column_other | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(3 rows) +EXECUTE checkrelfilenodediff ('alter_column_other', 'alter_column_other'); + segid | casename | relname | rewritten +-------+--------------------+--------------------+----------- + 2 | alter_column_other | alter_column_other | t + -1 | alter_column_other | alter_column_other | t + 0 | alter_column_other | alter_column_other | t + 1 | alter_column_other | alter_column_other | t +(4 rows) +SELECT * FROM alter_column_other; + a | b | c +---+---+--- + 1 | 2 | 3 +(1 row) +INSERT INTO alter_column_other VALUES (1,'2'); +INSERT 0 1 +SELECT * FROM alter_column_other; + a | b | c +---+---+--- + 1 | 2 | 3 + 1 | 2 | 5 +(2 rows) + +-------------------------------------------------------------------------------- +-- Test if column rewrite works after vacuum on deleted rows +-------------------------------------------------------------------------------- +CREATE TABLE alter_column_vacuum(a int, b int) using ao_column; +CREATE TABLE +INSERT INTO alter_column_vacuum SELECT 1,i FROM generate_series(1,1000)i; +INSERT 0 1000 +DELETE FROM alter_column_vacuum WHERE b>10; +DELETE 990 +VACUUM alter_column_vacuum; +VACUUM +SELECT * FROM gp_toolkit.__gp_aocsseg('alter_column_vacuum'); + segment_id | segno | column_num | physical_segno | tupcount | eof | eof_uncompressed | modcount | formatversion | state +------------+-------+------------+----------------+----------+-----+------------------+----------+---------------+------- + 1 | 1 | 0 | 1 | 0 | 0 | 0 | 2 | 3 | 1 + 1 | 1 | 1 | 129 | 0 | 0 | 0 | 2 | 3 | 1 + 1 | 2 | 0 | 2 | 10 | 80 | 80 | 0 | 3 | 1 + 1 | 2 | 1 | 130 | 10 | 80 | 80 | 0 | 3 | 1 +(4 rows) +-- should succeed +ALTER TABLE alter_column_vacuum ALTER COLUMN b TYPE text; +ALTER TABLE +SELECT * FROM gp_toolkit.__gp_aocsseg('alter_column_vacuum'); + segment_id | segno | column_num | physical_segno | tupcount | eof | eof_uncompressed | modcount | formatversion | state +------------+-------+------------+----------------+----------+-----+------------------+----------+---------------+------- + 1 | 1 | 0 | 1 | 0 | 0 | 0 | 2 | 3 | 1 + 1 | 1 | 1 | 204929 | 0 | 0 | 0 | 2 | 3 | 1 + 1 | 2 | 0 | 2 | 10 | 80 | 80 | 1 | 3 | 1 + 1 | 2 | 1 | 204930 | 10 | 64 | 64 | 1 | 3 | 1 +(4 rows) + +-------------------------------------------------------------------------------- +-- Test if ALTER COLUMN TYPE works correctly when constraints are involved +-------------------------------------------------------------------------------- +CREATE TABLE alter_column_constraints(a int, b int check (b > 0)) USING ao_column; +CREATE TABLE +INSERT INTO alter_column_constraints SELECT i,i FROM generate_series(1,10)i; +INSERT 0 10 +-- should error +ALTER TABLE alter_column_constraints ALTER COLUMN b TYPE text; +ERROR: operator does not exist: text > integer +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +-- should succeed, and constraint remains +EXECUTE capturerelfilenodebefore ('alter_column_constraints_col_rewrite', 'alter_column_constraints'); +INSERT 0 4 +ALTER TABLE alter_column_constraints ALTER COLUMN b TYPE bigint; +ALTER TABLE +EXECUTE checkrelfilenodediff ('alter_column_constraints_col_rewrite', 'alter_column_constraints'); + segid | casename | relname | rewritten +-------+--------------------------------------+--------------------------+----------- + 2 | alter_column_constraints_col_rewrite | alter_column_constraints | f + -1 | alter_column_constraints_col_rewrite | alter_column_constraints | f + 0 | alter_column_constraints_col_rewrite | alter_column_constraints | f + 1 | alter_column_constraints_col_rewrite | alter_column_constraints | f +(4 rows) + +EXECUTE capturerelfilenodebefore ('alter_column_constraints_fullrewrite', 'alter_column_constraints'); +INSERT 0 4 +-- should succeed and relfile changed (not using the column rewrite optimization because there's other command) +ALTER TABLE alter_column_constraints ADD CONSTRAINT checkb2 CHECK (b < 100), ALTER COLUMN b TYPE int; +ALTER TABLE +EXECUTE checkrelfilenodediff ('alter_column_constraints_fullrewrite', 'alter_column_constraints'); + segid | casename | relname | rewritten +-------+--------------------------------------+--------------------------+----------- + -1 | alter_column_constraints_fullrewrite | alter_column_constraints | t + 0 | alter_column_constraints_fullrewrite | alter_column_constraints | t + 1 | alter_column_constraints_fullrewrite | alter_column_constraints | t + 2 | alter_column_constraints_fullrewrite | alter_column_constraints | t +(4 rows) + +-------------------------------------------------------------------------------- +-- Test if ALTER COLUMN TYPE works correctly when seg0 has some data +-- Check if we handle rewrite on seg0 +-------------------------------------------------------------------------------- +CREATE TABLE alter_column_seg0(a int, b int) USING ao_column; +CREATE TABLE +1: BEGIN; +BEGIN +1: ALTER TABLE alter_column_seg0 ADD COLUMN c int; +ALTER TABLE +1: INSERT INTO alter_column_seg0 SELECT 1,i,i FROM generate_series(1,10)i; +INSERT 0 10 +1: COMMIT; +COMMIT +INSERT INTO alter_column_seg0 SELECT 1,i,i FROM generate_series(1,10)i; +INSERT 0 10 +ALTER TABLE alter_column_seg0 ALTER COLUMN b TYPE text; +ALTER TABLE +SELECT count(*) FROM alter_column_seg0; + count +------- + 20 +(1 row) +SELECT * FROM gp_toolkit.__gp_aocsseg('alter_column_seg0'); + segment_id | segno | column_num | physical_segno | tupcount | eof | eof_uncompressed | modcount | formatversion | state +------------+-------+------------+----------------+----------+-----+------------------+----------+---------------+------- + 1 | 0 | 0 | 0 | 10 | 80 | 80 | 2 | 3 | 1 + 1 | 0 | 1 | 204928 | 10 | 64 | 64 | 2 | 3 | 1 + 1 | 0 | 2 | 256 | 10 | 80 | 80 | 2 | 3 | 1 + 1 | 1 | 0 | 1 | 10 | 80 | 80 | 2 | 3 | 1 + 1 | 1 | 1 | 204929 | 10 | 64 | 64 | 2 | 3 | 1 + 1 | 1 | 2 | 257 | 10 | 80 | 80 | 2 | 3 | 1 +(6 rows) +DROP TABLE alter_column_seg0; +DROP TABLE +CHECKPOINT; +CHECKPOINT +SELECT * FROM gp_toolkit.gp_check_orphaned_files WHERE split_part(filename,'.',1) = (SELECT oid::text FROM pg_class WHERE relname = 'alter_column_seg0'); + gp_segment_id | tablespace | filename +---------------+------------+---------- +(0 rows) + +-------------------------------------------------------------------------------- +-- Test if ALTER COLUMN TYPE works correctly multiple segfiles are created +-- due to multiple concurrency +-- Check if we handle rewrite on each segfile correctly +-------------------------------------------------------------------------------- +CREATE TABLE alter_column_multiple_concurrency(a int, b int) USING ao_column; +CREATE TABLE +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: INSERT INTO alter_column_multiple_concurrency SELECT 1,i FROM generate_series(1,10)i; +INSERT 0 10 +2: INSERT INTO alter_column_multiple_concurrency SELECT 1,i FROM generate_series(1,10)i; +INSERT 0 10 +1: COMMIT; +COMMIT +2: COMMIT; +COMMIT +ALTER TABLE alter_column_multiple_concurrency ALTER COLUMN b TYPE text; +ALTER TABLE +SELECT count(*) FROM alter_column_multiple_concurrency; + count +------- + 20 +(1 row) +SELECT * FROM gp_toolkit.__gp_aocsseg('alter_column_multiple_concurrency'); + segment_id | segno | column_num | physical_segno | tupcount | eof | eof_uncompressed | modcount | formatversion | state +------------+-------+------------+----------------+----------+-----+------------------+----------+---------------+------- + 1 | 1 | 0 | 1 | 10 | 80 | 80 | 2 | 3 | 1 + 1 | 1 | 1 | 204929 | 10 | 64 | 64 | 2 | 3 | 1 + 1 | 2 | 0 | 2 | 10 | 80 | 80 | 2 | 3 | 1 + 1 | 2 | 1 | 204930 | 10 | 64 | 64 | 2 | 3 | 1 +(4 rows) +DROP TABLE alter_column_multiple_concurrency; +DROP TABLE +CHECKPOINT; +CHECKPOINT +SELECT * FROM gp_toolkit.gp_check_orphaned_files WHERE split_part(filename,'.',1) = (SELECT oid::text FROM pg_class WHERE relname = 'alter_column_multiple_concurrency'); + gp_segment_id | tablespace | filename +---------------+------------+---------- +(0 rows) + +-------------------------------------------------------------------------------- +-- Test if ALTER COLUMN TYPE works correctly when a segfile is in AWAITING_DROP state +-- Check if we handle rewrite on each segfile correctly +-------------------------------------------------------------------------------- +CREATE TABLE alter_column_awaiting_drop(a int, b int) USING ao_column; +CREATE TABLE +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: INSERT INTO alter_column_awaiting_drop SELECT 1,i FROM generate_series(1,10)i; +INSERT 0 10 +2: INSERT INTO alter_column_awaiting_drop SELECT 1,i FROM generate_series(11,20)i; +INSERT 0 10 +1: COMMIT; +COMMIT +2: COMMIT; +COMMIT +DELETE FROM alter_column_awaiting_drop WHERE b > 10; +DELETE 10 +VACUUM alter_column_awaiting_drop; +VACUUM +SELECT * FROM gp_toolkit.__gp_aocsseg('alter_column_awaiting_drop'); + segment_id | segno | column_num | physical_segno | tupcount | eof | eof_uncompressed | modcount | formatversion | state +------------+-------+------------+----------------+----------+-----+------------------+----------+---------------+------- + 1 | 1 | 0 | 1 | 10 | 80 | 80 | 2 | 3 | 1 + 1 | 1 | 1 | 129 | 10 | 80 | 80 | 2 | 3 | 1 + 1 | 2 | 0 | 2 | 0 | 0 | 0 | 1 | 3 | 1 + 1 | 2 | 1 | 130 | 0 | 0 | 0 | 1 | 3 | 1 + 1 | 3 | 0 | 3 | 0 | 0 | 0 | 0 | 3 | 1 + 1 | 3 | 1 | 131 | 0 | 0 | 0 | 0 | 3 | 1 +(6 rows) +ALTER TABLE alter_column_awaiting_drop ALTER COLUMN b TYPE text; +ALTER TABLE +SELECT count(*) FROM alter_column_awaiting_drop; + count +------- + 10 +(1 row) +SELECT * FROM gp_toolkit.__gp_aocsseg('alter_column_awaiting_drop'); + segment_id | segno | column_num | physical_segno | tupcount | eof | eof_uncompressed | modcount | formatversion | state +------------+-------+------------+----------------+----------+-----+------------------+----------+---------------+------- + 1 | 1 | 0 | 1 | 10 | 80 | 80 | 3 | 3 | 1 + 1 | 1 | 1 | 204929 | 10 | 64 | 64 | 3 | 3 | 1 + 1 | 2 | 0 | 2 | 0 | 0 | 0 | 1 | 3 | 1 + 1 | 2 | 1 | 204930 | 0 | 0 | 0 | 1 | 3 | 1 + 1 | 3 | 0 | 3 | 0 | 0 | 0 | 0 | 3 | 1 + 1 | 3 | 1 | 204931 | 0 | 0 | 0 | 0 | 3 | 1 +(6 rows) +DROP TABLE alter_column_awaiting_drop; +DROP TABLE +CHECKPOINT; +CHECKPOINT +SELECT * FROM gp_toolkit.gp_check_orphaned_files WHERE split_part(filename,'.',1) = (SELECT oid::text FROM pg_class WHERE relname = 'alter_column_awaiting_drop'); + gp_segment_id | tablespace | filename +---------------+------------+---------- +(0 rows) + +-------------------------------------------------------------------------------- +-- Test if ALTER COLUMN TYPE works correctly for 0 inserted rows +-------------------------------------------------------------------------------- +CREATE TABLE alter_column_zero_tupcount(a int, b int) USING ao_column; +CREATE TABLE +1: BEGIN; +BEGIN +2: BEGIN; +BEGIN +1: INSERT INTO alter_column_zero_tupcount SELECT 1,i FROM generate_series(1,10)i; +INSERT 0 10 +2: INSERT INTO alter_column_zero_tupcount SELECT 1,i FROM generate_series(1,10)i; +INSERT 0 10 +1: ABORT; +ROLLBACK +2: ABORT; +ROLLBACK +ALTER TABLE alter_column_zero_tupcount ALTER COLUMN b TYPE text; +ALTER TABLE +SELECT count(*) FROM alter_column_zero_tupcount; + count +------- + 0 +(1 row) +SELECT * FROM gp_toolkit.__gp_aocsseg('alter_column_zero_tupcount'); + segment_id | segno | column_num | physical_segno | tupcount | eof | eof_uncompressed | modcount | formatversion | state +------------+-------+------------+----------------+----------+-----+------------------+----------+---------------+------- + 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 3 | 1 + 1 | 1 | 1 | 204929 | 0 | 0 | 0 | 0 | 3 | 1 + 1 | 2 | 0 | 2 | 0 | 0 | 0 | 0 | 3 | 1 + 1 | 2 | 1 | 204930 | 0 | 0 | 0 | 0 | 3 | 1 +(4 rows) +DROP TABLE alter_column_zero_tupcount; +DROP TABLE +CHECKPOINT; +CHECKPOINT +SELECT * FROM gp_toolkit.gp_check_orphaned_files WHERE split_part(filename,'.',1) = (SELECT oid::text FROM pg_class WHERE relname = 'alter_column_zero_tupcount'); + gp_segment_id | tablespace | filename +---------------+------------+---------- +(0 rows) + +-------------------------------------------------------------------------------- +-- Test if ALTER COLUMN TYPE works correctly for generated columns. +-- Check if we error out on ALTERing type columns that have dependent generated columns +-------------------------------------------------------------------------------- +CREATE TABLE alter_column_generated_cols(a int, b int, c int GENERATED ALWAYS AS (a+b) STORED, d int GENERATED ALWAYS AS (tableoid::regclass) STORED) USING ao_column; +CREATE TABLE +INSERT INTO alter_column_generated_cols SELECT 1,i FROM generate_series(1,5)i; +INSERT 0 5 +SELECT attname, atttypid::regtype FROM pg_attribute WHERE attrelid='alter_column_generated_cols'::regclass and attname in ('b','c','d'); + attname | atttypid +---------+---------- + b | integer + c | integer + d | integer +(3 rows) +-- b shouldn't be allowed for alter type +ALTER TABLE alter_column_generated_cols ALTER COLUMN b TYPE text; +ERROR: cannot alter type of a column used by a generated column +DETAIL: Column "b" is used by generated column "c". +SELECT attname, atttypid::regtype FROM pg_attribute WHERE attrelid='alter_column_generated_cols'::regclass and attname in ('b','c','d'); + attname | atttypid +---------+---------- + b | integer + c | integer + d | integer +(3 rows) +ALTER TABLE alter_column_generated_cols ALTER COLUMN c TYPE text; +ALTER TABLE +SELECT attname, atttypid::regtype FROM pg_attribute WHERE attrelid='alter_column_generated_cols'::regclass and attname in ('b','c','d'); + attname | atttypid +---------+---------- + b | integer + c | text + d | integer +(3 rows) +ALTER TABLE alter_column_generated_cols ALTER COLUMN d TYPE text; +ALTER TABLE +SELECT attname, atttypid::regtype FROM pg_attribute WHERE attrelid='alter_column_generated_cols'::regclass and attname in ('b','c','d'); + attname | atttypid +---------+---------- + b | integer + c | text + d | text +(3 rows) + +-------------------------------------------------------------------------------- +-- Test if ALTER COLUMN TYPE blocks concurrent INSERT, and vice versa +-------------------------------------------------------------------------------- +CREATE TABLE aoco_concurrent_inserts(a int, b int, c int) USING ao_column; +CREATE TABLE +INSERT INTO aoco_concurrent_inserts SELECT i,i,i FROM generate_series(1,10)i; +INSERT 0 10 +1: BEGIN; +BEGIN +1: INSERT INTO aoco_concurrent_inserts SELECT i,i,i FROM generate_series(1,10)i; +INSERT 0 10 +2&: ALTER TABLE aoco_concurrent_inserts ALTER COLUMN b TYPE text; +1: END; +COMMIT +2<: <... completed> +ALTER TABLE +-- should see 20 rows +SELECT count(*) FROM aoco_concurrent_inserts; + count +------- + 20 +(1 row) +1: BEGIN; +BEGIN +1: ALTER TABLE aoco_concurrent_inserts ALTER COLUMN c TYPE text; +ALTER TABLE +2&: INSERT INTO aoco_concurrent_inserts SELECT i,i,i FROM generate_series(1,10)i; +1: END; +COMMIT +2<: <... completed> +INSERT 0 10 +-- should see 30 rows +SELECT count(*) FROM aoco_concurrent_inserts; + count +------- + 30 +(1 row) + +-------------------------------------------------------------------------------- +-- Tests for ALTER COLUMN SET ENCODING +-------------------------------------------------------------------------------- + +-- +-- Basic testing +-- +create table atsetenc(c1 int, c2 int) using ao_column distributed replicated; +CREATE TABLE +-- first check an empty table +-- check the initial encoding settings +execute attribute_encoding_check('atsetenc'); + relname | attname | filenum | attoptions +----------+---------+---------+------------------------------------------------------------- + atsetenc | c1 | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + atsetenc | c2 | 2 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(2 rows) +-- no table rewrite +execute capturerelfilenodebefore('set encoding - empty', 'atsetenc'); +INSERT 0 4 +alter table atsetenc alter column c1 set encoding (compresstype=zlib,compresslevel=9); +ALTER TABLE +execute checkrelfilenodediff('set encoding - empty', 'atsetenc'); + segid | casename | relname | rewritten +-------+----------------------+----------+----------- + 0 | set encoding - empty | atsetenc | f + 1 | set encoding - empty | atsetenc | f + 2 | set encoding - empty | atsetenc | f + -1 | set encoding - empty | atsetenc | f +(4 rows) +execute attribute_encoding_check('atsetenc'); + relname | attname | filenum | attoptions +----------+---------+---------+------------------------------------------------------------- + atsetenc | c1 | 1601 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | c2 | 2 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(2 rows) +select * from atsetenc; + c1 | c2 +----+---- +(0 rows) + +-- now insert some data and check +insert into atsetenc values(1,2); +INSERT 0 1 +-- no table rewrite setting encoding +execute capturerelfilenodebefore('set encoding - basic', 'atsetenc'); +INSERT 0 4 +alter table atsetenc alter column c2 set encoding (compresstype=zlib,compresslevel=9); +ALTER TABLE +-- result intact +select * from atsetenc; + c1 | c2 +----+---- + 1 | 2 +(1 row) +execute checkrelfilenodediff('set encoding - basic', 'atsetenc'); + segid | casename | relname | rewritten +-------+----------------------+----------+----------- + 0 | set encoding - basic | atsetenc | f + 1 | set encoding - basic | atsetenc | f + -1 | set encoding - basic | atsetenc | f + 2 | set encoding - basic | atsetenc | f +(4 rows) +execute attribute_encoding_check('atsetenc'); + relname | attname | filenum | attoptions +----------+---------+---------+------------------------------------------------------------- + atsetenc | c1 | 1601 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | c2 | 1602 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] +(2 rows) + +-- check if the encoding takes actual effect +alter table atsetenc add column c3 text default 'a'; +ALTER TABLE +insert into atsetenc values (1,2,repeat('a',10000)); +INSERT 0 1 +-- before alter encoding, no compression by default +execute attribute_encoding_check('atsetenc'); + relname | attname | filenum | attoptions +----------+---------+---------+------------------------------------------------------------- + atsetenc | c1 | 1601 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | c2 | 1602 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | c3 | 3 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(3 rows) +select relname, attnum, size, compression_ratio from gp_toolkit.gp_column_size where relid::regclass::text = 'atsetenc' and gp_segment_id = 0 and attnum = 3; + relname | attnum | size | compression_ratio +----------+--------+-------+------------------- + atsetenc | 3 | 10096 | 1.00 +(1 row) +execute capturerelfilenodebefore('set encoding - compress effect', 'atsetenc'); +INSERT 0 4 +alter table atsetenc alter column c3 set encoding (compresstype=zlib,compresslevel=9); +ALTER TABLE +execute capturerelfilenodebefore('set encoding - compress effect', 'atsetenc'); +INSERT 0 4 +-- after alter encoding, size is reduced +execute attribute_encoding_check('atsetenc'); + relname | attname | filenum | attoptions +----------+---------+---------+------------------------------------------------------------- + atsetenc | c1 | 1601 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | c2 | 1602 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | c3 | 1603 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] +(3 rows) +select relname,attnum,size,compression_ratio from gp_toolkit.gp_column_size where relid::regclass::text = 'atsetenc' and gp_segment_id = 0 and attnum = 3; + relname | attnum | size | compression_ratio +----------+--------+------+------------------- + atsetenc | 3 | 120 | 84.13 +(1 row) +select length(c3) from atsetenc; + length +-------- + 1 + 10000 +(2 rows) + +-- check if we'll re-index the index for the rewritten column, and not others +create index atsetenc_idx2 on atsetenc(c2); +CREATE INDEX +create index atsetenc_idx3 on atsetenc(c3); +CREATE INDEX +execute capturerelfilenodebefore ('alter_column_c2', 'atsetenc_idx2'); +INSERT 0 4 +execute capturerelfilenodebefore ('alter_column_c2', 'atsetenc_idx3'); +INSERT 0 4 +alter table atsetenc alter column c2 set encoding (compresstype=zlib,compresslevel=1); +ALTER TABLE +execute checkrelfilenodediff('alter_column_c2', 'atsetenc_idx2'); + segid | casename | relname | rewritten +-------+-----------------+---------------+----------- + -1 | alter_column_c2 | atsetenc_idx2 | t + 2 | alter_column_c2 | atsetenc_idx2 | t + 0 | alter_column_c2 | atsetenc_idx2 | t + 1 | alter_column_c2 | atsetenc_idx2 | t +(4 rows) +execute checkrelfilenodediff('alter_column_c2', 'atsetenc_idx3'); + segid | casename | relname | rewritten +-------+-----------------+---------------+----------- + 2 | alter_column_c2 | atsetenc_idx3 | f + -1 | alter_column_c2 | atsetenc_idx3 | f + 0 | alter_column_c2 | atsetenc_idx3 | f + 1 | alter_column_c2 | atsetenc_idx3 | f +(4 rows) + +-- +-- mixed AT commands +-- +-- 1. with ALTER COLUMN TYPE +alter table atsetenc add column c4 int default 4, add column c5 int default 5; +ALTER TABLE +execute capturerelfilenodebefore('set encoding - withaltercoltype', 'atsetenc'); +INSERT 0 4 +-- alter column type + alter column set encoding. The subcommands' order shouldn't matter. +alter table atsetenc alter column c4 type text, alter column c4 set encoding (compresstype=zlib,compresslevel=9); +ALTER TABLE +alter table atsetenc alter column c5 set encoding (compresstype=zlib,compresslevel=9), alter column c5 type text; +ALTER TABLE +-- no rewrite +execute checkrelfilenodediff('set encoding - withaltercoltype', 'atsetenc'); + segid | casename | relname | rewritten +-------+---------------------------------+----------+----------- + 2 | set encoding - withaltercoltype | atsetenc | f + 0 | set encoding - withaltercoltype | atsetenc | f + 1 | set encoding - withaltercoltype | atsetenc | f + -1 | set encoding - withaltercoltype | atsetenc | f +(4 rows) +execute attribute_encoding_check('atsetenc'); + relname | attname | filenum | attoptions +----------+---------+---------+------------------------------------------------------------- + atsetenc | c1 | 1601 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | c2 | 2 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=1'] + atsetenc | c3 | 1603 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | c4 | 1604 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | c5 | 1605 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] +(5 rows) +select c4, c5 from atsetenc; + c4 | c5 +----+---- + 4 | 5 + 4 | 5 +(2 rows) + +-- 2. with ADD COLUMN +execute capturerelfilenodebefore('set encoding - withaddcol', 'atsetenc'); +INSERT 0 4 +alter table atsetenc add column c6 int default 6, alter column c5 set encoding (compresstype=zlib,compresslevel=1); +ALTER TABLE +-- no rewrite +execute checkrelfilenodediff('set encoding - withaddcol', 'atsetenc'); + segid | casename | relname | rewritten +-------+---------------------------+----------+----------- + 0 | set encoding - withaddcol | atsetenc | f + 1 | set encoding - withaddcol | atsetenc | f + 2 | set encoding - withaddcol | atsetenc | f + -1 | set encoding - withaddcol | atsetenc | f +(4 rows) +execute attribute_encoding_check('atsetenc'); + relname | attname | filenum | attoptions +----------+---------+---------+------------------------------------------------------------- + atsetenc | c1 | 1601 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | c2 | 2 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=1'] + atsetenc | c3 | 1603 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | c4 | 1604 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | c5 | 5 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=1'] + atsetenc | c6 | 6 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] +(6 rows) +select c5, c6 from atsetenc; + c5 | c6 +----+---- + 5 | 6 + 5 | 6 +(2 rows) + +-- 3. with DROP COLUMN +alter table atsetenc add column c7 int default 7; +ALTER TABLE +execute capturerelfilenodebefore('set encoding - withdropcol', 'atsetenc'); +INSERT 0 4 +-- alter and drop the same column, should complaint +alter table atsetenc alter column c7 set encoding (compresstype=zlib,compresslevel=9), drop column c7; +ERROR: column "c7" of relation "atsetenc" does not exist +-- alter and drop different columns, should work and no rewrite +alter table atsetenc alter column c7 set encoding (compresstype=zlib,compresslevel=9), drop column c3; +ALTER TABLE +execute checkrelfilenodediff('set encoding - withdropcol', 'atsetenc'); + segid | casename | relname | rewritten +-------+----------------------------+----------+----------- + 0 | set encoding - withdropcol | atsetenc | f + 1 | set encoding - withdropcol | atsetenc | f + 2 | set encoding - withdropcol | atsetenc | f + -1 | set encoding - withdropcol | atsetenc | f +(4 rows) +execute attribute_encoding_check('atsetenc'); + relname | attname | filenum | attoptions +----------+------------------------------+---------+------------------------------------------------------------- + atsetenc | c1 | 1601 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | c2 | 2 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=1'] + atsetenc | c4 | 1604 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | c5 | 5 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=1'] + atsetenc | c6 | 6 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + atsetenc | c7 | 1607 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | ........pg.dropped.3........ | 1603 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] +(7 rows) +-- should error out +select c3 from atsetenc; +ERROR: column "c3" does not exist +LINE 1: select c3 from atsetenc; + ^ +select c7 from atsetenc; + c7 +---- + 7 + 7 +(2 rows) + +-- 4. with AT commands that rewrite table +alter table atsetenc add column c8 int default 8; +ALTER TABLE +-- changing to another AM, should complaint +alter table atsetenc set access method heap, alter column c8 set encoding (compresstype=zlib,compresslevel=9); +ERROR: ALTER COLUMN SET ENCODING operation is only applicable to AOCO tables +DETAIL: New access method for "atsetenc" is not ao_column +-- reorganize, should rewrite +execute capturerelfilenodebefore('set encoding - reorg', 'atsetenc'); +INSERT 0 4 +alter table atsetenc set with (reorganize=true), alter column c8 set encoding (compresstype=zlib,compresslevel=9); +ALTER TABLE +execute checkrelfilenodediff('set encoding - reorg', 'atsetenc'); + segid | casename | relname | rewritten +-------+----------------------+----------+----------- + 2 | set encoding - reorg | atsetenc | t + -1 | set encoding - reorg | atsetenc | t + 0 | set encoding - reorg | atsetenc | t + 1 | set encoding - reorg | atsetenc | t +(4 rows) +execute attribute_encoding_check('atsetenc'); + relname | attname | filenum | attoptions +----------+------------------------------+---------+------------------------------------------------------------- + atsetenc | c1 | 1 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | c2 | 2 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=1'] + atsetenc | c4 | 4 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | c5 | 5 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=1'] + atsetenc | c6 | 6 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + atsetenc | c7 | 7 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | c8 | 8 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | ........pg.dropped.3........ | 3 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] +(8 rows) + +-- 5. multiple SET ENCODING commands +-- not rewrite +execute capturerelfilenodebefore('set encoding - multiple', 'atsetenc'); +INSERT 0 4 +alter table atsetenc alter column c7 set encoding (compresstype=rle_type,compresslevel=3), alter column c8 set encoding (compresstype=rle_type,compresslevel=4); +ALTER TABLE +execute checkrelfilenodediff('set encoding - multiple', 'atsetenc'); + segid | casename | relname | rewritten +-------+-------------------------+----------+----------- + 0 | set encoding - multiple | atsetenc | f + 1 | set encoding - multiple | atsetenc | f + -1 | set encoding - multiple | atsetenc | f + 2 | set encoding - multiple | atsetenc | f +(4 rows) +execute attribute_encoding_check('atsetenc'); + relname | attname | filenum | attoptions +----------+------------------------------+---------+----------------------------------------------------------------- + atsetenc | c1 | 1 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | c2 | 2 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=1'] + atsetenc | c4 | 4 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | c5 | 5 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=1'] + atsetenc | ........pg.dropped.3........ | 3 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] + atsetenc | c6 | 6 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + atsetenc | c7 | 1607 | ['compresstype=rle_type', 'blocksize=32768', 'compresslevel=3'] + atsetenc | c8 | 1608 | ['compresstype=rle_type', 'blocksize=32768', 'compresslevel=4'] +(8 rows) + +-- results all good +select * from atsetenc; + c1 | c2 | c4 | c5 | c6 | c7 | c8 +----+----+----+----+----+----+---- + 1 | 2 | 4 | 5 | 6 | 7 | 8 + 1 | 2 | 4 | 5 | 6 | 7 | 8 +(2 rows) + +-- +-- partition table +-- +create table atsetencpart (a int, b int) using ao_column partition by range(b); +CREATE TABLE +create table atsetencpart_p1 partition of atsetencpart for values from (0) to (10); +CREATE TABLE +create table atsetencpart_p2 partition of atsetencpart for values from (10) to (20); +CREATE TABLE +create table atsetencpart_def partition of atsetencpart default; +CREATE TABLE +insert into atsetencpart select 1,i from generate_series(1,100)i; +INSERT 0 100 +execute capturerelfilenodebefore('set enc', 'atsetencpart_p1'); +INSERT 0 4 +execute capturerelfilenodebefore('set enc', 'atsetencpart_p2'); +INSERT 0 4 +execute capturerelfilenodebefore('set enc', 'atsetencpart_def'); +INSERT 0 4 +-- alter root table will alter all children +alter table atsetencpart alter column b set encoding (compresstype=zlib,compresslevel=9); +ALTER TABLE +-- alter a child partition just alter that partition +alter table atsetencpart_p2 alter column b set encoding (compresslevel=1); +ALTER TABLE +-- no table rewrite and the options are changed +execute checkrelfilenodediff('set enc', 'atsetencpart_p1'); + segid | casename | relname | rewritten +-------+----------+-----------------+----------- + 2 | set enc | atsetencpart_p1 | f + -1 | set enc | atsetencpart_p1 | f + 0 | set enc | atsetencpart_p1 | f + 1 | set enc | atsetencpart_p1 | f +(4 rows) +execute checkrelfilenodediff('set enc', 'atsetencpart_p2'); + segid | casename | relname | rewritten +-------+----------+-----------------+----------- + 2 | set enc | atsetencpart_p2 | f + -1 | set enc | atsetencpart_p2 | f + 0 | set enc | atsetencpart_p2 | f + 1 | set enc | atsetencpart_p2 | f +(4 rows) +execute checkrelfilenodediff('set enc', 'atsetencpart_def'); + segid | casename | relname | rewritten +-------+----------+------------------+----------- + 2 | set enc | atsetencpart_def | f + -1 | set enc | atsetencpart_def | f + 0 | set enc | atsetencpart_def | f + 1 | set enc | atsetencpart_def | f +(4 rows) +execute attribute_encoding_check('atsetencpart_p1'); + relname | attname | filenum | attoptions +-----------------+---------+---------+------------------------------------------------------------- + atsetencpart_p1 | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + atsetencpart_p1 | b | 1602 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] +(2 rows) +execute attribute_encoding_check('atsetencpart_p2'); + relname | attname | filenum | attoptions +-----------------+---------+---------+------------------------------------------------------------- + atsetencpart_p2 | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + atsetencpart_p2 | b | 2 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=1'] +(2 rows) +execute attribute_encoding_check('atsetencpart_def'); + relname | attname | filenum | attoptions +------------------+---------+---------+------------------------------------------------------------- + atsetencpart_def | a | 1 | ['compresstype=none', 'blocksize=32768', 'compresslevel=0'] + atsetencpart_def | b | 1602 | ['compresstype=zlib', 'blocksize=32768', 'compresslevel=9'] +(2 rows) +-- results are expected +select sum(a), sum(b) from atsetencpart; + sum | sum +-----+------ + 100 | 5050 +(1 row) + diff --git a/src/test/isolation2/expected/aocs_unique_index.out b/src/test/isolation2/expected/aocs_unique_index.out index 88a81e3220a..25cd89a8575 100644 --- a/src/test/isolation2/expected/aocs_unique_index.out +++ b/src/test/isolation2/expected/aocs_unique_index.out @@ -8,9 +8,9 @@ -- Case 1: Conflict with committed transaction---------------------------------- CREATE TABLE unique_index_ao_column (a bigint unique) USING ao_column DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE INSERT INTO unique_index_ao_column SELECT * FROM generate_series(1, 658491); -INSERT 658491 +INSERT 0 658491 -- should conflict INSERT INTO unique_index_ao_column VALUES (1); ERROR: duplicate key value violates unique constraint "unique_index_ao_column_a_key" (seg0 192.168.0.148:7002 pid=721860) @@ -20,73 +20,73 @@ ERROR: duplicate key value violates unique constraint "unique_index_ao_column_a DETAIL: Key (a)=(658491) already exists. -- should not conflict INSERT INTO unique_index_ao_column VALUES (658492); -INSERT 1 +INSERT 0 1 DROP TABLE unique_index_ao_column; -DROP +DROP TABLE -- Case 2: Conflict within the same transaction--------------------------------- CREATE TABLE unique_index_ao_column (a bigint unique) USING ao_column DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE BEGIN; BEGIN INSERT INTO unique_index_ao_column SELECT * FROM generate_series(1, 658491); -INSERT 658491 +INSERT 0 658491 -- should conflict INSERT INTO unique_index_ao_column VALUES (1); ERROR: duplicate key value violates unique constraint "unique_index_ao_column_a_key" (seg1 192.168.0.148:7003 pid=721861) DETAIL: Key (a)=(1) already exists. END; -END +ROLLBACK DROP TABLE unique_index_ao_column; -DROP +DROP TABLE CREATE TABLE unique_index_ao_column (a bigint unique) USING ao_column DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE BEGIN; BEGIN INSERT INTO unique_index_ao_column SELECT * FROM generate_series(1, 658491); -INSERT 658491 +INSERT 0 658491 -- should conflict INSERT INTO unique_index_ao_column VALUES (658491); ERROR: duplicate key value violates unique constraint "unique_index_ao_column_a_key" (seg0 192.168.0.148:7002 pid=721860) DETAIL: Key (a)=(658491) already exists. END; -END +ROLLBACK DROP TABLE unique_index_ao_column; -DROP +DROP TABLE CREATE TABLE unique_index_ao_column (a bigint unique) USING ao_column DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE BEGIN; BEGIN INSERT INTO unique_index_ao_column SELECT * FROM generate_series(1, 658491); -INSERT 658491 +INSERT 0 658491 -- should not conflict INSERT INTO unique_index_ao_column VALUES (658492); -INSERT 1 +INSERT 0 1 END; -END +COMMIT DROP TABLE unique_index_ao_column; -DROP +DROP TABLE -- Case 3: Conflict with aborted transaction is not a conflict------------------ CREATE TABLE unique_index_ao_column (a bigint unique) USING ao_column DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE BEGIN; BEGIN INSERT INTO unique_index_ao_column SELECT * FROM generate_series(1, 658491); -INSERT 658491 +INSERT 0 658491 ABORT; -ABORT +ROLLBACK -- should not conflict INSERT INTO unique_index_ao_column VALUES (1); -INSERT 1 +INSERT 0 1 INSERT INTO unique_index_ao_column VALUES (658491); -INSERT 1 +INSERT 0 1 INSERT INTO unique_index_ao_column VALUES (658492); -INSERT 1 +INSERT 0 1 DROP TABLE unique_index_ao_column; -DROP +DROP TABLE -- Case 4: Conflict with to-be-committed transaction---------------------------- -- @@ -106,21 +106,21 @@ DROP -- 10. Tx 1 commits -- CREATE TABLE unique_index_ao_column (a bigint unique) USING ao_column DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE 1: BEGIN; BEGIN 1: INSERT INTO unique_index_ao_column VALUES (0); -INSERT 1 +INSERT 0 1 2: BEGIN; BEGIN 2: INSERT INTO unique_index_ao_column SELECT * FROM generate_series(1, 658491); -INSERT 658491 +INSERT 0 658491 3&: INSERT INTO unique_index_ao_column VALUES (1); 4&: INSERT INTO unique_index_ao_column VALUES (658490); 5&: INSERT INTO unique_index_ao_column VALUES (658491); -- should succeed immediately 6: INSERT INTO unique_index_ao_column VALUES (658492); -INSERT 1 +INSERT 0 1 2: COMMIT; COMMIT 3<: <... completed> @@ -135,7 +135,7 @@ DETAIL: Key (a)=(658491) already exists. 1: COMMIT; COMMIT DROP TABLE unique_index_ao_column; -DROP +DROP TABLE -- Case 5: Conflict with to-be-aborted transaction------------------------------ -- @@ -155,37 +155,37 @@ DROP -- 10. Tx 1 commits -- CREATE TABLE unique_index_ao_column (a bigint unique) USING ao_column DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE 1: BEGIN; BEGIN 1: INSERT INTO unique_index_ao_column VALUES (0); -INSERT 1 +INSERT 0 1 2: BEGIN; BEGIN 2: INSERT INTO unique_index_ao_column SELECT * FROM generate_series(1, 658491); -INSERT 658491 +INSERT 0 658491 3&: INSERT INTO unique_index_ao_column VALUES (1); 4&: INSERT INTO unique_index_ao_column VALUES (658490); 5&: INSERT INTO unique_index_ao_column VALUES (658491); -- should succeed immediately 6: INSERT INTO unique_index_ao_column VALUES (658492); -INSERT 1 +INSERT 0 1 2: ABORT; -ABORT +ROLLBACK 3<: <... completed> -INSERT 1 +INSERT 0 1 4<: <... completed> -INSERT 1 +INSERT 0 1 5<: <... completed> -INSERT 1 +INSERT 0 1 1: COMMIT; COMMIT DROP TABLE unique_index_ao_column; -DROP +DROP TABLE -- Case 6: Conflict with aborted rows following some committed rows ------------ CREATE TABLE unique_index_ao_column (a bigint unique) USING ao_column DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE -- 1. Tx 1 commits rows 1-100. -- 2. Tx 2 inserts rows 101-200 and then aborts. -- 3. Tx 3 tries to insert row in range [101,200] and is immediately successful. @@ -193,22 +193,22 @@ CREATE -- constraint violation. -- 5. Tx 5 tries to insert row in range [201, ) and is immediately successful. 1: INSERT INTO unique_index_ao_column SELECT generate_series(1, 100); -INSERT 100 +INSERT 0 100 2: BEGIN; BEGIN 2: INSERT INTO unique_index_ao_column SELECT generate_series(101, 200); -INSERT 100 +INSERT 0 100 2: ABORT; -ABORT +ROLLBACK 3: INSERT INTO unique_index_ao_column VALUES(102); -INSERT 1 +INSERT 0 1 4: INSERT INTO unique_index_ao_column VALUES(2); ERROR: duplicate key value violates unique constraint "unique_index_ao_column_a_key" (seg0 192.168.0.148:7002 pid=659656) DETAIL: Key (a)=(2) already exists. 5: INSERT INTO unique_index_ao_column VALUES(202); -INSERT 1 +INSERT 0 1 DROP TABLE unique_index_ao_column; -DROP +DROP TABLE -------------------------------------------------------------------------------- ----------------- More concurrent tests with fault injection ------------------ @@ -232,7 +232,7 @@ DROP -- 6. Tx 2 succeeds as Tx 1 aborted. CREATE TABLE unique_index_ao_column (a bigint unique) USING ao_column DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE SELECT gp_inject_fault('appendonly_insert', 'suspend', '', '', 'unique_index_ao_column', 4, 4, 0, dbid) FROM gp_segment_configuration WHERE role = 'p' AND content <> -1; gp_inject_fault ----------------- @@ -252,9 +252,9 @@ SELECT gp_wait_until_triggered_fault('appendonly_insert', 4, dbid) FROM gp_segme (3 rows) 2&: INSERT INTO unique_index_ao_column VALUES(2); 4: INSERT INTO unique_index_ao_column VALUES(11); -INSERT 1 +INSERT 0 1 3: INSERT INTO unique_index_ao_column VALUES(4); -INSERT 1 +INSERT 0 1 SELECT gp_inject_fault('appendonly_insert', 'reset', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content <> -1; gp_inject_fault ----------------- @@ -266,9 +266,9 @@ SELECT gp_inject_fault('appendonly_insert', 'reset', dbid) FROM gp_segment_confi ERROR: duplicate key value violates unique constraint "unique_index_ao_column_a_key" (seg1 192.168.0.148:7003 pid=828519) DETAIL: Key (a)=(4) already exists. 2<: <... completed> -INSERT 1 +INSERT 0 1 DROP TABLE unique_index_ao_column; -DROP +DROP TABLE -- Case 8: Conflict with to-be-committed transaction - generalization of case 7 -- where there are multiple minipages (and block directory rows) in play from @@ -293,7 +293,7 @@ DROP -- 7. All blocked Txs succeed. CREATE TABLE unique_index_ao_column (a bigint unique) USING ao_column DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE SELECT gp_inject_fault('insert_new_entry_curr_minipage_full', 'suspend', '', '', '', 2, 2, 0, dbid) FROM gp_segment_configuration WHERE role = 'p' AND content <> -1; gp_inject_fault @@ -349,7 +349,7 @@ SELECT gp_wait_until_triggered_fault('appendonly_insert', 4, dbid) FROM gp_segme 8&: INSERT INTO unique_index_ao_column VALUES(1321071); -- no index entry exists for it, so should not conflict. 9: INSERT INTO unique_index_ao_column VALUES(1321075); -INSERT 1 +INSERT 0 1 SELECT gp_inject_fault('appendonly_insert', 'reset', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content <> -1; gp_inject_fault @@ -363,29 +363,29 @@ SELECT gp_inject_fault('appendonly_insert', 'reset', dbid) FROM gp_segment_confi ERROR: duplicate key value violates unique constraint "unique_index_ao_column_a_key" (seg2 192.168.0.148:7004 pid=735802) DETAIL: Key (a)=(1321075) already exists. 2<: <... completed> -INSERT 1 +INSERT 0 1 3<: <... completed> -INSERT 1 +INSERT 0 1 4<: <... completed> -INSERT 1 +INSERT 0 1 5<: <... completed> -INSERT 1 +INSERT 0 1 6<: <... completed> -INSERT 1 +INSERT 0 1 7<: <... completed> -INSERT 1 +INSERT 0 1 8<: <... completed> -INSERT 1 +INSERT 0 1 DROP TABLE unique_index_ao_column; -DROP +DROP TABLE -------------------------------------------------------------------------------- --------------------------- Smoke tests for COPY ------------------------------- -------------------------------------------------------------------------------- CREATE TABLE unique_index_ao_column (a INT unique) USING ao_column DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE 1: BEGIN; BEGIN @@ -405,23 +405,23 @@ CONTEXT: COPY unique_index_ao_column, line 1 2<: <... completed> COPY 1 1: END; -END +ROLLBACK DROP TABLE unique_index_ao_column; -DROP +DROP TABLE -------------------------------------------------------------------------------- -------------------- Smoke tests for subtransactions --------------------------- -------------------------------------------------------------------------------- CREATE TABLE unique_index_ao_column (a INT unique) USING ao_column DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE 1: BEGIN; BEGIN 1: SAVEPOINT a; SAVEPOINT 1: INSERT INTO unique_index_ao_column VALUES(1); -INSERT 1 +INSERT 0 1 -- concurrent tx inserting conflicting row should block. 2: BEGIN; @@ -429,7 +429,7 @@ BEGIN 2&: INSERT INTO unique_index_ao_column VALUES(1); -- concurrent tx inserting non-conflicting row should be successful. 3: INSERT INTO unique_index_ao_column VALUES(2); -INSERT 1 +INSERT 0 1 -- conflict should be detected within the same subtx. 1: INSERT INTO unique_index_ao_column VALUES(1); @@ -437,15 +437,15 @@ ERROR: duplicate key value violates unique constraint "unique_index_ao_column_a DETAIL: Key (a)=(1) already exists. -- the concurrent tx should now succeed. 2<: <... completed> -INSERT 1 +INSERT 0 1 2: ABORT; -ABORT +ROLLBACK -- after rolling back to the savepoint, we should be able to re-insert the key 1: ROLLBACK TO SAVEPOINT a; ROLLBACK 1: INSERT INTO unique_index_ao_column VALUES(1); -INSERT 1 +INSERT 0 1 1: COMMIT; COMMIT @@ -457,7 +457,7 @@ SELECT * FROM unique_index_ao_column; (2 rows) DROP TABLE unique_index_ao_column; -DROP +DROP TABLE -------------------------------------------------------------------------------- -------------------- Smoke tests for repeatable read --------------------------- @@ -467,7 +467,7 @@ DROP -- boundaries. CREATE TABLE unique_index_ao_column (a INT unique) USING ao_column DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE -- Begin two txs with tx level snapshot taken early. 1: BEGIN ISOLATION LEVEL REPEATABLE READ; @@ -487,11 +487,11 @@ BEGIN 3: BEGIN; BEGIN 3: INSERT INTO unique_index_ao_column VALUES(1); -INSERT 1 +INSERT 0 1 -- And another transaction inserts a key and commits. INSERT INTO unique_index_ao_column VALUES(2); -INSERT 1 +INSERT 0 1 -- Tx should block on insert of conflicting key, even though it can't "see" the -- conflicting key due to its isolation level. @@ -502,11 +502,11 @@ INSERT 1 1&: INSERT INTO unique_index_ao_column VALUES(1); 3: ABORT; -ABORT +ROLLBACK 1<: <... completed> -INSERT 1 +INSERT 0 1 1: ABORT; -ABORT +ROLLBACK -- Tx should raise a conflict, even though it can't "see" the conflicting key -- due to its isolation level. @@ -522,52 +522,3 @@ ABORT DROP TABLE unique_index_ao_column; DROP - - --------------------------------------------------------------------------------- ------------------------ Smoke tests for ADD CONSTRAINT ------------------------ --------------------------------------------------------------------------------- -CREATE TABLE unique_index_ao_column (a INT) USING ao_column DISTRIBUTED REPLICATED; -CREATE -INSERT INTO unique_index_ao_column SELECT * FROM generate_series(1, 5); -INSERT 5 - -ALTER table unique_index_ao_column ADD CONSTRAINT a_unique UNIQUE(a); -ALTER --- should conflict -INSERT INTO unique_index_ao_column VALUES (1); -DETAIL: Key (a)=(1) already exists. -ERROR: duplicate key value violates unique constraint "a_unique" -ALTER table unique_index_ao_column DROP CONSTRAINT a_unique; -ALTER - -INSERT INTO unique_index_ao_column VALUES (1); -INSERT 1 --- should failed -ALTER table unique_index_ao_column ADD CONSTRAINT a_unique UNIQUE(a); -DETAIL: Key (a)=(1) is duplicated. -ERROR: could not create unique index "a_unique" - -DROP TABLE unique_index_ao_column; -DROP - - --------------------------------------------------------------------------------- ------------------------ Smoke tests for Multiple Key --------------------------- --------------------------------------------------------------------------------- -CREATE TABLE unique_index_ao_column (a INT, b INT) USING ao_column DISTRIBUTED REPLICATED; -CREATE -INSERT INTO unique_index_ao_column SELECT i,i FROM generate_series(1, 5) i; -INSERT 5 - -CREATE UNIQUE INDEX a_b_unique ON unique_index_ao_column(a,b); -CREATE --- should not conflict -INSERT INTO unique_index_ao_column VALUES (1,2); -INSERT 1 --- should conflict -INSERT INTO unique_index_ao_column VALUES (1,1); -DETAIL: Key (a, b)=(1, 1) already exists. -ERROR: duplicate key value violates unique constraint "a_b_unique" -DROP TABLE unique_index_ao_column; -DROP diff --git a/src/test/isolation2/expected/bitmap_index_ao_sparse.out b/src/test/isolation2/expected/bitmap_index_ao_sparse.out index 933aaad5552..8f9a1a15b51 100644 --- a/src/test/isolation2/expected/bitmap_index_ao_sparse.out +++ b/src/test/isolation2/expected/bitmap_index_ao_sparse.out @@ -9,7 +9,7 @@ -- Test AO table. CREATE TABLE ao_sparse (id int) with(appendonly = true) DISTRIBUTED BY (id); -CREATE +CREATE TABLE 1: begin; BEGIN @@ -17,9 +17,9 @@ BEGIN BEGIN 1: INSERT INTO ao_sparse SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 2: INSERT INTO ao_sparse SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 1: commit; COMMIT @@ -34,7 +34,7 @@ SELECT count(*) FROM ao_sparse WHERE id >= 97 and id <= 99 and gp_segment_id = 0 (1 row) CREATE INDEX idx_ao_sparse_id ON ao_sparse USING bitmap (id); -CREATE +CREATE INDEX -- Should generate Bitmap Heap Scan on the bitmap index. @@ -74,7 +74,7 @@ SET -- Test AOCS table. CREATE TABLE aocs_sparse (id int) with(appendonly = true, orientation = COLUMN) DISTRIBUTED BY (id); -CREATE +CREATE TABLE 1: begin; BEGIN @@ -82,9 +82,9 @@ BEGIN BEGIN 1: INSERT INTO aocs_sparse SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 2: INSERT INTO aocs_sparse SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 1: commit; COMMIT diff --git a/src/test/isolation2/expected/bitmap_index_concurrent.out b/src/test/isolation2/expected/bitmap_index_concurrent.out index b87cae7f476..e46b8673437 100644 --- a/src/test/isolation2/expected/bitmap_index_concurrent.out +++ b/src/test/isolation2/expected/bitmap_index_concurrent.out @@ -25,7 +25,7 @@ -- will generate two bitmap pages, and the first page is a full page. -- Use heap table, delete tuples and then vacuum should be the same. But it needs huge tuples. CREATE TABLE bmupdate (id int) with(appendonly = true) DISTRIBUTED BY (id); -CREATE +CREATE TABLE 1: begin; BEGIN @@ -73,49 +73,49 @@ BEGIN BEGIN 1: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 2: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 3: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 4: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 5: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 6: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 7: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 8: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 9: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 10: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 11: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 12: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 13: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 14: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 15: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 16: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 17: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 18: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 19: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 20: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 21: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 22: INSERT INTO bmupdate SELECT i%10000 FROM generate_series(1, 1000000) AS i; -INSERT 1000000 +INSERT 0 1000000 1: commit; COMMIT @@ -170,7 +170,7 @@ SELECT count(*) FROM bmupdate WHERE id = 97; (1 row) CREATE INDEX idx_bmupdate__id ON bmupdate USING bitmap (id); -CREATE +CREATE INDEX -- -- Test 1, run Bitmap Heap Scan on the bitmap index when there's @@ -214,7 +214,7 @@ SET -- The reason it not insert at the end of bitmap LOV is because right now only one -- transaction doing the insert, and it'll insert to small seg file number. 2: INSERT INTO bmupdate VALUES (97); -INSERT 1 +INSERT 0 1 -- Query should read the first page(buffer lock released), and then INSERT insert to -- the first page which will trigger rearrange words. @@ -294,7 +294,7 @@ SET -- The reason it not insert at the end of bitmap LOV is because right now only one -- transaction doing the insert, and it'll insert to small seg file number. 2: INSERT INTO bmupdate VALUES (97); -INSERT 1 +INSERT 0 1 -- Query should read the first page(buffer lock released), and then INSERT insert to -- the first page which will trigger rearrange words. @@ -374,9 +374,9 @@ SELECT gp_inject_fault_infinite('rearrange_word_to_next_bitmap_page', 'skip', db -- transaction doing the insert, and it'll insert to small seg file number. -- Here insert both values to make sure update on full bitmap happens for one LOV. 2: INSERT INTO bmupdate VALUES (97); -INSERT 1 +INSERT 0 1 2: INSERT INTO bmupdate VALUES (99); -INSERT 1 +INSERT 0 1 -- Query should read the first page(buffer lock released), and then INSERT insert to -- the first page which will trigger rearrange words. @@ -461,9 +461,9 @@ SET -- transaction doing the insert, and it'll insert to small seg file number. -- Here insert both values to make sure update on full bitmap happens for one LOV. 2: INSERT INTO bmupdate SELECT 97 FROM generate_series(1, 1000); -INSERT 1000 +INSERT 0 1000 2: INSERT INTO bmupdate SELECT 99 FROM generate_series(1, 1000); -INSERT 1000 +INSERT 0 1000 -- Query should read the first page(buffer lock released), and then INSERT insert to -- the first page which will trigger rearrange words. @@ -506,7 +506,7 @@ SELECT count(*) FROM bmupdate WHERE id >= 97 and id <= 99 and gp_segment_id = 0; (1 row) DROP TABLE bmupdate; -DROP +DROP TABLE -- Regression test, when large amount of inserts concurrent inserts happen, diff --git a/src/test/isolation2/expected/bitmap_index_crash.out b/src/test/isolation2/expected/bitmap_index_crash.out index 7dce1ae6d31..b49ff50a065 100644 --- a/src/test/isolation2/expected/bitmap_index_crash.out +++ b/src/test/isolation2/expected/bitmap_index_crash.out @@ -5,7 +5,7 @@ -- subsequent flush of the metapage will lead to an inadvertent -- overwrite. 1:CREATE EXTENSION IF NOT EXISTS gp_inject_fault; -CREATE +CREATE EXTENSION -- skip FTS probes for this test to avoid segment being marked down on restart 1:SELECT gp_inject_fault_infinite('fts_probe', 'skip', dbid) FROM gp_segment_configuration WHERE role='p' AND content=-1; gp_inject_fault_infinite @@ -20,9 +20,9 @@ CREATE -- test setup 1:CREATE TABLE bm(a int); -CREATE +CREATE TABLE 1:CREATE INDEX ON bm USING bitmap (a); -CREATE +CREATE INDEX -- pause checkpoint to make sure CRASH RECOVERY happens for bitmap index replay 1:SELECT gp_inject_fault_infinite('checkpoint', 'skip', dbid) FROM gp_segment_configuration WHERE role='p'; gp_inject_fault_infinite @@ -37,7 +37,7 @@ CHECKPOINT -- this insert's WAL we wish to replay 1:insert into bm select generate_series(1, 5000); -INSERT 5000 +INSERT 0 5000 1U:select pg_relation_size(oid)/current_setting('block_size')::bigint from pg_class where relname = 'bm_a_idx'; ?column? ---------- @@ -46,7 +46,7 @@ INSERT 5000 -- set small shared_buffers to make sure META_PAGE of bitmap index evicts out 1U: ALTER SYSTEM set shared_buffers to 20; -ALTER +ALTER SYSTEM 1:SELECT pg_ctl(datadir, 'restart') from gp_segment_configuration where role = 'p' and content = 1; pg_ctl -------- @@ -73,7 +73,7 @@ SET -- teardown cleanup for the test 1Uq: ... 1U:ALTER SYSTEM reset shared_buffers; -ALTER +ALTER SYSTEM 2:SELECT pg_ctl(datadir, 'restart') from gp_segment_configuration where role = 'p' and content = 1; pg_ctl -------- diff --git a/src/test/isolation2/expected/bitmap_index_inspect.out b/src/test/isolation2/expected/bitmap_index_inspect.out index fa925fcad97..39f3865b035 100644 --- a/src/test/isolation2/expected/bitmap_index_inspect.out +++ b/src/test/isolation2/expected/bitmap_index_inspect.out @@ -3,14 +3,16 @@ -- inspect functions run against a single node, as opposed to the entire GP cluster) -- Setup +1U: CREATE EXTENSION pageinspect; +CREATE EXTENSION 1U: CREATE TABLE bmtest_t1(i int, bmfield int); -CREATE +CREATE TABLE 1U: CREATE INDEX bmtest_i1 ON bmtest_t1 USING bitmap(bmfield); -CREATE +CREATE INDEX 1U: INSERT INTO bmtest_t1 SELECT i,1 FROM generate_series(1, 1000) i; -INSERT 1000 +INSERT 0 1000 1U: INSERT INTO bmtest_t1 SELECT i,2 FROM generate_series(1, 1000) i; -INSERT 1000 +INSERT 0 1000 -- start_matchsubs -- m/bmfuncs.c:\d+/ @@ -61,4 +63,6 @@ ERROR: block 1 is not a bitmap page, it is a LOV item page (bmfuncs.c:507) -- cleanup 1U: DROP TABLE bmtest_t1; -DROP +DROP TABLE +1U: DROP EXTENSION pageinspect; +DROP EXTENSION diff --git a/src/test/isolation2/expected/bitmap_update_words_backup_block.out b/src/test/isolation2/expected/bitmap_update_words_backup_block.out index 950f91d36be..98567439ee1 100644 --- a/src/test/isolation2/expected/bitmap_update_words_backup_block.out +++ b/src/test/isolation2/expected/bitmap_update_words_backup_block.out @@ -1,6 +1,6 @@ -- Setup fault injectors. CREATE EXTENSION IF NOT EXISTS gp_inject_fault; -CREATE +CREATE EXTENSION -- Skip FTS probes for this test to avoid segment being marked down on restart. 1:SELECT gp_inject_fault_infinite('fts_probe', 'skip', dbid) FROM gp_segment_configuration WHERE role='p' AND content=-1; @@ -14,38 +14,38 @@ CREATE t (1 row) CREATE TABLE bm_update_words_backup_block (id int) WITH (appendonly = true); -CREATE +CREATE TABLE 1: BEGIN; BEGIN 2: BEGIN; BEGIN 1: INSERT INTO bm_update_words_backup_block SELECT i%100 FROM generate_series(1, 200) AS i; -INSERT 200 +INSERT 0 200 2: INSERT INTO bm_update_words_backup_block SELECT i%100 FROM generate_series(1, 200) AS i; -INSERT 200 +INSERT 0 200 1: COMMIT; COMMIT 2: COMMIT; COMMIT CREATE INDEX bm_update_words_backup_block_idx ON bm_update_words_backup_block USING bitmap (id); -CREATE +CREATE INDEX -- INSERTs will attempt to add a bitmap page but will cause a word -- expansion and a bitmap page split due to overflow. See bitmap -- function updatesetbit_inpage(). 2: INSERT INTO bm_update_words_backup_block VALUES (97); -INSERT 1 +INSERT 0 1 2: INSERT INTO bm_update_words_backup_block VALUES (97), (99); -INSERT 2 +INSERT 0 2 -- Run a CHECKPOINT to force this next INSERT to add backup blocks of -- the two bitmap pages to its XLOG_BITMAP_UPDATEWORDS record. 2: CHECKPOINT; CHECKPOINT 2: INSERT INTO bm_update_words_backup_block VALUES (97); -INSERT 1 +INSERT 0 1 -- Do an immediate restart to force crash recovery. The above INSERT -- should be replayed with the backup blocks. @@ -55,7 +55,7 @@ INSERT 1 OK (1 row) 3: INSERT INTO bm_update_words_backup_block VALUES (97); -INSERT 1 +INSERT 0 1 -- Turn FTS back on. 3:SELECT gp_inject_fault('fts_probe', 'reset', dbid) FROM gp_segment_configuration WHERE role='p' AND content=-1; diff --git a/src/test/isolation2/expected/brin_heap.out b/src/test/isolation2/expected/brin_heap.out index 83aa84b8e69..e656f3a16f5 100644 --- a/src/test/isolation2/expected/brin_heap.out +++ b/src/test/isolation2/expected/brin_heap.out @@ -2,6 +2,8 @@ -- White-box tests are necessary to ensure that summarization is done -- successfully (to avoid cases where ranges have brin data tuples without -- values or where the range is not covered by the revmap etc) +CREATE EXTENSION pageinspect; +CREATE EXTENSION -- Turn off sequential scans to force usage of BRIN indexes for scans. SET enable_seqscan TO off; @@ -11,9 +13,9 @@ SET -- by another transaction, while summarization was in flight. CREATE TABLE brin_range_extended_heap(i int) USING heap; -CREATE +CREATE TABLE CREATE INDEX ON brin_range_extended_heap USING brin(i) WITH (pages_per_range=5); -CREATE +CREATE INDEX -- Insert 9 blocks of data on 1 QE; 8 blocks full, 1 block with 1 tuple. SELECT populate_pages('brin_range_extended_heap', 1, tid '(8, 0)'); @@ -105,9 +107,9 @@ SELECT gp_inject_fault('summarize_last_partial_range', 'reset', dbid) FROM gp_se -- Test build/summarize with aborted rows. CREATE TABLE brin_abort_heap(i int); -CREATE +CREATE TABLE CREATE INDEX ON brin_abort_heap USING brin(i) WITH (pages_per_range=1); -CREATE +CREATE INDEX BEGIN; BEGIN -- Create 3 blocks all on 1 QE, in 1 aoseg: 2 blocks full, 1 block with 1 tuple. @@ -117,7 +119,7 @@ SELECT populate_pages('brin_abort_heap', 1, tid '(2, 0)'); (1 row) ABORT; -ABORT +ROLLBACK -- Sanity: There is 1 revmap page and 1 data page, with 1 range (summarized). -- This first range being summarized highlights a difference with AO/CO tables. @@ -260,9 +262,9 @@ SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_ -- Drop and re-create the index to test build. DROP INDEX brin_abort_heap_i_idx; -DROP +DROP INDEX CREATE INDEX ON brin_abort_heap USING brin(i) WITH (pages_per_range=1); -CREATE +CREATE INDEX -- Sanity: There is 1 revmap page and 1 data page, with 4 ranges. Only the last -- two ranges (covering the committed rows) have non-empty tuples. @@ -315,3 +317,5 @@ SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_ RESET enable_seqscan; RESET +DROP EXTENSION pageinspect; +DROP EXTENSION diff --git a/src/test/isolation2/expected/cancel_plpython.out b/src/test/isolation2/expected/cancel_plpython.out index 37964e3b04c..fff46cf807b 100644 --- a/src/test/isolation2/expected/cancel_plpython.out +++ b/src/test/isolation2/expected/cancel_plpython.out @@ -3,25 +3,25 @@ CREATE LANGUAGE plpython3u; CREATE -- end_ignore CREATE OR REPLACE FUNCTION pybusyloop() RETURNS double precision AS $$ import math while True: a = 1 return 1 $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION CREATE OR REPLACE FUNCTION pysleep() RETURNS double precision AS $$ import time time.sleep(100) return 1 $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION CREATE OR REPLACE FUNCTION pyspisleep() RETURNS double precision AS $$ # container: plc_python_shared rv = plpy.execute("select pg_sleep(100)") return 1 $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION CREATE OR REPLACE FUNCTION pynestsleep() RETURNS double precision AS $$ # container: plc_python_shared rv = plpy.execute("select pyspisleep()") return 1 $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION CREATE OR REPLACE FUNCTION pynestsleep2() RETURNS double precision AS $$ # container: plc_python_shared rv = plpy.execute("select pysleep()") return 1 $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION CREATE TABLE a(i int); -CREATE +CREATE TABLE insert into a values(1),(10),(20),(100); -INSERT 4 +INSERT 0 4 1&: select pybusyloop(); 2&: select pybusyloop() from a; diff --git a/src/test/isolation2/expected/cancel_query.out b/src/test/isolation2/expected/cancel_query.out index 38bda39fe4e..2833da2dc05 100644 --- a/src/test/isolation2/expected/cancel_query.out +++ b/src/test/isolation2/expected/cancel_query.out @@ -1,14 +1,14 @@ CREATE EXTENSION IF NOT EXISTS gp_inject_fault; -CREATE +CREATE EXTENSION 0:CREATE TABLE a_partition_table_for_analyze_cancellation ( a_date date NOT NULL, a_bigint bigint NOT NULL, b_bigint bigint NOT NULL ) WITH (appendonly='true', orientation='column') DISTRIBUTED BY (a_bigint, b_bigint) PARTITION BY RANGE(a_date) ( PARTITION p1 START ('2018-01-01'::date) END ('2018-12-31'::date) WITH (appendonly='true', orientation='column') COLUMN a_date ENCODING (compresstype=zlib) COLUMN a_bigint ENCODING (compresstype=zlib) COLUMN b_bigint ENCODING (compresstype=zlib), PARTITION p2 START ('2019-01-01'::date) END ('2019-12-31'::date) WITH (appendonly='true', orientation='column') COLUMN a_date ENCODING (compresstype=zlib) COLUMN a_bigint ENCODING (compresstype=zlib) COLUMN b_bigint ENCODING (compresstype=zlib), PARTITION p3 START ('2020-01-01'::date) END ('2020-12-31'::date) WITH (appendonly='true', orientation='column') COLUMN a_date ENCODING (compresstype=zlib) COLUMN a_bigint ENCODING (compresstype=zlib) COLUMN b_bigint ENCODING (compresstype=zlib) ); -CREATE +CREATE TABLE 0:INSERT INTO a_partition_table_for_analyze_cancellation VALUES(timestamp '2018-01-01 10:00:00', 1, 3); -INSERT 1 +INSERT 0 1 0:INSERT INTO a_partition_table_for_analyze_cancellation VALUES(timestamp '2019-01-01 12:00:00', 2, 4); -INSERT 1 +INSERT 0 1 0:INSERT INTO a_partition_table_for_analyze_cancellation VALUES(timestamp '2020-01-01 13:00:00', 3, 5); -INSERT 1 +INSERT 0 1 0: SELECT gp_inject_fault('zlib_decompress_after_decompress_fn', 'sleep', '', '', '', 1, -1, 3600, dbid) FROM gp_segment_configuration WHERE content=1 AND role='p'; gp_inject_fault diff --git a/src/test/isolation2/expected/checkpoint_dtx_info.out b/src/test/isolation2/expected/checkpoint_dtx_info.out index e17e8706631..9e69d64006c 100644 --- a/src/test/isolation2/expected/checkpoint_dtx_info.out +++ b/src/test/isolation2/expected/checkpoint_dtx_info.out @@ -34,7 +34,7 @@ 1: begin; BEGIN 1: create table twopcbug(i int, j int); -CREATE +CREATE TABLE 1&: commit; -- wait to make sure the commit is taking place and blocked at start_insertedDistributedCommitted 2: select gp_wait_until_triggered_fault('start_insertedDistributedCommitted', 1, 1); @@ -102,7 +102,7 @@ server closed the connection unexpectedly -- failure on coordinator. The solution is adding the expected length -- in SizeOfXLogRecordDataHeaderLong also, to fixup the missing condition. create table ckpt_xlog_len_tbl(a int, b int); -CREATE +CREATE TABLE -- Need to start at least 18 concurrent sessions to create a long header -- CHECKPOINT WAL record, which size is not less than 256. @@ -118,115 +118,115 @@ CREATE 10: begin; BEGIN 10: insert into ckpt_xlog_len_tbl select i,i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 10&: commit; 11: begin; BEGIN 11: insert into ckpt_xlog_len_tbl select i,i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 11&: commit; 12: begin; BEGIN 12: insert into ckpt_xlog_len_tbl select i,i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 12&: commit; 13: begin; BEGIN 13: insert into ckpt_xlog_len_tbl select i,i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 13&: commit; 14: begin; BEGIN 14: insert into ckpt_xlog_len_tbl select i,i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 14&: commit; 15: begin; BEGIN 15: insert into ckpt_xlog_len_tbl select i,i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 15&: commit; 16: begin; BEGIN 16: insert into ckpt_xlog_len_tbl select i,i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 16&: commit; 17: begin; BEGIN 17: insert into ckpt_xlog_len_tbl select i,i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 17&: commit; 18: begin; BEGIN 18: insert into ckpt_xlog_len_tbl select i,i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 18&: commit; 19: begin; BEGIN 19: insert into ckpt_xlog_len_tbl select i,i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 19&: commit; 20: begin; BEGIN 20: insert into ckpt_xlog_len_tbl select i,i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 20&: commit; 21: begin; BEGIN 21: insert into ckpt_xlog_len_tbl select i,i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 21&: commit; 22: begin; BEGIN 22: insert into ckpt_xlog_len_tbl select i,i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 22&: commit; 23: begin; BEGIN 23: insert into ckpt_xlog_len_tbl select i,i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 23&: commit; 24: begin; BEGIN 24: insert into ckpt_xlog_len_tbl select i,i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 24&: commit; 25: begin; BEGIN 25: insert into ckpt_xlog_len_tbl select i,i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 25&: commit; 26: begin; BEGIN 26: insert into ckpt_xlog_len_tbl select i,i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 26&: commit; 27: begin; BEGIN 27: insert into ckpt_xlog_len_tbl select i,i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 27&: commit; 28: begin; BEGIN 28: insert into ckpt_xlog_len_tbl select i,i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 28&: commit; -- wait to make sure the commit is taking place and blocked at start_insertedDistributedCommitted @@ -362,4 +362,8 @@ server closed the connection unexpectedly (1 row) 3: drop table ckpt_xlog_len_tbl; -DROP +DROP TABLE + +-- start_ignore +alter resource group admin_group set concurrency 10; +-- end_ignore diff --git a/src/test/isolation2/expected/commit_transaction_block_checkpoint.out b/src/test/isolation2/expected/commit_transaction_block_checkpoint.out index 0857b3b7a2a..83bd051083a 100644 --- a/src/test/isolation2/expected/commit_transaction_block_checkpoint.out +++ b/src/test/isolation2/expected/commit_transaction_block_checkpoint.out @@ -13,7 +13,7 @@ CHECKPOINT 2: begin; BEGIN 2: create table t_commit_transaction_block_checkpoint (c int) distributed by (c); -CREATE +CREATE TABLE 2&: commit; -- wait for the fault to trigger since following checkpoint could be faster @@ -53,7 +53,7 @@ CHECKPOINT 2: begin; BEGIN 2: drop table t_commit_transaction_block_checkpoint; -DROP +DROP TABLE 2&: commit; -- wait for the fault to trigger since following checkpoint could be faster diff --git a/src/test/isolation2/expected/concurrent_drop_truncate_tablespace.out b/src/test/isolation2/expected/concurrent_drop_truncate_tablespace.out index 501f188fc7d..7fa8607eeff 100644 --- a/src/test/isolation2/expected/concurrent_drop_truncate_tablespace.out +++ b/src/test/isolation2/expected/concurrent_drop_truncate_tablespace.out @@ -23,82 +23,8 @@ CREATE TABLESPACE concurrent_tblspace LOCATION '/tmp/concurrent_tblspace'; CREATE --- test 1: --- when creating a table using a tablespace, after the tuple of tablespace --- is locked, the tablespace is not allowed to drop -2: begin; -BEGIN -2: CREATE TABLE t_in_tablespace(a int, b int) TABLESPACE concurrent_tblspace; -CREATE - --- drop tablespace will fail: can't acuqire the lock -DROP TABLESPACE concurrent_tblspace; -ERROR: could not lock tablespace "concurrent_tblspace" -2: rollback; -ROLLBACK - --- test 2: --- if DROP TABLESPACE acquires lock first and rollback, the blocking CREATE --- TABLE will be successful. - --- suspend execution after tablespace lock is acquired -SELECT gp_inject_fault('drop_tablespace_after_acquire_lock', 'suspend', dbid) FROM gp_segment_configuration WHERE content <> -1 and role='p'; - gp_inject_fault ------------------ - Success: - Success: - Success: -(3 rows) -1&: DROP TABLESPACE concurrent_tblspace; - --- wait for the fault to be triggered -SELECT gp_wait_until_triggered_fault('drop_tablespace_after_acquire_lock', 1, dbid) from gp_segment_configuration where content <> -1 and role='p'; - gp_wait_until_triggered_fault -------------------------------- - Success: - Success: - Success: -(3 rows) - -2&: CREATE TABLE t_in_tablespace(a int, b int) TABLESPACE concurrent_tblspace; --- inject an error to ensure that the above DROP command will rollback -SELECT gp_inject_fault('after_xlog_tblspc_drop', 'error', dbid) FROM gp_segment_configuration WHERE content <> -1 and role='p'; - gp_inject_fault ------------------ - Success: - Success: - Success: -(3 rows) -SELECT gp_inject_fault('drop_tablespace_after_acquire_lock', 'reset', dbid) FROM gp_segment_configuration WHERE content <> -1 and role='p'; - gp_inject_fault ------------------ - Success: - Success: - Success: -(3 rows) --- fail -1<: <... completed> -ERROR: fault triggered, fault name:'after_xlog_tblspc_drop' fault type:'error' --- success -2<: <... completed> -CREATE --- drop the above table, so the tablespace is empty. -2: DROP TABLE t_in_tablespace; -DROP -SELECT gp_inject_fault('after_xlog_tblspc_drop', 'reset', dbid) FROM gp_segment_configuration WHERE content <> -1 and role='p'; - gp_inject_fault ------------------ - Success: - Success: - Success: -(3 rows) - --- test 3: --- if DROP TABLESPACE acquires lock first and going to drop, any CREATE TABLE --- will fail - --- suspend execution after tablespace lock is acquired -SELECT gp_inject_fault('drop_tablespace_after_acquire_lock', 'suspend', dbid) FROM gp_segment_configuration WHERE content <> -1 and role='p'; +-- suspend execution after TablespaceCreateLock is released +SELECT gp_inject_fault('AfterTablespaceCreateLockRelease', 'suspend', dbid) FROM gp_segment_configuration WHERE content <> -1 and role='p'; gp_inject_fault ----------------- Success: @@ -117,9 +43,12 @@ SELECT gp_wait_until_triggered_fault('drop_tablespace_after_acquire_lock', 1, db (3 rows) -- create a table in the same tablespace which is being dropped via a concurrent session -2&:CREATE TABLE drop_tablespace_tbl(a int, b int) TABLESPACE concurrent_tblspace DISTRIBUTED BY (a); --- reset the fault, drop tablespace command will continue -SELECT gp_inject_fault('drop_tablespace_after_acquire_lock', 'reset', dbid) FROM gp_segment_configuration WHERE content <> -1 and role='p'; +CREATE TABLE drop_tablespace_tbl(a int, b int) TABLESPACE concurrent_tblspace DISTRIBUTED BY (a); +CREATE TABLE +INSERT INTO drop_tablespace_tbl SELECT i, i FROM generate_series(1,100)i; +INSERT 0 100 +-- reset the fault, drop tablespace command will not delete the data files on the tablespace +SELECT gp_inject_fault('AfterTablespaceCreateLockRelease', 'reset', dbid) FROM gp_segment_configuration WHERE content <> -1 and role='p'; gp_inject_fault ----------------- Success: @@ -128,7 +57,18 @@ SELECT gp_inject_fault('drop_tablespace_after_acquire_lock', 'reset', dbid) FROM (3 rows) -- success 1<: <... completed> -DROP --- fail -2<: <... completed> -ERROR: could not create directory "pg_tblspc/33175/GPDB_1_302501601/32799": No such file or directory +DROP TABLESPACE +-- check data exists +SELECT count(*) FROM drop_tablespace_tbl; + count +------- + 100 +(1 row) +-- move to another tablespace and check the data. +ALTER TABLE drop_tablespace_tbl SET TABLESPACE pg_default; +ALTER TABLE +SELECT count(*) FROM drop_tablespace_tbl; + count +------- + 100 +(1 row) diff --git a/src/test/isolation2/expected/concurrent_index_creation_should_not_deadlock.out b/src/test/isolation2/expected/concurrent_index_creation_should_not_deadlock.out index ebcc4248a48..0491f0ce3d9 100644 --- a/src/test/isolation2/expected/concurrent_index_creation_should_not_deadlock.out +++ b/src/test/isolation2/expected/concurrent_index_creation_should_not_deadlock.out @@ -1,9 +1,7 @@ -- Test to make sure non-first concurrent index creations don't deadlock -- Create an append only table, popluated with data CREATE TABLE index_deadlocking_test_table (value int) WITH (appendonly=true); -CREATE -CREATE INDEX index_deadlocking_test_table_initial_index on index_deadlocking_test_table (value); -CREATE +CREATE TABLE -- Setup a fault to ensure that both sessions pauses while creating an index, -- ensuring a concurrent index creation. @@ -29,6 +27,6 @@ SELECT gp_inject_fault('defineindex_before_acquire_lock', 'reset', 1); -- Both index creation attempts should succeed 1<: <... completed> -CREATE +CREATE INDEX 2<: <... completed> -CREATE +CREATE INDEX diff --git a/src/test/isolation2/expected/crash_recovery.out b/src/test/isolation2/expected/crash_recovery.out index a5078dd4657..7882e3f7149 100644 --- a/src/test/isolation2/expected/crash_recovery.out +++ b/src/test/isolation2/expected/crash_recovery.out @@ -1,5 +1,5 @@ 1:CREATE TABLE crash_test_table(c1 int); -CREATE +CREATE TABLE 1:SELECT role, preferred_role, content, status FROM gp_segment_configuration; role | preferred_role | content | status diff --git a/src/test/isolation2/expected/crash_recovery_dtm.out b/src/test/isolation2/expected/crash_recovery_dtm.out index 31b1e86391c..153ee28e91f 100644 --- a/src/test/isolation2/expected/crash_recovery_dtm.out +++ b/src/test/isolation2/expected/crash_recovery_dtm.out @@ -15,7 +15,7 @@ -- Make the test faster and also make some queries fail as expected after -- 2pc retry PANIC (do not finish earlier before PANIC happens). alter system set dtx_phase2_retry_second to 5; -ALTER +ALTER SYSTEM select pg_reload_conf(); pg_reload_conf ---------------- @@ -83,7 +83,7 @@ server closed the connection unexpectedly ---+--- (0 rows) 4: INSERT INTO commit_phase1_panic select i,i from generate_series(1, 10)i; -INSERT 10 +INSERT 0 10 4: SELECT count(*) from commit_phase1_panic; count ------- @@ -184,9 +184,9 @@ LINE 1: SELECT count(*) from abort_fatal_fault_test_table; -- should cause master to broadcast abort and QEs handle the abort in -- DTX_CONTEXT_LOCAL_ONLY context. 11: CREATE TABLE QE_panic_test_table(a int, b int); -CREATE +CREATE TABLE 11: INSERT INTO QE_panic_test_table SELECT * from generate_series(0, 9); -INSERT 10 +INSERT 0 10 -- To help speedy recovery 11: CHECKPOINT; CHECKPOINT @@ -194,7 +194,7 @@ CHECKPOINT -- system is required to set the GUC and can't be set on session level -- as session reset happens for every abort retry. 11: alter system set dtx_phase2_retry_second to 600; -ALTER +ALTER SYSTEM 11: select pg_reload_conf(); pg_reload_conf ---------------- @@ -269,7 +269,7 @@ ERROR: Error on receive from seg0 127.0.0.1:7002 pid=5600: server closed the co Success: (1 row) 13: alter system reset dtx_phase2_retry_second; -ALTER +ALTER SYSTEM 13: select pg_reload_conf(); pg_reload_conf ---------------- @@ -278,8 +278,8 @@ ALTER -- Scenario 5: QD panics when a QE process is doing prepare but not yet finished. -- This should cause dtx recovery finally aborts the orphaned prepared transaction. -15: CREATE TABLE master_reset(a int); -CREATE +15: CREATE TABLE coordinator_reset(a int); +CREATE TABLE 15: SELECT gp_inject_fault_infinite('before_xlog_xact_prepare', 'suspend', dbid) from gp_segment_configuration where role = 'p' and content = 1; gp_inject_fault_infinite -------------------------- @@ -299,9 +299,9 @@ CREATE -- set gucs to speed up testing 15: ALTER SYSTEM SET gp_dtx_recovery_prepared_period to 0; -ALTER +ALTER SYSTEM 15: ALTER SYSTEM SET gp_dtx_recovery_interval to 5; -ALTER +ALTER SYSTEM 15: SELECT pg_reload_conf(); pg_reload_conf ---------------- @@ -385,28 +385,12 @@ server closed the connection unexpectedly -------------------------- Success: (1 row) --- verify orphaned prepared transacion is aborted -19: SELECT gp_wait_until_triggered_fault('after_orphaned_check', 1, dbid) from gp_segment_configuration where role = 'p' and content = -1; - gp_wait_until_triggered_fault -------------------------------- - Success: -(1 row) -19: select * from gp_stat_progress_dtx_recovery; - phase | recover_commited_dtx_total | recover_commited_dtx_completed | in_doubt_tx_total | in_doubt_tx_in_progress | in_doubt_tx_aborted ------------------------------------------+----------------------------+--------------------------------+-------------------+-------------------------+--------------------- - managing in-doubt orphaned transactions | 0 | 0 | 1 | 0 | 1 -(1 row) -19: SELECT gp_inject_fault_infinite('after_orphaned_check', 'reset', dbid) from gp_segment_configuration where role = 'p' and content = -1; - gp_inject_fault_infinite --------------------------- - Success: -(1 row) -19: DROP TABLE master_reset; -DROP +19: DROP TABLE coordinator_reset; +DROP TABLE 19: ALTER SYSTEM RESET gp_dtx_recovery_interval; -ALTER +ALTER SYSTEM 19: ALTER SYSTEM RESET gp_dtx_recovery_prepared_period; -ALTER +ALTER SYSTEM 19: SELECT pg_reload_conf(); pg_reload_conf ---------------- @@ -424,11 +408,11 @@ ALTER -- speed up testing by setting some gucs. 20: ALTER SYSTEM SET gp_dtx_recovery_prepared_period to 0; -ALTER +ALTER SYSTEM 20: ALTER SYSTEM SET gp_dtx_recovery_interval to 5; -ALTER +ALTER SYSTEM 20: ALTER SYSTEM SET dtx_phase2_retry_second to 5; -ALTER +ALTER SYSTEM 20: SELECT pg_reload_conf(); pg_reload_conf ---------------- @@ -436,7 +420,7 @@ ALTER (1 row) 20: CREATE TABLE test_retry_abort(a int); -CREATE +CREATE TABLE -- master: set fault to trigger abort prepare -- primary 0: set fault so that retry prepared abort fails. @@ -535,11 +519,11 @@ ERROR: fault triggered, fault name:'dtm_broadcast_prepare' fault type:'error' -- cleanup 20: ALTER SYSTEM RESET gp_dtx_recovery_interval; -ALTER +ALTER SYSTEM 20: ALTER SYSTEM RESET gp_dtx_recovery_prepared_period; -ALTER +ALTER SYSTEM 20: ALTER SYSTEM RESET dtx_phase2_retry_second; -ALTER +ALTER SYSTEM 20: SELECT pg_reload_conf(); pg_reload_conf ---------------- @@ -556,4 +540,4 @@ ALTER Success: (1 row) 20: DROP TABLE test_retry_abort; -DROP +DROP TABLE diff --git a/src/test/isolation2/expected/crash_recovery_redundant_dtx.out b/src/test/isolation2/expected/crash_recovery_redundant_dtx.out index 3db508d527f..b78e362f44f 100644 --- a/src/test/isolation2/expected/crash_recovery_redundant_dtx.out +++ b/src/test/isolation2/expected/crash_recovery_redundant_dtx.out @@ -1,5 +1,5 @@ 1:CREATE TABLE crash_test_redundant(c1 int); -CREATE +CREATE TABLE 1:SELECT role, preferred_role, content, status FROM gp_segment_configuration; role | preferred_role | content | status diff --git a/src/test/isolation2/expected/create_memory_accounting_tables.out b/src/test/isolation2/expected/create_memory_accounting_tables.out index f311164b13b..3867fd2f886 100644 --- a/src/test/isolation2/expected/create_memory_accounting_tables.out +++ b/src/test/isolation2/expected/create_memory_accounting_tables.out @@ -1,413 +1,413 @@ CREATE TABLE lineitem ( l_orderkey INT8 NOT NULL, l_partkey INTEGER NOT NULL, l_suppkey INTEGER NOT NULL, l_linenumber INTEGER NOT NULL, l_quantity DECIMAL(15, 2) NOT NULL, l_extendedprice DECIMAL(15, 2) NOT NULL, l_discount DECIMAL(15, 2) NOT NULL, l_tax DECIMAL(15, 2) NOT NULL, l_returnflag CHAR(1) NOT NULL, l_linestatus CHAR(1) NOT NULL, l_shipdate DATE NOT NULL, l_commitdate DATE NOT NULL, l_receiptdate DATE NOT NULL, l_shipinstruct CHAR(25) NOT NULL, l_shipmode CHAR(10) NOT NULL, l_comment VARCHAR(44) NOT NULL )PARTITION by range(l_shipdate) (partition p1 start('1992-01-01') end('1998-12-02') every(interval '1 month')); -CREATE +CREATE TABLE CREATE TABLE nation ( n_nationkey INTEGER, n_name CHAR(25), n_regionkey INTEGER, n_comment VARCHAR(152) ); -CREATE +CREATE TABLE CREATE TABLE Customer ( C_CUSTKEY INTEGER , C_NAME VARCHAR(25) , C_ADDRESS VARCHAR(40) , C_NATIONKEY INTEGER , C_PHONE CHAR(15) , C_ACCTBAL DECIMAL(15,2) , C_MKTSEGMENT CHAR(10) , C_COMMENT VARCHAR(117) ); -CREATE +CREATE TABLE CREATE TABLE region ( r_regionkey INTEGER, r_name CHAR(25), r_comment VARCHAR(152) ); -CREATE +CREATE TABLE CREATE TABLE orders ( o_orderkey INTEGER, o_custkey INTEGER, o_orderstatus CHAR(1), o_totalprice DECIMAL(15, 2), o_orderdate DATE, o_orderpriority CHAR(15), o_clerk CHAR(15), o_shippriority INTEGER, o_comment VARCHAR(79) ) ; -CREATE +CREATE TABLE CREATE TABLE supplier ( s_suppkey INTEGER, s_name CHAR(25), s_address VARCHAR(40), s_nationkey INTEGER, s_phone CHAR(15), s_acctbal DECIMAL(15, 2), s_comment VARCHAR(101) ); -CREATE +CREATE TABLE CREATE TABLE partsupp ( ps_partkey INTEGER, ps_suppkey INTEGER, ps_availqty INTEGER, ps_supplycost DECIMAL(15, 2), ps_comment VARCHAR(199) ) ; -CREATE +CREATE TABLE INSERT INTO lineitem VALUES (2949,695,89,2,50,79784.50,0.05,0.04,'A','F','1994-08-04','1994-06-23','1994-08-17','TAKE BACK RETURN','FOB','gular courts cajole across t'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2949,1795,80,3,38,64478.02,0.02,0.06,'R','F','1994-05-22','1994-05-25','1994-05-27','COLLECT COD','REG AIR','se slyly requests. carefull'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2950,1295,96,1,32,38281.28,0.01,0.05,'N','O','1997-09-21','1997-08-25','1997-10-08','DELIVER IN PERSON','REG AIR','its wake carefully slyly final ideas.'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2950,658,59,2,18,28055.70,0.10,0.01,'N','O','1997-07-19','1997-08-29','1997-08-17','COLLECT COD','TRUCK','uests cajole furio'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2950,527,28,3,14,19985.28,0.01,0.02,'N','O','1997-07-29','1997-08-05','1997-07-31','TAKE BACK RETURN','MAIL','ccounts haggle carefully according'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2950,1864,65,4,45,79463.70,0.08,0.00,'N','O','1997-09-05','1997-09-23','1997-09-11','NONE','FOB','ides the b'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2950,610,11,5,46,69488.06,0.02,0.05,'N','O','1997-07-15','1997-09-30','1997-07-25','COLLECT COD','RAIL','to the regular accounts are slyly carefu'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2950,1736,37,6,27,44218.71,0.01,0.03,'N','O','1997-10-01','1997-09-13','1997-10-08','NONE','TRUCK','are alongside of the carefully silent'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2951,21,72,1,5,4605.10,0.03,0.03,'N','O','1996-03-27','1996-04-16','1996-03-30','NONE','REG AIR','to beans wake ac'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2951,1360,99,2,24,30272.64,0.07,0.03,'N','O','1996-03-24','1996-04-16','1996-04-08','NONE','SHIP','ironic multipliers. express, regular'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2951,1861,91,3,40,70514.40,0.02,0.07,'N','O','1996-05-03','1996-04-20','1996-05-22','COLLECT COD','REG AIR','ial deposits wake fluffily about th'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2951,722,55,4,21,34077.12,0.06,0.08,'N','O','1996-04-12','1996-04-27','1996-04-14','DELIVER IN PERSON','REG AIR','nt instructions toward the f'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2951,502,63,5,15,21037.50,0.07,0.00,'N','O','1996-03-25','1996-04-23','1996-03-27','COLLECT COD','REG AIR','inal account'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2951,1371,86,6,18,22902.66,0.06,0.00,'N','O','1996-04-04','1996-04-27','1996-04-06','COLLECT COD','FOB','ep about the final, even package'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2976,86,37,1,32,31554.56,0.06,0.00,'A','F','1994-01-26','1994-02-13','1994-02-10','NONE','MAIL','nding, ironic deposits sleep f'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2976,31,32,2,24,22344.72,0.00,0.03,'A','F','1994-03-19','1994-01-26','1994-04-18','COLLECT COD','TRUCK','ronic pinto beans. slyly bol'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2976,98,49,3,35,34933.15,0.10,0.07,'R','F','1993-12-19','1994-02-14','1994-01-11','NONE','RAIL','boost slyly about the regular, regular re'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2976,811,78,4,22,37659.82,0.00,0.04,'A','F','1994-02-08','1994-03-03','1994-02-12','TAKE BACK RETURN','FOB','ncies kindle furiously. carefull'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2976,1333,10,5,13,16046.29,0.00,0.06,'A','F','1994-02-06','1994-02-02','1994-02-19','NONE','FOB','furiously final courts boost'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2976,1084,20,6,30,29552.40,0.08,0.03,'R','F','1994-03-27','1994-02-01','1994-04-26','TAKE BACK RETURN','RAIL','c ideas! unusual'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2977,698,92,1,25,39967.25,0.03,0.07,'N','O','1996-09-21','1996-10-06','1996-10-13','TAKE BACK RETURN','RAIL','furiously pe'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2978,897,98,1,29,52138.81,0.00,0.08,'A','F','1995-06-03','1995-07-25','1995-06-06','NONE','SHIP','ecial ideas promise slyly'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2978,1270,8,2,42,49193.34,0.01,0.06,'N','O','1995-08-19','1995-07-18','1995-09-07','DELIVER IN PERSON','MAIL','ial requests nag blithely alongside of th'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2978,430,18,3,26,34591.18,0.07,0.05,'N','O','1995-07-29','1995-07-22','1995-08-20','COLLECT COD','REG AIR','as haggle against the carefully express dep'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2978,271,53,4,7,8198.89,0.00,0.00,'N','O','1995-07-18','1995-07-03','1995-07-23','NONE','FOB','. final ideas are blithe'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2978,285,67,5,33,39114.24,0.09,0.03,'R','F','1995-05-06','1995-07-23','1995-05-16','COLLECT COD','FOB','s. blithely unusual pack'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2978,1671,13,6,4,6290.68,0.08,0.04,'N','O','1995-07-06','1995-07-31','1995-07-19','COLLECT COD','AIR','ffily unusual'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2979,81,57,1,8,7848.64,0.00,0.08,'N','O','1996-06-18','1996-05-21','1996-07-06','COLLECT COD','REG AIR','st blithely; blithely regular gifts dazz'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2979,107,8,2,47,47333.70,0.05,0.00,'N','O','1996-03-25','1996-05-13','1996-04-04','TAKE BACK RETURN','SHIP','iously unusual dependencies wake across'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2979,1879,9,3,35,62330.45,0.04,0.03,'N','O','1996-05-25','1996-06-11','1996-06-24','DELIVER IN PERSON','MAIL','old ideas beneath the blit'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2979,1641,83,4,28,43193.92,0.05,0.08,'N','O','1996-06-04','1996-04-23','1996-06-24','DELIVER IN PERSON','FOB','ing, regular pinto beans. blithel'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2980,364,93,1,2,2528.72,0.09,0.03,'N','O','1996-11-18','1996-10-22','1996-11-27','TAKE BACK RETURN','SHIP','enly across the special, pending packag'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2980,96,72,2,48,47812.32,0.04,0.05,'N','O','1996-09-25','1996-12-09','1996-10-12','NONE','REG AIR','totes. regular pinto'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2980,1321,60,3,27,33002.64,0.08,0.08,'N','O','1996-12-08','1996-12-03','1996-12-14','NONE','REG AIR','theodolites cajole blithely sl'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2980,247,75,4,49,56214.76,0.03,0.02,'N','O','1996-10-04','1996-12-04','1996-10-06','NONE','RAIL','hy packages sleep quic'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2980,1861,62,5,24,42308.64,0.05,0.04,'N','O','1997-01-12','1996-10-27','1997-01-14','NONE','MAIL','elets. fluffily regular in'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2980,1087,58,6,43,42487.44,0.01,0.01,'N','O','1996-12-07','1996-11-10','1997-01-02','COLLECT COD','AIR','sts. slyly regu'); -INSERT 1 +INSERT 0 1 INSERT INTO lineitem VALUES (2981,136,15,1,17,17614.21,0.03,0.05,'N','O','1998-10-17','1998-10-02','1998-10-21','DELIVER IN PERSON','RAIL',', unusual packages x-ray. furious'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (1,'Supplier#000000001','N kD4on9OM Ipw3,gf0JBoQDd7tgrzrddZ',17,'27-918-335-1736',5755.94,'each slyly above the careful'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (2,'Supplier#000000002','89eJ5ksX3ImxJQBvxObC,',5,'15-679-861-2259',4032.68,'slyly bold instructions. idle dependen'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (3,'Supplier#000000003','q1,G3Pj6OjIuUYfUoH18BFTKP5aU9bEV3',1,'11-383-516-1199',4192.40,'blithely silent requests after the express dependencies are sl'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (4,'Supplier#000000004','Bk7ah4CK8SYQTepEmvMkkgMwg',15,'25-843-787-7479',4641.08,'riously even requests above the exp'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (5,'Supplier#000000005','Gcdm2rJRzl5qlTVzc',11,'21-151-690-3663',-283.84,'. slyly regular pinto bea'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (6,'Supplier#000000006','tQxuVm7s7CnK',14,'24-696-997-4969',1365.79,'final accounts. regular dolphins use against the furiously ironic decoys.'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (7,'Supplier#000000007','s,4TicNGB4uO6PaSqNBUq',23,'33-990-965-2201',6820.35,'s unwind silently furiously regular courts. final requests are deposits. requests wake quietly blit'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (8,'Supplier#000000008','9Sq4bBH2FQEmaFOocY45sRTxo6yuoG',17,'27-498-742-3860',7627.85,'al pinto beans. asymptotes haggl'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (9,'Supplier#000000009','1KhUgZegwM3ua7dsYmekYBsK',10,'20-403-398-8662',5302.37,'s. unusual, even requests along the furiously regular pac'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (10,'Supplier#000000010','Saygah3gYWMp72i PY',24,'34-852-489-8585',3891.91,'ing waters. regular requests ar'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (11,'Supplier#000000011','JfwTs,LZrV, M,9C',18,'28-613-996-1505',3393.08,'y ironic packages. slyly ironic accounts affix furiously; ironically unusual excuses across the flu'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (12,'Supplier#000000012','aLIW q0HYd',8,'18-179-925-7181',1432.69,'al packages nag alongside of the bold instructions. express, daring accounts'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (13,'Supplier#000000013','HK71HQyWoqRWOX8GI FpgAifW,2PoH',3,'13-727-620-7813',9107.22,'requests engage regularly instructions. furiously special requests ar'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (14,'Supplier#000000014','EXsnO5pTNj4iZRm',15,'25-656-247-5058',9189.82,'l accounts boost. fluffily bold warhorses wake'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (15,'Supplier#000000015','olXVbNBfVzRqgokr1T,Ie',8,'18-453-357-6394',308.56,'across the furiously regular platelets wake even deposits. quickly express she'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (16,'Supplier#000000016','YjP5C55zHDXL7LalK27zfQnwejdpin4AMpvh',22,'32-822-502-4215',2972.26,'ously express ideas haggle quickly dugouts? fu'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (17,'Supplier#000000017','c2d,ESHRSkK3WYnxpgw6aOqN0q',19,'29-601-884-9219',1687.81,'eep against the furiously bold ideas. fluffily bold packa'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (18,'Supplier#000000018','PGGVE5PWAMwKDZw',16,'26-729-551-1115',7040.82,'accounts snooze slyly furiously bold'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (19,'Supplier#000000019','edZT3es,nBFD8lBXTGeTl',24,'34-278-310-2731',6150.38,'refully final foxes across the dogged theodolites sleep slyly abou'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (20,'Supplier#000000020','iybAE,RmTymrZVYaFZva2SH,j',3,'13-715-945-6730',530.82,'n, ironic ideas would nag blithely about the slyly regular accounts. silent, expr'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (21,'Supplier#000000021','81CavellcrJ0PQ3CPBID0Z0JwyJm0ka5igEs',2,'12-253-590-5816',9365.80,'d. instructions integrate sometimes slyly pending instructions. accounts nag among the'); -INSERT 1 +INSERT 0 1 INSERT INTO supplier VALUES (22,'Supplier#000000022','okiiQFk 8lm6EVX6Q0,bEcO',4,'14-144-830-2814',-966.20,'ironically among the deposits. closely expre'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (1,370,'O',172799.49,'1996-01-02','5-LOW','Clerk#000000951',0,'nstructions sleep furiously among'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (2,781,'O',38426.09,'1996-12-01','1-URGENT','Clerk#000000880',0,'foxes. pending accounts at the pending, silent asymptot'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (3,1234,'F',205654.30,'1993-10-14','5-LOW','Clerk#000000955',0,'sly final accounts boost. carefully regular ideas cajole carefully. depos'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (4,1369,'O',56000.91,'1995-10-11','5-LOW','Clerk#000000124',0,'sits. slyly regular warthogs cajole. regular, regular theodolites acro'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (5,445,'F',105367.67,'1994-07-30','5-LOW','Clerk#000000925',0,'quickly. bold deposits sleep slyly. packages use slyly'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (6,557,'F',45523.10,'1992-02-21','4-NOT SPECIFIED','Clerk#000000058',0,'ggle. special, final requests are against the furiously specia'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (7,392,'O',271885.66,'1996-01-10','2-HIGH','Clerk#000000470',0,'ly special requests'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (32,1301,'O',198665.57,'1995-07-16','2-HIGH','Clerk#000000616',0,'ise blithely bold, regular requests. quickly unusual dep'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (33,670,'F',146567.24,'1993-10-27','3-MEDIUM','Clerk#000000409',0,'uriously. furiously final request'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (34,611,'O',73315.48,'1998-07-21','3-MEDIUM','Clerk#000000223',0,'ly final packages. fluffily final deposits wake blithely ideas. spe'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (35,1276,'O',194641.93,'1995-10-23','4-NOT SPECIFIED','Clerk#000000259',0,'zzle. carefully enticing deposits nag furio'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (36,1153,'O',42011.04,'1995-11-03','1-URGENT','Clerk#000000358',0,'quick packages are blithely. slyly silent accounts wake qu'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (37,862,'F',131896.49,'1992-06-03','3-MEDIUM','Clerk#000000456',0,'kly regular pinto beans. carefully unusual waters cajole never'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (38,1249,'O',71553.08,'1996-08-21','4-NOT SPECIFIED','Clerk#000000604',0,'haggle blithely. furiously express ideas haggle blithely furiously regular re'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (39,818,'O',326565.37,'1996-09-20','3-MEDIUM','Clerk#000000659',0,'ole express, ironic requests: ir'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (64,322,'F',35831.73,'1994-07-16','3-MEDIUM','Clerk#000000661',0,'wake fluffily. sometimes ironic pinto beans about the dolphin'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (65,163,'P',95469.44,'1995-03-18','1-URGENT','Clerk#000000632',0,'ular requests are blithely pending orbits-- even requests against the deposit'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (66,1292,'F',104190.66,'1994-01-20','5-LOW','Clerk#000000743',0,'y pending requests integrate'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (67,568,'O',182481.16,'1996-12-19','4-NOT SPECIFIED','Clerk#000000547',0,'symptotes haggle slyly around the furiously iron'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (68,286,'O',301968.79,'1998-04-18','3-MEDIUM','Clerk#000000440',0,'pinto beans sleep carefully. blithely ironic deposits haggle furiously acro'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (69,845,'F',204110.73,'1994-06-04','4-NOT SPECIFIED','Clerk#000000330',0,'depths atop the slyly thin deposits detect among the furiously silent accou'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (70,644,'F',125705.32,'1993-12-18','5-LOW','Clerk#000000322',0,'carefully ironic request'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (71,34,'O',260603.38,'1998-01-24','4-NOT SPECIFIED','Clerk#000000271',0,'express deposits along the blithely regul'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (96,1078,'F',64364.30,'1994-04-17','2-HIGH','Clerk#000000395',0,'oost furiously. pinto'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (97,211,'F',100572.55,'1993-01-29','3-MEDIUM','Clerk#000000547',0,'hang blithely along the regular accounts. furiously even ideas after the'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (98,1045,'F',71721.40,'1994-09-25','1-URGENT','Clerk#000000448',0,'c asymptotes. quickly regular packages should have to nag re'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (99,890,'F',108594.87,'1994-03-13','4-NOT SPECIFIED','Clerk#000000973',0,'e carefully ironic packages. pending'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (100,1471,'O',198978.27,'1998-02-28','4-NOT SPECIFIED','Clerk#000000577',0,'heodolites detect slyly alongside of the ent'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (101,280,'O',118448.39,'1996-03-17','3-MEDIUM','Clerk#000000419',0,'ding accounts above the slyly final asymptote'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (102,8,'O',184806.58,'1997-05-09','2-HIGH','Clerk#000000596',0,'slyly according to the asymptotes. carefully final packages integrate furious'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (103,292,'O',118745.16,'1996-06-20','4-NOT SPECIFIED','Clerk#000000090',0,'ges. carefully unusual instructions haggle quickly regular f'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (128,740,'F',34997.04,'1992-06-15','1-URGENT','Clerk#000000385',0,'ns integrate fluffily. ironic asymptotes after the regular excuses nag around'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (129,712,'F',254281.41,'1992-11-19','5-LOW','Clerk#000000859',0,'ing tithes. carefully pending deposits boost about the silently express'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (130,370,'F',140213.54,'1992-05-08','2-HIGH','Clerk#000000036',0,'le slyly unusual, regular packages? express deposits det'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (131,928,'F',140726.47,'1994-06-08','3-MEDIUM','Clerk#000000625',0,'after the fluffily special foxes integrate s'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (132,265,'F',133485.89,'1993-06-11','3-MEDIUM','Clerk#000000488',0,'sits are daringly accounts. carefully regular foxes sleep slyly about the'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (133,440,'O',95971.06,'1997-11-29','1-URGENT','Clerk#000000738',0,'usly final asymptotes'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (134,62,'F',208201.46,'1992-05-01','4-NOT SPECIFIED','Clerk#000000711',0,'lar theodolites boos'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (135,605,'O',230472.84,'1995-10-21','4-NOT SPECIFIED','Clerk#000000804',0,'l platelets use according t'); -INSERT 1 +INSERT 0 1 INSERT INTO orders VALUES (160,826,'O',114742.32,'1996-12-19','4-NOT SPECIFIED','Clerk#000000342',0,'thely special sauternes wake slyly of t'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (1,'Customer#000000001','IVhzIApeRb ot,c,E',15,'25-989-741-2988',711.56,'BUILDING','to the even, regular platelets. regular, ironic epitaphs nag e'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (2,'Customer#000000002','XSTf4,NCwDVaWNe6tEgvwfmRchLXak',13,'23-768-687-3665',121.65,'AUTOMOBILE','l accounts. blithely ironic theodolites integrate boldly: caref'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (3,'Customer#000000003','MG9kdTD2WBHm',1,'11-719-748-3364',7498.12,'AUTOMOBILE','deposits eat slyly ironic, even instructions. express foxes detect slyly. blithely even accounts abov'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (4,'Customer#000000004','XxVSJsLAGtn',4,'14-128-190-5944',2866.83,'MACHINERY','requests. final, regular ideas sleep final accou'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (5,'Customer#000000005','KvpyuHCplrB84WgAiGV6sYpZq7Tj',3,'13-750-942-6364',794.47,'HOUSEHOLD','n accounts will have to unwind. foxes cajole accor'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (6,'Customer#000000006','sKZz0CsnMD7mp4Xd0YrBvx,LREYKUWAh yVn',20,'30-114-968-4951',7638.57,'AUTOMOBILE','tions. even deposits boost according to the slyly bold packages. final accounts cajole requests. furious'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (7,'Customer#000000007','TcGe5gaZNgVePxU5kRrvXBfkasDTea',18,'28-190-982-9759',9561.95,'AUTOMOBILE','ainst the ironic, express theodolites. express, even pinto beans among the exp'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (8,'Customer#000000008','I0B10bB0AymmC, 0PrRYBCP1yGJ8xcBPmWhl5',17,'27-147-574-9335',6819.74,'BUILDING','among the slyly regular theodolites kindle blithely courts. carefully even theodolites haggle slyly along the ide'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (9,'Customer#000000009','xKiAFTjUsCuxfeleNqefumTrjS',8,'18-338-906-3675',8324.07,'FURNITURE','r theodolites according to the requests wake thinly excuses: pending requests haggle furiousl'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (10,'Customer#000000010','6LrEaV6KR6PLVcgl2ArL Q3rqzLzcT1 v2',5,'15-741-346-9870',2753.54,'HOUSEHOLD','es regular deposits haggle. fur'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (11,'Customer#000000011','PkWS 3HlXqwTuzrKg633BEi',23,'33-464-151-3439',-272.60,'BUILDING','ckages. requests sleep slyly. quickly even pinto beans promise above the slyly regular pinto beans.'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (12,'Customer#000000012','9PWKuhzT4Zr1Q',13,'23-791-276-1263',3396.49,'HOUSEHOLD','to the carefully final braids. blithely regular requests nag. ironic theodolites boost quickly along'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (13,'Customer#000000013','nsXQu0oVjD7PM659uC3SRSp',3,'13-761-547-5974',3857.34,'BUILDING','ounts sleep carefully after the close frays. carefully bold notornis use ironic requests. blithely'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (14,'Customer#000000014','KXkletMlL2JQEA',1,'11-845-129-3851',5266.30,'FURNITURE',', ironic packages across the unus'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (15,'Customer#000000015','YtWggXoOLdwdo7b0y,BZaGUQMLJMX1Y,EC,6Dn',23,'33-687-542-7601',2788.52,'HOUSEHOLD','platelets. regular deposits detect asymptotes. blithely unusual packages nag slyly at the fluf'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (16,'Customer#000000016','cYiaeMLZSMAOQ2 d0W,',10,'20-781-609-3107',4681.03,'FURNITURE','kly silent courts. thinly regular theodolites sleep fluffily after'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (17,'Customer#000000017','izrh 6jdqtp2eqdtbkswDD8SG4SzXruMfIXyR7',2,'12-970-682-3487',6.34,'AUTOMOBILE','packages wake! blithely even pint'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (18,'Customer#000000018','3txGO AiuFux3zT0Z9NYaFRnZt',6,'16-155-215-1315',5494.43,'BUILDING','s sleep. carefully even instructions nag furiously alongside of t'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (19,'Customer#000000019','uc,3bHIx84H,wdrmLOjVsiqXCq2tr',18,'28-396-526-5053',8914.71,'HOUSEHOLD','nag. furiously careful packages are slyly at the accounts. furiously regular in'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (20,'Customer#000000020','JrPk8Pqplj4Ne',22,'32-957-234-8742',7603.40,'FURNITURE','g alongside of the special excuses-- fluffily enticing packages wake'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (21,'Customer#000000021','XYmVpr9yAHDEn',8,'18-902-614-8344',1428.25,'MACHINERY','quickly final accounts integrate blithely furiously u'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (22,'Customer#000000022','QI6p41,FNs5k7RZoCCVPUTkUdYpB',3,'13-806-545-9701',591.98,'MACHINERY','s nod furiously above the furiously ironic ideas.'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (23,'Customer#000000023','OdY W13N7Be3OC5MpgfmcYss0Wn6TKT',3,'13-312-472-8245',3332.02,'HOUSEHOLD','deposits. special deposits cajole slyly. fluffily special deposits about the furiously'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (24,'Customer#000000024','HXAFgIAyjxtdqwimt13Y3OZO 4xeLe7U8PqG',13,'23-127-851-8031',9255.67,'MACHINERY','into beans. fluffily final ideas haggle fluffily'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (25,'Customer#000000025','Hp8GyFQgGHFYSilH5tBfe',12,'22-603-468-3533',7133.70,'FURNITURE','y. accounts sleep ruthlessly according to the regular theodolites. unusual instructions sleep. ironic, final'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (26,'Customer#000000026','8ljrc5ZeMl7UciP',22,'32-363-455-4837',5182.05,'AUTOMOBILE','c requests use furiously ironic requests. slyly ironic dependencies us'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (27,'Customer#000000027','IS8GIyxpBrLpMT0u7',3,'13-137-193-2709',5679.84,'BUILDING','about the carefully ironic pinto beans. accoun'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (28,'Customer#000000028','iVyg0daQ,Tha8x2WPWA9m2529m',8,'18-774-241-1462',1007.18,'FURNITURE','along the regular deposits. furiously final pac'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (29,'Customer#000000029','sJ5adtfyAkCK63df2,vF25zyQMVYE34uh',0,'10-773-203-7342',7618.27,'FURNITURE','its after the carefully final platelets x-ray against'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (30,'Customer#000000030','nJDsELGAavU63Jl0c5NKsKfL8rIJQQkQnYL2QJY',1,'11-764-165-5076',9321.01,'BUILDING','lithely final requests. furiously unusual account'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (31,'Customer#000000031','LUACbO0viaAv6eXOAebryDB xjVst',23,'33-197-837-7094',5236.89,'HOUSEHOLD','s use among the blithely pending depo'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (32,'Customer#000000032','jD2xZzi UmId,DCtNBLXKj9q0Tlp2iQ6ZcO3J',15,'25-430-914-2194',3471.53,'BUILDING','cial ideas. final, furious requests across the e'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (33,'Customer#000000033','qFSlMuLucBmx9xnn5ib2csWUweg D',17,'27-375-391-1280',-78.56,'AUTOMOBILE','s. slyly regular accounts are furiously. carefully pending requests'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (34,'Customer#000000034','Q6G9wZ6dnczmtOx509xgE,M2KV',15,'25-344-968-5422',8589.70,'HOUSEHOLD','nder against the even, pending accounts. even'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (35,'Customer#000000035','TEjWGE4nBzJL2',17,'27-566-888-7431',1228.24,'HOUSEHOLD','requests. special, express requests nag slyly furiousl'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (36,'Customer#000000036','3TvCzjuPzpJ0,DdJ8kW5U',21,'31-704-669-5769',4987.27,'BUILDING','haggle. enticing, quiet platelets grow quickly bold sheaves. carefully regular acc'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (37,'Customer#000000037','7EV4Pwh,3SboctTWt',8,'18-385-235-7162',-917.75,'FURNITURE','ilent packages are carefully among the deposits. furiousl'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (38,'Customer#000000038','a5Ee5e9568R8RLP 2ap7',12,'22-306-880-7212',6345.11,'HOUSEHOLD','lar excuses. closely even asymptotes cajole blithely excuses. carefully silent pinto beans sleep carefully fin'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (39,'Customer#000000039','nnbRg,Pvy33dfkorYE FdeZ60',2,'12-387-467-6509',6264.31,'AUTOMOBILE','tions. slyly silent excuses slee'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (40,'Customer#000000040','gOnGWAyhSV1ofv',3,'13-652-915-8939',1335.30,'BUILDING','rges impress after the slyly ironic courts. foxes are. blithely'); -INSERT 1 +INSERT 0 1 INSERT INTO customer VALUES (41,'Customer#000000041','IM9mzmyoxeBmvNw8lA7G3Ydska2nkZF',10,'20-917-711-4011',270.95,'HOUSEHOLD','ly regular accounts hang bold, silent packages. unusual foxes haggle slyly above the special, final depo'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (0,'ALGERIA',0,'haggle. carefully final deposits detect slyly agai'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (1,'ARGENTINA',1,'al foxes promise slyly according to the regular accounts. bold requests alon'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (2,'BRAZIL',1,'y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (3,'CANADA',1,'eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (4,'EGYPT',4,'y above the carefully unusual theodolites. final dugouts are quickly across the furiously regular d'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (5,'ETHIOPIA',0,'ven packages wake quickly. regu'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (6,'FRANCE',3,'refully final requests. regular, ironi'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (7,'GERMANY',3,'l platelets. regular accounts x-ray: unusual, regular acco'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (8,'INDIA',2,'ss excuses cajole slyly across the packages. deposits print aroun'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (9,'INDONESIA',2,'slyly express asymptotes. regular deposits haggle slyly. carefully ironic hockey players sleep blithely. carefull'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (10,'IRAN',4,'efully alongside of the slyly final dependencies.'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (11,'IRAQ',4,'nic deposits boost atop the quickly final requests? quickly regula'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (12,'JAPAN',2,'ously. final, express gifts cajole a'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (13,'JORDAN',4,'ic deposits are blithely about the carefully regular pa'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (14,'KENYA',0,'pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (15,'MOROCCO',0,'rns. blithely bold courts among the closely regular packages use furiously bold platelets?'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (16,'MOZAMBIQUE',0,'s. ironic, unusual asymptotes wake blithely r'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (17,'PERU',1,'platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (18,'CHINA',2,'c dependencies. furiously express notornis sleep slyly regular accounts. ideas sleep. depos'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (19,'ROMANIA',3,'ular asymptotes are about the furious multipliers. express dependencies nag above the ironically ironic account'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (20,'SAUDI ARABIA',4,'ts. silent requests haggle. closely express packages sleep across the blithely'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (21,'VIETNAM',2,'hely enticingly express accounts. even, final'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (22,'RUSSIA',3,'requests against the platelets use never according to the quickly regular pint'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (23,'UNITED KINGDOM',3,'eans boost carefully special requests. accounts are. carefull'); -INSERT 1 +INSERT 0 1 INSERT INTO nation VALUES (24,'UNITED STATES',1,'y final packages. slow foxes cajole quickly. quickly silent platelets breach ironic accounts. unusual pinto be'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (1,2,3325,771.64,', even theodolites. regular, final theodolites eat after the carefully pending foxes. furiously regular deposits sleep slyly. carefully bold realms above the ironic dependencies haggle careful'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (1,27,8076,993.49,'ven ideas. quickly even packages print. pending multipliers must have to are fluff'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (1,52,3956,337.09,'after the fluffily ironic deposits? blithely special dependencies integrate furiously even excuses. blithely silent theodolites could have to haggle pending, express requests; fu'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (1,77,4069,357.84,'al, regular dependencies serve carefully after the quickly final pinto beans. furiously even deposits sleep quickly final, silent pinto beans. fluffily reg'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (2,3,8895,378.49,'nic accounts. final accounts sleep furiously about the ironic, bold packages. regular, regular accounts'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (2,28,4969,915.27,'ptotes. quickly pending dependencies integrate furiously. fluffily ironic ideas impress blithely above the express accounts. furiously even epitaphs need to wak'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (2,53,8539,438.37,'blithely bold ideas. furiously stealthy packages sleep fluffily. slyly special deposits snooze furiously carefully regular accounts. regular deposits according to the accounts nag carefully slyl'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (2,78,3025,306.39,'olites. deposits wake carefully. even, express requests cajole. carefully regular ex'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (3,4,4651,920.92,'ilent foxes affix furiously quickly unusual requests. even packages across the carefully even theodolites nag above the sp'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (3,29,4093,498.13,'ending dependencies haggle fluffily. regular deposits boost quickly carefully regular requests. deposits affix furiously around the pinto beans. ironic, unusual platelets across the p'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (3,54,3917,645.40,'of the blithely regular theodolites. final theodolites haggle blithely carefully unusual ideas. blithely even f'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (3,79,9942,191.92,'unusual, ironic foxes according to the ideas detect furiously alongside of the even, express requests. blithely regular the'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (4,5,1339,113.97,'carefully unusual ideas. packages use slyly. blithely final pinto beans cajole along the furiously express requests. regular orbits haggle carefully. care'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (4,30,6377,591.18,'ly final courts haggle carefully regular accounts. carefully regular accounts could integrate slyly. slyly express packages about the accounts wake slyly'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (4,55,2694,51.37,'g, regular deposits: quick instructions run across the carefully ironic theodolites-- final dependencies haggle into the dependencies. f'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (4,80,2480,444.37,'requests sleep quickly regular accounts. theodolites detect. carefully final depths w'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (5,6,3735,255.88,'arefully even requests. ironic requests cajole carefully even dolphin'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (5,31,9653,50.52,'y stealthy deposits. furiously final pinto beans wake furiou'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (5,56,1329,219.83,'iously regular deposits wake deposits. pending pinto beans promise ironic dependencies. even, regular pinto beans integrate'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (5,81,6925,537.98,'sits. quickly fluffy packages wake quickly beyond the blithely regular requests. pending requests cajole among the final pinto beans. carefully busy theodolites affix quickly stealthily'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (6,7,8851,130.72,'usly final packages. slyly ironic accounts poach across the even, sly requests. carefully pending request'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (6,32,1627,424.25,'quick packages. ironic deposits print. furiously silent platelets across the carefully final requests are slyly along the furiously even instructi'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (6,57,3336,642.13,'final instructions. courts wake packages. blithely unusual realms along the multipliers nag'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (6,82,6451,175.32,'accounts alongside of the slyly even accounts wake carefully final instructions-- ruthless platelets wake carefully ideas. even deposits are quickly final,'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (7,8,7454,763.98,'y express tithes haggle furiously even foxes. furiously ironic deposits sleep toward the furiously unusual'); -INSERT 1 +INSERT 0 1 INSERT INTO partsupp VALUES (7,33,2770,149.66,'hould have to nag after the blithely final asymptotes. fluffily spe'); -INSERT 1 +INSERT 0 1 diff --git a/src/test/isolation2/expected/deadlock_under_entry_db_singleton.out b/src/test/isolation2/expected/deadlock_under_entry_db_singleton.out index d097b84db6e..8fa6bb422b9 100644 --- a/src/test/isolation2/expected/deadlock_under_entry_db_singleton.out +++ b/src/test/isolation2/expected/deadlock_under_entry_db_singleton.out @@ -22,9 +22,9 @@ -- the table to ao table here. CREATE TABLE deadlock_entry_db_singleton_table (c int, d int) WITH (appendonly=true); -CREATE +CREATE TABLE INSERT INTO deadlock_entry_db_singleton_table select i, i+1 from generate_series(1,10) i; -INSERT 10 +INSERT 0 10 -- Function that needs ExclusiveLock on a table. Use a non-SQL -- language for this function so that parser cannot understand its @@ -32,7 +32,7 @@ INSERT 10 -- of the function. If the lock is acquired during plan generation of -- the calling SQL statement, we don't get the deadlock. CREATE FUNCTION function_volatile(x int) RETURNS int AS $$ /*in func*/ BEGIN /*in func*/ UPDATE deadlock_entry_db_singleton_table SET d = d + 1 WHERE c = $1; /*in func*/ RETURN $1 + 1; /*in func*/ END $$ /*in func*/ LANGUAGE plpgsql VOLATILE MODIFIES SQL DATA; -CREATE +CREATE FUNCTION -- inject fault on QD select gp_inject_fault('transaction_start_under_entry_db_singleton', 'reset', 1); diff --git a/src/test/isolation2/expected/disable_autovacuum.out b/src/test/isolation2/expected/disable_autovacuum.out index 409e40bbd2b..382fe3cac90 100644 --- a/src/test/isolation2/expected/disable_autovacuum.out +++ b/src/test/isolation2/expected/disable_autovacuum.out @@ -1,5 +1,5 @@ alter system set autovacuum = off; -ALTER +ALTER SYSTEM select gp_segment_id, pg_reload_conf() from gp_id union select gp_segment_id, pg_reload_conf() from gp_dist_random('gp_id'); gp_segment_id | pg_reload_conf ---------------+---------------- diff --git a/src/test/isolation2/expected/distributed_transactions.out b/src/test/isolation2/expected/distributed_transactions.out index 1135a126d13..d2278385273 100644 --- a/src/test/isolation2/expected/distributed_transactions.out +++ b/src/test/isolation2/expected/distributed_transactions.out @@ -9,7 +9,7 @@ SELECT gp_inject_fault( 'abort_after_procarray_end', 'error', 1); BEGIN; BEGIN CREATE TABLE test_xact_abort_failure(a int); -CREATE +CREATE TABLE ABORT; ERROR: fault triggered, fault name:'abort_after_procarray_end' fault type:'error' SELECT gp_inject_fault( 'abort_after_procarray_end', 'reset', 1); @@ -27,9 +27,9 @@ SELECT gp_inject_fault( 'abort_after_procarray_end', 'error', dbid) from gp_segm BEGIN; BEGIN CREATE TABLE test_xact_abort_failure(a int); -CREATE +CREATE TABLE ABORT; -ABORT +ROLLBACK SELECT gp_inject_fault( 'abort_after_procarray_end', 'reset', dbid) from gp_segment_configuration where role = 'p' and content = 0; gp_inject_fault ----------------- @@ -45,7 +45,7 @@ SELECT gp_inject_fault( 'abort_after_procarray_end', 'error', dbid) from gp_segm 0U: BEGIN; BEGIN 0U: CREATE TABLE test_xact_abort_failure(a int); -CREATE +CREATE TABLE 0U: ABORT; ERROR: fault triggered, fault name:'abort_after_procarray_end' fault type:'error' SELECT gp_inject_fault( 'abort_after_procarray_end', 'reset', dbid) from gp_segment_configuration where role = 'p' and content = 0; diff --git a/src/test/isolation2/expected/distributedlog-bug.out b/src/test/isolation2/expected/distributedlog-bug.out index 829c96b3dc5..6b716726a92 100644 --- a/src/test/isolation2/expected/distributedlog-bug.out +++ b/src/test/isolation2/expected/distributedlog-bug.out @@ -6,7 +6,7 @@ -- in-progress. -- CREATE TABLE distributed_snapshot_test ( id INTEGER, f FLOAT); -CREATE +CREATE TABLE 1: BEGIN; BEGIN @@ -27,7 +27,7 @@ SET -- Drop table in a transaction 1: drop table distributed_snapshot_test; -DROP +DROP TABLE 3: vacuum pg_class; VACUUM diff --git a/src/test/isolation2/expected/drop_rename.out b/src/test/isolation2/expected/drop_rename.out index af0916cb293..96cdb5bb428 100644 --- a/src/test/isolation2/expected/drop_rename.out +++ b/src/test/isolation2/expected/drop_rename.out @@ -5,17 +5,17 @@ -- relation does not exist error. 1:drop table if exists t1; -DROP +DROP TABLE 1:drop table if exists newt1; -DROP +DROP TABLE 1:create table t1 (a int, b text) distributed by (a); -CREATE +CREATE TABLE 1:insert into t1 select i, 'abc '||i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 1:begin; BEGIN 1:alter table t1 rename to newt1; -ALTER +ALTER TABLE 1:analyze newt1; ANALYZE -- this drop should block to acquire AccessExclusive lock on t1's OID. @@ -32,17 +32,17 @@ ERROR: table "t1" does not exist -- DROP is executed concurrently with ALTER RENAME but not ANALYZE. 1:drop table if exists t2; -DROP +DROP TABLE 1:drop table if exists newt2; -DROP +DROP TABLE 1:create table t2 (a int, b text) distributed by (a); -CREATE +CREATE TABLE 1:insert into t2 select i, 'pqr '||i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 1:begin; BEGIN 1:alter table t2 rename to newt2; -ALTER +ALTER TABLE 2&:drop table t2; 1:commit; COMMIT @@ -57,20 +57,20 @@ ERROR: table "t2" does not exist -- The same, but with DROP IF EXISTS. (We used to have a bug, where the DROP -- command found and drop the relation in the segments, but not in master.) 1:drop table if exists t3; -DROP +DROP TABLE 1:create table t3 (a int, b text) distributed by (a); -CREATE +CREATE TABLE 1:insert into t3 select i, '123 '||i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 1:begin; BEGIN 1:alter table t3 rename to t3_new; -ALTER +ALTER TABLE 2&:drop table if exists t3; 1:commit; COMMIT 2<: <... completed> -DROP +DROP TABLE 2:select count(*) from t3; ERROR: relation "t3" does not exist LINE 1: select count(*) from t3; @@ -89,15 +89,15 @@ LINE 1: select count(*) from t3; (3 rows) 1:drop table if exists t3; -DROP +DROP TABLE 1:create table t3 (a int, b text) distributed by (a); -CREATE +CREATE TABLE 1:insert into t3 select i, '123 '||i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 1:begin; BEGIN 1:drop table t3; -DROP +DROP TABLE 2&:drop table if exists t3; 3&:drop table t3; 1:commit; @@ -105,7 +105,7 @@ COMMIT 3<: <... completed> ERROR: table "t3" does not exist 2<: <... completed> -DROP +DROP TABLE 2:select count(*) from t3; ERROR: relation "t3" does not exist LINE 1: select count(*) from t3; diff --git a/src/test/isolation2/expected/enable_autovacuum.out b/src/test/isolation2/expected/enable_autovacuum.out index 90c866cb6dc..c8a4aec3dc4 100644 --- a/src/test/isolation2/expected/enable_autovacuum.out +++ b/src/test/isolation2/expected/enable_autovacuum.out @@ -1,5 +1,5 @@ alter system set autovacuum = on; -ALTER +ALTER SYSTEM select gp_segment_id, pg_reload_conf() from gp_id union select gp_segment_id, pg_reload_conf() from gp_dist_random('gp_id'); gp_segment_id | pg_reload_conf ---------------+---------------- diff --git a/src/test/isolation2/expected/execute_on_utilitymode.out b/src/test/isolation2/expected/execute_on_utilitymode.out index 84c397c7776..8d6d24d823f 100644 --- a/src/test/isolation2/expected/execute_on_utilitymode.out +++ b/src/test/isolation2/expected/execute_on_utilitymode.out @@ -4,17 +4,17 @@ -- First, create test functions with different EXECUTE ON options -create function srf_on_master () returns setof text as $$ begin /* in func */ return next 'foo ' || current_setting('gp_contentid'); /* in func */ return next 'bar ' || current_setting('gp_contentid'); /* in func */ end; /* in func */ $$ language plpgsql EXECUTE ON COORDINATOR; -CREATE +create function srf_on_coordinator () returns setof text as $$ begin /* in func */ return next 'foo ' || current_setting('gp_contentid'); /* in func */ return next 'bar ' || current_setting('gp_contentid'); /* in func */ end; /* in func */ $$ language plpgsql EXECUTE ON COORDINATOR; +CREATE FUNCTION create function srf_on_all_segments () returns setof text as $$ begin /* in func */ return next 'foo ' || current_setting('gp_contentid'); /* in func */ return next 'bar ' || current_setting('gp_contentid'); /* in func */ end; /* in func */ $$ language plpgsql EXECUTE ON ALL SEGMENTS; -CREATE +CREATE FUNCTION create function srf_on_any () returns setof text as $$ begin /* in func */ return next 'foo ' || current_setting('gp_contentid'); /* in func */ return next 'bar ' || current_setting('gp_contentid'); /* in func */ end; /* in func */ $$ language plpgsql EXECUTE ON ANY IMMUTABLE; -CREATE +CREATE FUNCTION create function srf_on_initplan () returns setof text as $$ begin /* in func */ return next 'foo ' || current_setting('gp_contentid'); /* in func */ return next 'bar ' || current_setting('gp_contentid'); /* in func */ end; /* in func */ $$ language plpgsql EXECUTE ON INITPLAN; -CREATE +CREATE FUNCTION -- Now try executing them in utility mode, in the master node and on a -- segment. The expected behavior is that the function runs on the node @@ -23,9 +23,9 @@ CREATE -- Join with a table, to give the planner something more exciting to do -- than just create the FunctionScan plan. create table fewrows (t text) distributed by (t); -CREATE +CREATE TABLE insert into fewrows select g from generate_series(1, 10) g; -INSERT 10 +INSERT 0 10 -1U: select * from srf_on_master() as srf (x) left join fewrows on x = t; x | t diff --git a/src/test/isolation2/expected/export_distributed_snapshot.out b/src/test/isolation2/expected/export_distributed_snapshot.out index d9270f20e30..fcd8dd58442 100644 --- a/src/test/isolation2/expected/export_distributed_snapshot.out +++ b/src/test/isolation2/expected/export_distributed_snapshot.out @@ -10,31 +10,31 @@ -- start_ignore DROP FUNCTION IF EXISTS corrupt_snapshot_file(text, text); -DROP +DROP FUNCTION DROP FUNCTION IF EXISTS snapshot_file_ds_fields_exist(text); -DROP -DROP LANGUAGE IF EXISTS plpython3u; -DROP +DROP FUNCTION +DROP LANGUAGE IF EXISTS plpython3u cascade; +DROP LANGUAGE DROP TABLE IF EXISTS export_distributed_snapshot_test1; -DROP +DROP TABLE +-- end_ignore CREATE LANGUAGE plpython3u; -CREATE --- end_ignore +CREATE LANGUAGE -- Corrupt field entry for given snapshot file CREATE OR REPLACE FUNCTION corrupt_snapshot_file(token text, field text) RETURNS integer as $$ import os content = bytearray() query = "select (select datadir from gp_segment_configuration where role='p' and content=-1) || '/pg_snapshots/' as path" rv = plpy.execute(query) abs_path = rv[0]['path'] snapshot_file = abs_path + token if not os.path.isfile(snapshot_file): plpy.info('skipping non-existent file %s' % (snapshot_file)) else: plpy.info('corrupting file %s for field %s' % (snapshot_file, field)) with open(snapshot_file , "rb+") as f: for line in f: l = line.decode() id = l.split(":")[0] if field == id: corrupt = l[:-2] + '*' + l[len(l)-1:] content.extend(corrupt.encode()) else: content.extend(line) f.seek(0) f.truncate f.write(content) f.close() return 0 $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION -- Determine if field exists for given snapshot file CREATE OR REPLACE FUNCTION snapshot_file_ds_fields_exist(token text) RETURNS boolean as $$ import os content = bytearray() query = "select (select datadir from gp_segment_configuration where role='p' and content=-1) || '/pg_snapshots/' as path" rv = plpy.execute(query) abs_path = rv[0]['path'] snapshot_file = abs_path + token if not os.path.isfile(snapshot_file): plpy.info('snapshot file %s does not exist' % (snapshot_file)) return -1 else: plpy.info('checking file %s for ds fields' % (snapshot_file)) with open(snapshot_file , "rb+") as f: for line in f: l = line.decode() if "ds" in l: return True return False $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION -- INSERT test CREATE TABLE export_distributed_snapshot_test1 (a int); -CREATE +CREATE TABLE INSERT INTO export_distributed_snapshot_test1 values(1); -INSERT 1 +INSERT 0 1 1: BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN @@ -45,7 +45,7 @@ BEGIN (1 row) INSERT INTO export_distributed_snapshot_test1 values(2); -INSERT 1 +INSERT 0 1 SELECT * FROM export_distributed_snapshot_test1; a --- @@ -81,9 +81,9 @@ COMMIT -- DELETE test CREATE TABLE export_distributed_snapshot_test2 (a int); -CREATE +CREATE TABLE INSERT INTO export_distributed_snapshot_test2 SELECT a FROM generate_series(1,3) a; -INSERT 3 +INSERT 0 3 1: BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN @@ -134,9 +134,9 @@ COMMIT -- UPDATE test CREATE TABLE export_distributed_snapshot_test3 (a int); -CREATE +CREATE TABLE INSERT INTO export_distributed_snapshot_test3 SELECT a FROM generate_series(1,5) a; -INSERT 5 +INSERT 0 5 1: BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN @@ -187,7 +187,7 @@ COMMIT -- DROP test CREATE TABLE export_distributed_snapshot_test4 (a int); -CREATE +CREATE TABLE 1: BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN @@ -209,7 +209,7 @@ BEGIN -- Drop table in transaction 2: DROP TABLE export_distributed_snapshot_test4; -DROP +DROP TABLE 2: COMMIT; COMMIT @@ -263,9 +263,9 @@ ERROR: could not import the requested snapshot DETAIL: The source process with PID 651456 is not running anymore. 1: END; -END +COMMIT 2: END; -END +ROLLBACK -- dsxminall @@ -292,9 +292,9 @@ BEGIN SET 1: END; -END +COMMIT 2: END; -END +COMMIT -- dsxmin 1: BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; @@ -320,9 +320,9 @@ BEGIN ERROR: invalid snapshot data in file "pg_snapshots/00000007-00000006-1" 1: END; -END +COMMIT 2: END; -END +ROLLBACK -- Test export snapshot in utility mode does not export distributed snapshot fields @@ -345,7 +345,7 @@ BEGIN -1Uq: ... 1: END; -END +COMMIT -- Test import snapshot in utility mode fails if distributed snapshot fields exist 1: BEGIN; @@ -367,7 +367,7 @@ HINT: export the snapshot in utility mode -1Uq: ... 1: END; -END +COMMIT -- Test export snapshot in utility mode and import snapshot in utility mode succeeds -1U: @db_name postgres: BEGIN; diff --git a/src/test/isolation2/expected/frozen_insert_crash.out b/src/test/isolation2/expected/frozen_insert_crash.out index bf41eebf750..334f2dbf389 100644 --- a/src/test/isolation2/expected/frozen_insert_crash.out +++ b/src/test/isolation2/expected/frozen_insert_crash.out @@ -13,7 +13,7 @@ -- the WAL record responsible for updating it to frozen. -- After crash recovery, the insert will follow regular MVCC and not be seen. 1: create table tab_fi(a int) with (appendoptimized=true) distributed replicated; -CREATE +CREATE TABLE -- switch WAL on seg0 to reduce flakiness 1: select gp_segment_id, pg_switch_wal() is not null from gp_dist_random('gp_id') where gp_segment_id = 0; @@ -100,12 +100,12 @@ RESET RESET 1: drop table tab_fi; -DROP +DROP TABLE -- Case 2. crash after we have flushed the WAL that updates the row to be frozen. -- After crash recovery, the insert should be seen. 1: create table tab_fi(a int) with (appendoptimized=true) distributed replicated; -CREATE +CREATE TABLE -- switch WAL on seg0 to reduce flakiness 1: select gp_segment_id, pg_switch_wal() is not null from gp_dist_random('gp_id') where gp_segment_id = 0; @@ -245,20 +245,22 @@ END (2 rows) -- Same set of tests for bitmap LOV insert. +create extension if not exists pageinspect; +CREATE EXTENSION -- Function to check the bitmap lov content regarding the column 'b' -- which is the table column that we will have bitmap created on. -- Basically, we want to see if "SELECT b FROM pg_bitmapindex.pg_bm_xxx" -- returns the same result in seqscan and indexscan. CREATE OR REPLACE FUNCTION insert_bm_lov_res() RETURNS void AS $$ DECLARE lov_table text; /* in func */ sql text; /* in func */ BEGIN /* in func */ drop table if exists bm_lov_res; /* in func */ create temp table bm_lov_res(b int); /* in func */ SELECT c.relname INTO lov_table /* in func */ FROM bm_metap('tab_fi_idx') b /* in func */ JOIN pg_class c ON b.auxrelid = c.oid; /* in func */ sql := format('INSERT INTO bm_lov_res SELECT b FROM pg_bitmapindex.%I', lov_table); /* in func */ EXECUTE sql; /* in func */ END; /* in func */ $$ LANGUAGE plpgsql; -CREATE +CREATE FUNCTION 1: create table tab_fi(a int, b int) with (appendoptimized=true) distributed replicated; -CREATE +CREATE TABLE 1: create index tab_fi_idx on tab_fi using bitmap(b); -CREATE +CREATE INDEX 1: insert into tab_fi values(1, 1); -INSERT 1 +INSERT 0 1 -- switch WAL on seg0 to reduce flakiness 1: select gp_segment_id, pg_switch_wal() is not null from gp_dist_random('gp_id') where gp_segment_id = 0; gp_segment_id | ?column? @@ -345,16 +347,16 @@ SET (1 row) 0Uq: ... 1: drop table tab_fi; -DROP +DROP TABLE -- case 2: suspend and flush WAL after freezing the tuple 1: create table tab_fi(a int, b int) with (appendoptimized=true) distributed replicated; -CREATE +CREATE TABLE 1: create index tab_fi_idx on tab_fi using bitmap(b); -CREATE +CREATE INDEX 1: insert into tab_fi values(1, 1); -INSERT 1 +INSERT 0 1 -- switch WAL on seg0 to reduce flakiness 1: select gp_segment_id, pg_switch_wal() is not null from gp_dist_random('gp_id') where gp_segment_id = 0; gp_segment_id | ?column? @@ -441,6 +443,50 @@ SET 2 (2 rows) +1: drop extension pageinspect; +DROP EXTENSION + +-- Test for aoseg: suspend the insert into aoseg table before we mark the row frozen. +-- Another session should still be able to choose a different segno. +1: create table tab_aoseg(a int) using ao_row; +CREATE TABLE +1: select gp_inject_fault('insert_aoseg_before_freeze', 'suspend', dbid) from gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault +----------------- + Success: +(1 row) +1: begin; +BEGIN +1>: insert into tab_aoseg select * from generate_series(1,10); +-- wait until the aoseg record is inserted but not yet frozen +2: select gp_wait_until_triggered_fault('insert_aoseg_before_freeze', 1, dbid) from gp_segment_configuration where role = 'p' and content = 0; + gp_wait_until_triggered_fault +------------------------------- + Success: +(1 row) +2: begin; +BEGIN +2>: insert into tab_aoseg select * from generate_series(1,10); +3: select gp_inject_fault('insert_aoseg_before_freeze', 'reset', dbid) from gp_segment_configuration where role = 'p' and content = 0; + gp_inject_fault +----------------- + Success: +(1 row) +1<: <... completed> +INSERT 0 10 +2<: <... completed> +INSERT 0 10 +1: end; +COMMIT +2: end; +COMMIT +3: select segment_id, segno, eof from gp_toolkit.__gp_aoseg('tab_aoseg') where segment_id = 0; + segment_id | segno | eof +------------+-------+----- + 0 | 1 | 88 + 0 | 2 | 88 +(2 rows) + -- validate that we've actually tested desired scan method -- for some reason this disrupts the output of subsequent queries so -- validating at the end here diff --git a/src/test/isolation2/expected/fsync_ao.out b/src/test/isolation2/expected/fsync_ao.out index 4f2a466507a..c4dbaae74ae 100644 --- a/src/test/isolation2/expected/fsync_ao.out +++ b/src/test/isolation2/expected/fsync_ao.out @@ -21,17 +21,17 @@ (exited with code 0) create table fsync_ao(a int, b int) with (appendoptimized = true) distributed by (a); -CREATE +CREATE TABLE create table fsync_co(a int, b int) with (appendoptimized = true, orientation = column) distributed by (a); -CREATE +CREATE TABLE -- no fsync requests should ever be registered for unlogged tables create unlogged table ul_fsync_co(a int, b int, c int) using ao_column distributed by (a); -CREATE +CREATE TABLE insert into fsync_ao select i, i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 insert into fsync_co select i, i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 -- Fault to check that mirror has flushed pending fsync requests. select gp_inject_fault_infinite('restartpoint_guts', 'skip', dbid) from gp_segment_configuration where role = 'm' and content = 0; @@ -66,11 +66,11 @@ select gp_inject_fault_infinite('ao_fsync_counter', 'skip', dbid) from gp_segmen -- Write ao and co data files including aoseg & gp_fastsequence. -- These should be fsync-ed by checkpoint & restartpoint. insert into fsync_ao select i, i from generate_series(1,20)i; -INSERT 20 +INSERT 0 20 insert into fsync_co select i, i from generate_series(1,20)i; -INSERT 20 +INSERT 0 20 insert into ul_fsync_co select i, i, i from generate_series(1,20)i; -INSERT 20 +INSERT 0 20 checkpoint; CHECKPOINT @@ -103,19 +103,19 @@ select gp_inject_fault('ao_fsync_counter', 'status', dbid) from gp_segment_confi 1: begin; BEGIN 1: insert into fsync_ao select i, i from generate_series(1,20)i; -INSERT 20 +INSERT 0 20 1: insert into fsync_co select i, i from generate_series(1,20)i; -INSERT 20 +INSERT 0 20 1: insert into ul_fsync_co select i, i, i from generate_series(1,20)i; -INSERT 20 +INSERT 0 20 insert into fsync_ao select i, i from generate_series(21,40)i; -INSERT 20 +INSERT 0 20 insert into fsync_co select i, i from generate_series(21,40)i; -INSERT 20 +INSERT 0 20 insert into ul_fsync_co select i, i, i from generate_series(1,40)i; -INSERT 40 +INSERT 0 40 1: end; -END +COMMIT -- Generate some invisible tuples in both the tables so as to trigger -- compaction during vacuum. delete from fsync_ao where a > 20; @@ -207,23 +207,23 @@ select gp_inject_fault('ao_fsync_counter', 'status', dbid) from gp_segment_confi update fsync_co set b = -a; UPDATE 70 drop table fsync_co; -DROP +DROP TABLE update ul_fsync_co set c = -a; UPDATE 23 drop table ul_fsync_co; -DROP +DROP TABLE -- Drop but don't commit the transaction. begin; BEGIN update fsync_ao set b = -a; UPDATE 50 drop table fsync_ao; -DROP +DROP TABLE abort; -ABORT +ROLLBACK -- Fsync request for the following insert should not be forgotten. insert into fsync_ao select * from generate_series(41,60)i; -INSERT 20 +INSERT 0 20 checkpoint; CHECKPOINT @@ -244,8 +244,8 @@ select gp_wait_until_triggered_fault('ao_fsync_counter', 13, dbid) from gp_segme select gp_inject_fault('ao_fsync_counter', 'status', dbid) from gp_segment_configuration where content=0 and role='m'; gp_inject_fault ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - Success: fault name:'ao_fsync_counter' fault type:'skip' ddl statement:'' database name:'' table name:'' start occurrence:'1' end occurrence:'-1' extra arg:'0' fault injection state:'triggered' num times hit:'13' + (1 row) -- Reset all faults. diff --git a/src/test/isolation2/expected/fts_errors.out b/src/test/isolation2/expected/fts_errors.out index 69cb7a2a38c..fca1ecaf5d8 100644 --- a/src/test/isolation2/expected/fts_errors.out +++ b/src/test/isolation2/expected/fts_errors.out @@ -27,8 +27,8 @@ (exited with code 0) -- Helper function -CREATE or REPLACE FUNCTION wait_until_segments_are_down(num_segs int) RETURNS bool AS $$ declare retries int; /* in func */ begin /* in func */ retries := 120; /* in func */ loop /* in func */ if (select count(*) = num_segs from gp_segment_configuration where status = 'd') then /* in func */ return true; /* in func */ end if; /* in func */ if retries <= 0 then /* in func */ return false; /* in func */ end if; /* in func */ perform pg_sleep(1); /* in func */ retries := retries - 1; /* in func */ end loop; /* in func */ end; /* in func */ $$ language plpgsql; -CREATE +CREATE or REPLACE FUNCTION wait_until_segments_are_down(num_segs int) RETURNS bool AS $$ declare retries int; /* in func */ begin /* in func */ retries := 1200; /* in func */ loop /* in func */ if (select count(*) = num_segs from gp_segment_configuration where status = 'd') then /* in func */ return true; /* in func */ end if; /* in func */ if retries <= 0 then /* in func */ return false; /* in func */ end if; /* in func */ perform pg_sleep(0.1); /* in func */ retries := retries - 1; /* in func */ end loop; /* in func */ end; /* in func */ $$ language plpgsql; +CREATE FUNCTION -- no segment down. select count(*) from gp_segment_configuration where status = 'd'; @@ -38,34 +38,34 @@ select count(*) from gp_segment_configuration where status = 'd'; (1 row) drop table if exists fts_errors_test; -DROP +DROP TABLE create table fts_errors_test(a int); -CREATE +CREATE TABLE 1:BEGIN; BEGIN 1:END; -END +COMMIT 2:BEGIN; BEGIN 2:INSERT INTO fts_errors_test SELECT * FROM generate_series(1,100); -INSERT 100 +INSERT 0 100 3:BEGIN; BEGIN 3:CREATE TEMP TABLE tmp3 (c1 int, c2 int); -CREATE +CREATE TABLE 3:DECLARE c1 CURSOR for select * from tmp3; -DECLARE +DECLARE CURSOR 4:CREATE TEMP TABLE tmp4 (c1 int, c2 int); -CREATE +CREATE TABLE 5:BEGIN; BEGIN 5:CREATE TEMP TABLE tmp5 (c1 int, c2 int); -CREATE +CREATE TABLE 5:SAVEPOINT s1; SAVEPOINT 5:CREATE TEMP TABLE tmp51 (c1 int, c2 int); -CREATE +CREATE TABLE -- probe to make sure when we call gp_request_fts_probe_scan() next -- time below, don't overlap with auto-trigger of FTS scans by FTS @@ -144,7 +144,7 @@ select gp_inject_fault('get_dns_cached_address', 'reset', 1); 1:BEGIN; BEGIN 1:END; -END +COMMIT -- session 2: in transaction, gxid is dispatched to writer gang, cann't -- update cdb_component_dbs, following query should fail -- start_ignore @@ -177,7 +177,7 @@ ERROR: gang was lost due to cluster reconfiguration (cdbgang_async.c:98) 5:ROLLBACK TO SAVEPOINT s1; ERROR: Could not rollback to savepoint (ROLLBACK TO SAVEPOINT s1) 5:END; -END +ROLLBACK 1q: ... 2q: ... 3q: ... diff --git a/src/test/isolation2/expected/fts_errors_1.out b/src/test/isolation2/expected/fts_errors_1.out index 945b669d7f6..6b99fc282c8 100644 --- a/src/test/isolation2/expected/fts_errors_1.out +++ b/src/test/isolation2/expected/fts_errors_1.out @@ -34,7 +34,7 @@ -- Helper function CREATE or REPLACE FUNCTION wait_until_segments_are_down(num_segs int) RETURNS bool AS $$ declare retries int; /* in func */ begin /* in func */ retries := 1200; /* in func */ loop /* in func */ if (select count(*) = num_segs from gp_segment_configuration where status = 'd') then /* in func */ return true; /* in func */ end if; /* in func */ if retries <= 0 then /* in func */ return false; /* in func */ end if; /* in func */ perform pg_sleep(0.1); /* in func */ retries := retries - 1; /* in func */ end loop; /* in func */ end; /* in func */ $$ language plpgsql; -CREATE +CREATE FUNCTION -- no segment down. select count(*) from gp_segment_configuration where status = 'd'; @@ -44,34 +44,34 @@ select count(*) from gp_segment_configuration where status = 'd'; (1 row) drop table if exists fts_errors_test; -DROP +DROP TABLE create table fts_errors_test(a int); -CREATE +CREATE TABLE 1:BEGIN; BEGIN 1:END; -END +COMMIT 2:BEGIN; BEGIN 2:INSERT INTO fts_errors_test SELECT * FROM generate_series(1,100); -INSERT 100 +INSERT 0 100 3:BEGIN; BEGIN 3:CREATE TEMP TABLE tmp3 (c1 int, c2 int); -CREATE +CREATE TABLE 3:DECLARE c1 CURSOR for select * from tmp3; -DECLARE +DECLARE CURSOR 4:CREATE TEMP TABLE tmp4 (c1 int, c2 int); -CREATE +CREATE TABLE 5:BEGIN; BEGIN 5:CREATE TEMP TABLE tmp5 (c1 int, c2 int); -CREATE +CREATE TABLE 5:SAVEPOINT s1; SAVEPOINT 5:CREATE TEMP TABLE tmp51 (c1 int, c2 int); -CREATE +CREATE TABLE -- probe to make sure when we call gp_request_fts_probe_scan() next -- time below, don't overlap with auto-trigger of FTS scans by FTS @@ -130,7 +130,7 @@ select gp_inject_fault('get_dns_cached_address', 'reset', 1); 1:BEGIN; BEGIN 1:END; -END +COMMIT -- session 2: in transaction, gxid is dispatched to writer gang, cann't -- update cdb_component_dbs, following query should fail 2:END; @@ -161,7 +161,7 @@ ERROR: gang was lost due to cluster reconfiguration (cdbgang_async.c:98) 5:ROLLBACK TO SAVEPOINT s1; ERROR: Could not rollback to savepoint (ROLLBACK TO SAVEPOINT s1) 5:END; -END +ROLLBACK 1q: ... 2q: ... 3q: ... diff --git a/src/test/isolation2/expected/fts_segment_reset.out b/src/test/isolation2/expected/fts_segment_reset.out index 141c104f772..2f346219da9 100644 --- a/src/test/isolation2/expected/fts_segment_reset.out +++ b/src/test/isolation2/expected/fts_segment_reset.out @@ -58,7 +58,7 @@ select gp_inject_fault_infinite('postmaster_server_loop_no_sigkill', 'skip', dbi 3:set gp_gang_creation_retry_timer = 10000; SET 3:create table fts_reset_t3(a int); -CREATE +CREATE TABLE 1<: <... completed> ERROR: fault triggered, fault name:'start_prepare' fault type:'panic' @@ -105,7 +105,7 @@ select pg_reload_conf(); -- The only table that should have been created successfully drop table fts_reset_t3; -DROP +DROP TABLE -- In case anything goes wrong, we don't want to affect other tests. So rebalance the cluster anyway. !\retcode gprecoverseg -aF !\retcode gprecoverseg -ar \ No newline at end of file diff --git a/src/test/isolation2/expected/fts_session_reset.out b/src/test/isolation2/expected/fts_session_reset.out index afeef05ed74..e667f4c546d 100644 --- a/src/test/isolation2/expected/fts_session_reset.out +++ b/src/test/isolation2/expected/fts_session_reset.out @@ -6,15 +6,24 @@ -- set these values purely to cut down test time, as default ts trigger is -- every min and 5 retries +alter system set gp_fts_probe_interval to 10; +ALTER SYSTEM +alter system set gp_fts_probe_retries to 0; +ALTER SYSTEM +select pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) create table test_fts_session_reset(c1 int); -CREATE +CREATE TABLE 1:BEGIN; BEGIN -- let the dispatcher create a gang 1:insert into test_fts_session_reset select * from generate_series(1,20); -INSERT 20 +INSERT 0 20 -- this injected fault can make dispatcher think the primary is down 2:select gp_inject_fault_infinite('fts_conn_startup_packet', 'error', dbid) from gp_segment_configuration where role='p' and content=0; gp_inject_fault_infinite @@ -44,12 +53,7 @@ ERROR: gang was lost due to cluster reconfiguration (cdbgang_async.c:98) 1:select count(*) from test_fts_session_reset; ERROR: current transaction is aborted, commands ignored until end of transaction block 1:END; -END -1:select pg_sleep(30); - pg_sleep ----------- - -(1 row) +ROLLBACK 1:select count(*) from test_fts_session_reset; count ------- @@ -117,3 +121,14 @@ select count(*) from gp_segment_configuration where status = 'd'; ------- 0 (1 row) + +alter system reset gp_fts_probe_interval; +ALTER SYSTEM +alter system reset gp_fts_probe_retries; +ALTER SYSTEM +select pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) + diff --git a/src/test/isolation2/expected/gdd/avoid-qd-deadlock.out b/src/test/isolation2/expected/gdd/avoid-qd-deadlock.out index 81825036cbc..6d064de62d2 100644 --- a/src/test/isolation2/expected/gdd/avoid-qd-deadlock.out +++ b/src/test/isolation2/expected/gdd/avoid-qd-deadlock.out @@ -1,14 +1,14 @@ DROP TABLE IF EXISTS tsudf; -DROP +DROP TABLE CREATE TABLE tsudf (c int, d int); -CREATE +CREATE TABLE CREATE OR REPLACE FUNCTION func1(int) RETURNS int AS $$ BEGIN UPDATE tsudf SET d = d+1 WHERE c = $1; /* in func */ RETURN $1; /* in func */ END; /* in func */ $$ LANGUAGE plpgsql; -CREATE +CREATE FUNCTION INSERT INTO tsudf select i, i+1 from generate_series(1,10) i; -INSERT 10 +INSERT 0 10 SELECT gp_inject_fault('upgrade_row_lock', 'reset', 1); gp_inject_fault diff --git a/src/test/isolation2/expected/gdd/concurrent_update.out b/src/test/isolation2/expected/gdd/concurrent_update.out index 761e3f681a1..a109c0b6a0e 100644 --- a/src/test/isolation2/expected/gdd/concurrent_update.out +++ b/src/test/isolation2/expected/gdd/concurrent_update.out @@ -1,8 +1,8 @@ -- Test concurrent update a table with a varying length type CREATE TABLE t_concurrent_update(a int, b int, c char(84)); -CREATE +CREATE TABLE INSERT INTO t_concurrent_update VALUES(1,1,'test'); -INSERT 1 +INSERT 0 1 1: BEGIN; BEGIN @@ -14,7 +14,7 @@ UPDATE 1 SET 2&: UPDATE t_concurrent_update SET b=b+10 WHERE a=1; 1: END; -END +COMMIT 2<: <... completed> UPDATE 1 1: SELECT * FROM t_concurrent_update; @@ -26,13 +26,13 @@ UPDATE 1 2q: ... DROP TABLE t_concurrent_update; -DROP +DROP TABLE -- Test the concurrent update transaction order on the segment is reflected on master 1: CREATE TABLE t_concurrent_update(a int, b int); -CREATE +CREATE TABLE 1: INSERT INTO t_concurrent_update VALUES(1,1); -INSERT 1 +INSERT 0 1 2: BEGIN; BEGIN @@ -76,9 +76,9 @@ UPDATE 1 Success: (1 row) 2<: <... completed> -END +COMMIT 3<: <... completed> -END +COMMIT 2q: ... 3q: ... @@ -117,7 +117,7 @@ SET Success: (1 row) 4: END; -END +COMMIT 4: SELECT gp_inject_fault('before_get_distributed_xid', 'reset', dbid) FROM gp_segment_configuration WHERE role='p' AND content=1; gp_inject_fault ----------------- @@ -127,14 +127,14 @@ END 5<: <... completed> UPDATE 1 5: END; -END +COMMIT 6: SELECT * FROM t_concurrent_update; a | b ---+---- 1 | 41 (1 row) 6: DROP TABLE t_concurrent_update; -DROP +DROP TABLE 4q: ... 5q: ... 6q: ... @@ -152,9 +152,9 @@ DROP -- distribution keys is updated. 0: create table tab_update_hashcol (c1 int, c2 int) distributed by(c1); -CREATE +CREATE TABLE 0: insert into tab_update_hashcol values(1,1); -INSERT 1 +INSERT 0 1 0: select * from tab_update_hashcol; c1 | c2 ----+---- @@ -169,18 +169,18 @@ BEGIN UPDATE 1 2&: update tab_update_hashcol set c1 = c1 + 1 where c1 = 1; 1: end; -END +COMMIT 2<: <... completed> ERROR: EvalPlanQual can not handle subPlan with Motion node (seg1 127.0.1.1:7003 pid=34629) 2: end; -END +ROLLBACK 0: select * from tab_update_hashcol; c1 | c2 ----+---- 2 | 1 (1 row) 0: drop table tab_update_hashcol; -DROP +DROP TABLE -- Test EvalplanQual -- If we enable the GDD, then the lock maybe downgrade to @@ -192,13 +192,13 @@ DROP -- GDD is enabled and EvalPlanQual is tiggered. 0: create table tab_update_epq1 (c1 int, c2 int) distributed randomly; -CREATE +CREATE TABLE 0: create table tab_update_epq2 (c1 int, c2 int) distributed randomly; -CREATE +CREATE TABLE 0: insert into tab_update_epq1 values(1,1); -INSERT 1 +INSERT 0 1 0: insert into tab_update_epq2 values(1,1); -INSERT 1 +INSERT 0 1 0: select * from tab_update_epq1; c1 | c2 ----+---- @@ -223,11 +223,11 @@ BEGIN UPDATE 1 2&: update tab_update_epq1 set c1 = tab_update_epq1.c1 + 1 from tab_update_epq2 where tab_update_epq1.c2 = tab_update_epq2.c2; 1: end; -END +COMMIT 2<: <... completed> ERROR: EvalPlanQual can not handle subPlan with Motion node (seg0 127.0.1.1:7002 pid=108407) 2: end; -END +ROLLBACK 0: select * from tab_update_epq1; c1 | c2 @@ -235,16 +235,16 @@ END 2 | 1 (1 row) 0: drop table tab_update_epq1; -DROP +DROP TABLE 0: drop table tab_update_epq2; -DROP +DROP TABLE 0q: ... 1q: ... 2q: ... -- check that orca concurrent delete transaction won't delete tuple, updated in other transaction (which doesn't match predicate anymore) create table test as select 0 as i distributed randomly; -CREATE 1 +SELECT 1 1: begin; BEGIN 1: update test set i = i + 1; @@ -253,17 +253,17 @@ UPDATE 1 -- the following SQL will hang due to XID lock 2&: delete from test where i = 0; 1: end; -END +COMMIT 2<: <... completed> DELETE 0 drop table test; -DROP +DROP TABLE 1q: ... 2q: ... -- check that orca concurrent delete transaction will delete tuple, updated in other transaction (which still matches predicate) create table test as select 0 as i distributed randomly; -CREATE 1 +SELECT 1 1: begin; BEGIN 1: update test set i = i; @@ -272,19 +272,19 @@ UPDATE 1 -- the following SQL will hang due to XID lock 2&: delete from test where i = 0; 1: end; -END +COMMIT 2<: <... completed> DELETE 1 drop table test; -DROP +DROP TABLE 1q: ... 2q: ... -- test ORCA partition table create table test(a int, b int, c int) partition by range(b) (start (1) end (7) every (3)); -CREATE +CREATE TABLE insert into test values (1, 1, 1); -INSERT 1 +INSERT 0 1 1: begin; BEGIN 1: delete from test where b = 1; @@ -293,7 +293,7 @@ DELETE 1 -- the following SQL will hang due to XID lock 2&: update test set b = 1; 1: end; -END +COMMIT 2<: <... completed> UPDATE 0 @@ -302,7 +302,7 @@ UPDATE 0 ---+---+--- (0 rows) 0: drop table test; -DROP +DROP TABLE 0q: ... 1q: ... 2q: ... @@ -310,9 +310,9 @@ DROP -- test ORCA partition table -- related github issue https://github.com/greenplum-db/gpdb/issues/14935 create table test(a int, b int, c int) partition by range(b) (start (1) end (7) every (3)); -CREATE +CREATE TABLE insert into test values (1, 1, 1), (1, 2, 1); -INSERT 2 +INSERT 0 2 1: begin; BEGIN 1: update test set c = 1; @@ -321,7 +321,7 @@ UPDATE 2 -- the following SQL will hang due to XID lock 2&: update test set c = 1; 1: end; -END +COMMIT 2<: <... completed> UPDATE 2 @@ -332,7 +332,7 @@ UPDATE 2 1 | 2 | 1 (2 rows) 0: drop table test; -DROP +DROP TABLE 0q: ... 1q: ... 2q: ... @@ -346,9 +346,9 @@ DROP -- See github issue: https://github.com/greenplum-db/gpdb/issues/8919 0:create table t_splitupdate_raise_error (a int, b int) distributed by (a); -CREATE +CREATE TABLE 0:insert into t_splitupdate_raise_error values (1, 1); -INSERT 1 +INSERT 0 1 -- test delete will throw error 1: begin; @@ -361,12 +361,12 @@ BEGIN 2&: delete from t_splitupdate_raise_error; 1: end; -END +COMMIT 2<: <... completed> ERROR: tuple to be locked was already moved to another partition or segment due to concurrent update (seg1 127.0.1.1:7003 pid=34629) 2: abort; -ABORT +ROLLBACK 1q: ... 2q: ... @@ -381,12 +381,12 @@ BEGIN 2&: update t_splitupdate_raise_error set b = 999; 1: end; -END +COMMIT 2<: <... completed> ERROR: tuple to be locked was already moved to another partition or segment due to concurrent update (seg0 127.0.1.1:7002 pid=43842) 2: abort; -ABORT +ROLLBACK 1q: ... 2q: ... @@ -409,14 +409,14 @@ SET 2&: select * from t_splitupdate_raise_error for update; 1: end; -END +COMMIT 2<: <... completed> ERROR: tuple to be locked was already moved to another partition or segment due to concurrent update (seg0 slice1 127.0.1.1:7002 pid=43866) 2: abort; -ABORT +ROLLBACK 1q: ... 2q: ... 0:drop table t_splitupdate_raise_error; -DROP +DROP TABLE diff --git a/src/test/isolation2/expected/gdd/concurrent_update_optimizer.out b/src/test/isolation2/expected/gdd/concurrent_update_optimizer.out index 4a04cd86a21..2642b507f7d 100644 --- a/src/test/isolation2/expected/gdd/concurrent_update_optimizer.out +++ b/src/test/isolation2/expected/gdd/concurrent_update_optimizer.out @@ -1,8 +1,8 @@ -- Test concurrent update a table with a varying length type CREATE TABLE t_concurrent_update(a int, b int, c char(84)); -CREATE +CREATE TABLE INSERT INTO t_concurrent_update VALUES(1,1,'test'); -INSERT 1 +INSERT 0 1 1: BEGIN; BEGIN @@ -14,7 +14,7 @@ UPDATE 1 SET 2&: UPDATE t_concurrent_update SET b=b+10 WHERE a=1; 1: END; -END +COMMIT 2<: <... completed> UPDATE 1 1: SELECT * FROM t_concurrent_update; @@ -26,13 +26,13 @@ UPDATE 1 2q: ... DROP TABLE t_concurrent_update; -DROP +DROP TABLE -- Test the concurrent update transaction order on the segment is reflected on master 1: CREATE TABLE t_concurrent_update(a int, b int); -CREATE +CREATE TABLE 1: INSERT INTO t_concurrent_update VALUES(1,1); -INSERT 1 +INSERT 0 1 2: BEGIN; BEGIN @@ -76,9 +76,9 @@ UPDATE 1 Success: (1 row) 2<: <... completed> -END +COMMIT 3<: <... completed> -END +COMMIT 2q: ... 3q: ... @@ -117,7 +117,7 @@ SET Success: (1 row) 4: END; -END +COMMIT 4: SELECT gp_inject_fault('before_get_distributed_xid', 'reset', dbid) FROM gp_segment_configuration WHERE role='p' AND content=1; gp_inject_fault ----------------- @@ -127,14 +127,14 @@ END 5<: <... completed> UPDATE 1 5: END; -END +COMMIT 6: SELECT * FROM t_concurrent_update; a | b ---+---- 1 | 41 (1 row) 6: DROP TABLE t_concurrent_update; -DROP +DROP TABLE 4q: ... 5q: ... 6q: ... @@ -152,9 +152,9 @@ DROP -- distribution keys is updated. 0: create table tab_update_hashcol (c1 int, c2 int) distributed by(c1); -CREATE +CREATE TABLE 0: insert into tab_update_hashcol values(1,1); -INSERT 1 +INSERT 0 1 0: select * from tab_update_hashcol; c1 | c2 ----+---- @@ -169,18 +169,18 @@ BEGIN UPDATE 1 2&: update tab_update_hashcol set c1 = c1 + 1 where c1 = 1; 1: end; -END +COMMIT 2<: <... completed> ERROR: EvalPlanQual can not handle subPlan with Motion node 2: end; -END +ROLLBACK 0: select * from tab_update_hashcol; c1 | c2 ----+---- 2 | 1 (1 row) 0: drop table tab_update_hashcol; -DROP +DROP TABLE -- Test EvalplanQual -- If we enable the GDD, then the lock maybe downgrade to @@ -192,13 +192,13 @@ DROP -- GDD is enabled and EvalPlanQual is tiggered. 0: create table tab_update_epq1 (c1 int, c2 int) distributed randomly; -CREATE +CREATE TABLE 0: create table tab_update_epq2 (c1 int, c2 int) distributed randomly; -CREATE +CREATE TABLE 0: insert into tab_update_epq1 values(1,1); -INSERT 1 +INSERT 0 1 0: insert into tab_update_epq2 values(1,1); -INSERT 1 +INSERT 0 1 0: select * from tab_update_epq1; c1 | c2 ----+---- @@ -223,11 +223,11 @@ BEGIN UPDATE 1 2&: update tab_update_epq1 set c1 = tab_update_epq1.c1 + 1 from tab_update_epq2 where tab_update_epq1.c2 = tab_update_epq2.c2; 1: end; -END +COMMIT 2<: <... completed> ERROR: EvalPlanQual can not handle subPlan with Motion node (seg1 127.0.1.1:6003 pid=76275) 2: end; -END +ROLLBACK 0: select * from tab_update_epq1; c1 | c2 @@ -235,16 +235,16 @@ END 2 | 1 (1 row) 0: drop table tab_update_epq1; -DROP +DROP TABLE 0: drop table tab_update_epq2; -DROP +DROP TABLE 0q: ... 1q: ... 2q: ... -- check that orca concurrent delete transaction won't delete tuple, updated in other transaction (which doesn't match predicate anymore) create table test as select 0 as i distributed randomly; -CREATE 1 +SELECT 1 1: begin; BEGIN 1: update test set i = i + 1; @@ -253,17 +253,17 @@ UPDATE 1 -- the following SQL will hang due to XID lock 2&: delete from test where i = 0; 1: end; -END +COMMIT 2<: <... completed> DELETE 0 drop table test; -DROP +DROP TABLE 1q: ... 2q: ... -- check that orca concurrent delete transaction will delete tuple, updated in other transaction (which still matches predicate) create table test as select 0 as i distributed randomly; -CREATE 1 +SELECT 1 1: begin; BEGIN 1: update test set i = i; @@ -272,19 +272,19 @@ UPDATE 1 -- the following SQL will hang due to XID lock 2&: delete from test where i = 0; 1: end; -END +COMMIT 2<: <... completed> DELETE 1 drop table test; -DROP +DROP TABLE 1q: ... 2q: ... -- test ORCA partition table create table test(a int, b int, c int) partition by range(b) (start (1) end (7) every (3)); -CREATE +CREATE TABLE insert into test values (1, 1, 1); -INSERT 1 +INSERT 0 1 1: begin; BEGIN 1: delete from test where b = 1; @@ -293,7 +293,7 @@ DELETE 1 -- the following SQL will hang due to XID lock 2&: update test set b = 1; 1: end; -END +COMMIT 2<: <... completed> UPDATE 0 @@ -302,7 +302,7 @@ UPDATE 0 ---+---+--- (0 rows) 0: drop table test; -DROP +DROP TABLE 0q: ... 1q: ... 2q: ... @@ -310,9 +310,9 @@ DROP -- test ORCA partition table -- related github issue https://github.com/greenplum-db/gpdb/issues/14935 create table test(a int, b int, c int) partition by range(b) (start (1) end (7) every (3)); -CREATE +CREATE TABLE insert into test values (1, 1, 1), (1, 2, 1); -INSERT 2 +INSERT 0 2 1: begin; BEGIN 1: update test set c = 1; @@ -321,7 +321,7 @@ UPDATE 2 -- the following SQL will hang due to XID lock 2&: update test set c = 1; 1: end; -END +COMMIT 2<: <... completed> UPDATE 2 @@ -332,7 +332,7 @@ UPDATE 2 1 | 2 | 1 (2 rows) 0: drop table test; -DROP +DROP TABLE 0q: ... 1q: ... 2q: ... @@ -346,9 +346,9 @@ DROP -- See github issue: https://github.com/greenplum-db/gpdb/issues/8919 0:create table t_splitupdate_raise_error (a int, b int) distributed by (a); -CREATE +CREATE TABLE 0:insert into t_splitupdate_raise_error values (1, 1); -INSERT 1 +INSERT 0 1 -- test delete will throw error 1: begin; @@ -361,12 +361,12 @@ BEGIN 2&: delete from t_splitupdate_raise_error; 1: end; -END +COMMIT 2<: <... completed> ERROR: tuple to be locked was already moved to another partition or segment due to concurrent update (seg1 127.0.1.1:6003 pid=76275) 2: abort; -ABORT +ROLLBACK 1q: ... 2q: ... @@ -381,12 +381,12 @@ BEGIN 2&: update t_splitupdate_raise_error set b = 999; 1: end; -END +COMMIT 2<: <... completed> ERROR: tuple to be locked was already moved to another partition or segment due to concurrent update (seg0 127.0.1.1:6002 pid=76337) 2: abort; -ABORT +ROLLBACK 1q: ... 2q: ... @@ -409,14 +409,14 @@ SET 2&: select * from t_splitupdate_raise_error for update; 1: end; -END +COMMIT 2<: <... completed> ERROR: tuple to be locked was already moved to another partition or segment due to concurrent update (seg0 slice1 127.0.1.1:7002 pid=43866) 2: abort; -ABORT +ROLLBACK 1q: ... 2q: ... 0:drop table t_splitupdate_raise_error; -DROP +DROP TABLE diff --git a/src/test/isolation2/expected/gdd/delete-deadlock-root-leaf-concurrent-op.out b/src/test/isolation2/expected/gdd/delete-deadlock-root-leaf-concurrent-op.out index 1b4dd43bf0a..d21de9145b0 100644 --- a/src/test/isolation2/expected/gdd/delete-deadlock-root-leaf-concurrent-op.out +++ b/src/test/isolation2/expected/gdd/delete-deadlock-root-leaf-concurrent-op.out @@ -1,9 +1,9 @@ DROP TABLE IF EXISTS part_tbl; -DROP +DROP TABLE CREATE TABLE part_tbl (a int, b int, c int) PARTITION BY RANGE(b) (START(1) END(2) EVERY(1)); -CREATE +CREATE TABLE INSERT INTO part_tbl SELECT i, 1, i FROM generate_series(1,100)i; -INSERT 100 +INSERT 0 100 -- check gdd is enabled show gp_enable_global_deadlock_detector; @@ -44,4 +44,4 @@ ROLLBACK 2:ROLLBACK; ROLLBACK DROP TABLE IF EXISTS part_tbl; -DROP +DROP TABLE diff --git a/src/test/isolation2/expected/gdd/dist-deadlock-01.out b/src/test/isolation2/expected/gdd/dist-deadlock-01.out index 3cedc30f509..b8b46b715db 100644 --- a/src/test/isolation2/expected/gdd/dist-deadlock-01.out +++ b/src/test/isolation2/expected/gdd/dist-deadlock-01.out @@ -1,9 +1,9 @@ DROP TABLE IF EXISTS t01; -DROP +DROP TABLE CREATE TABLE t01 (id int, val int); -CREATE +CREATE TABLE INSERT INTO t01 (id, val) SELECT i, i FROM generate_series(1, 100) i; -INSERT 100 +INSERT 0 100 -- gang creation order is important, reset any guc to force the creation 10: RESET optimizer; diff --git a/src/test/isolation2/expected/gdd/dist-deadlock-04.out b/src/test/isolation2/expected/gdd/dist-deadlock-04.out index c393a69b54b..f497faa08f3 100644 --- a/src/test/isolation2/expected/gdd/dist-deadlock-04.out +++ b/src/test/isolation2/expected/gdd/dist-deadlock-04.out @@ -1,12 +1,12 @@ DROP TABLE IF EXISTS t04a; -DROP +DROP TABLE CREATE TABLE t04a (id int, val int); -CREATE +CREATE TABLE INSERT INTO t04a (id, val) SELECT i, i FROM generate_series(1, 100) i; -INSERT 100 +INSERT 0 100 DROP TABLE IF EXISTS t04b; -DROP +DROP TABLE -- gang creation order is important, reset any guc to force the creation 10: RESET optimizer; @@ -22,7 +22,7 @@ BEGIN 10: UPDATE t04a SET val=val WHERE id=segid(0,1); UPDATE 1 10: CREATE TABLE t04b (id int); -CREATE +CREATE TABLE 20: UPDATE t04a SET val=val WHERE id=segid(1,1); UPDATE 1 diff --git a/src/test/isolation2/expected/gdd/dist-deadlock-05.out b/src/test/isolation2/expected/gdd/dist-deadlock-05.out index 57a8dced788..0611482c312 100644 --- a/src/test/isolation2/expected/gdd/dist-deadlock-05.out +++ b/src/test/isolation2/expected/gdd/dist-deadlock-05.out @@ -1,7 +1,7 @@ DROP TABLE IF EXISTS t05; -DROP +DROP TABLE CREATE TABLE t05 (id int primary key); -CREATE +CREATE TABLE -- gang creation order is important, reset any guc to force the creation 10: RESET optimizer; @@ -15,10 +15,10 @@ BEGIN BEGIN 10: INSERT INTO t05 VALUES(segid(0,1)); -INSERT 1 +INSERT 0 1 20: INSERT INTO t05 VALUES(segid(1,1)); -INSERT 1 +INSERT 0 1 -- seg 0: con20 ==> con10, xid lock 20&: INSERT INTO t05 VALUES(segid(0,1)); @@ -32,5 +32,5 @@ ERROR: canceling statement due to user request: "cancelled by global deadlock d -- no more deadlock 10<: <... completed> -INSERT 1 +INSERT 0 1 10q: ... diff --git a/src/test/isolation2/expected/gdd/dist-deadlock-06.out b/src/test/isolation2/expected/gdd/dist-deadlock-06.out index 08202fcc758..45a116ce075 100644 --- a/src/test/isolation2/expected/gdd/dist-deadlock-06.out +++ b/src/test/isolation2/expected/gdd/dist-deadlock-06.out @@ -1,9 +1,9 @@ DROP TABLE IF EXISTS t06; -DROP +DROP TABLE CREATE TABLE t06 (id int, val int); -CREATE +CREATE TABLE INSERT INTO t06 (id, val) SELECT i, i FROM generate_series(1, 100) i; -INSERT 100 +INSERT 0 100 -- gang creation order is important, reset any guc to force the creation 10: RESET optimizer; diff --git a/src/test/isolation2/expected/gdd/dist-deadlock-07.out b/src/test/isolation2/expected/gdd/dist-deadlock-07.out index 40e2fa8253d..37cde3b837c 100644 --- a/src/test/isolation2/expected/gdd/dist-deadlock-07.out +++ b/src/test/isolation2/expected/gdd/dist-deadlock-07.out @@ -1,15 +1,15 @@ DROP TABLE IF EXISTS t07a; -DROP +DROP TABLE DROP TABLE IF EXISTS t07b; -DROP +DROP TABLE CREATE TABLE t07a (c1 int, c2 int); -CREATE +CREATE TABLE CREATE TABLE t07b (c1 int, c2 int); -CREATE +CREATE TABLE INSERT INTO t07a (c1, c2) SELECT i, i FROM generate_series(1, 100) i; -INSERT 100 +INSERT 0 100 INSERT INTO t07b (c1, c2) SELECT i, i FROM generate_series(1, 100) i; -INSERT 100 +INSERT 0 100 -- gang creation order is important, reset any guc to force the creation 10: RESET optimizer; @@ -37,7 +37,7 @@ UPDATE 1 UPDATE 1 30: LOCK t07a; -LOCK +LOCK TABLE -- seg 0: con30 ==> con10, xid lock 30&: UPDATE t07b SET c2 = 21 WHERE c1 = segid(0,1); diff --git a/src/test/isolation2/expected/gdd/dist-deadlock-102.out b/src/test/isolation2/expected/gdd/dist-deadlock-102.out index c7ecda8664e..fc1603bada2 100644 --- a/src/test/isolation2/expected/gdd/dist-deadlock-102.out +++ b/src/test/isolation2/expected/gdd/dist-deadlock-102.out @@ -1,9 +1,9 @@ DROP TABLE IF EXISTS t102; -DROP +DROP TABLE CREATE TABLE t102 (id int, val int); -CREATE +CREATE TABLE INSERT INTO t102 (id, val) SELECT i, i FROM generate_series(1, 100) i; -INSERT 100 +INSERT 0 100 -- gang creation order is important, reset any guc to force the creation 10: RESET optimizer; diff --git a/src/test/isolation2/expected/gdd/dist-deadlock-103.out b/src/test/isolation2/expected/gdd/dist-deadlock-103.out index befd5eaab5d..fe7c5eb2dbf 100644 --- a/src/test/isolation2/expected/gdd/dist-deadlock-103.out +++ b/src/test/isolation2/expected/gdd/dist-deadlock-103.out @@ -1,9 +1,9 @@ DROP TABLE IF EXISTS t103; -DROP +DROP TABLE CREATE TABLE t103 (id int, val int); -CREATE +CREATE TABLE INSERT INTO t103 (id, val) SELECT i, i FROM generate_series(1, 100) i; -INSERT 100 +INSERT 0 100 -- gang creation order is important, reset any guc to force the creation 10: RESET optimizer; diff --git a/src/test/isolation2/expected/gdd/dist-deadlock-104.out b/src/test/isolation2/expected/gdd/dist-deadlock-104.out index 7feeb022c89..c8bd4aa6880 100644 --- a/src/test/isolation2/expected/gdd/dist-deadlock-104.out +++ b/src/test/isolation2/expected/gdd/dist-deadlock-104.out @@ -1,9 +1,9 @@ DROP TABLE IF EXISTS t104; -DROP +DROP TABLE CREATE TABLE t104 (id int, val int); -CREATE +CREATE TABLE INSERT INTO t104 (id, val) SELECT i, i FROM generate_series(1, 100) i; -INSERT 100 +INSERT 0 100 -- gang creation order is important, reset any guc to force the creation 10: RESET optimizer; diff --git a/src/test/isolation2/expected/gdd/dist-deadlock-106.out b/src/test/isolation2/expected/gdd/dist-deadlock-106.out index 4441f8d94ef..1640d6bc857 100644 --- a/src/test/isolation2/expected/gdd/dist-deadlock-106.out +++ b/src/test/isolation2/expected/gdd/dist-deadlock-106.out @@ -1,9 +1,9 @@ DROP TABLE IF EXISTS t106; -DROP +DROP TABLE CREATE TABLE t106 (id int, val int); -CREATE +CREATE TABLE INSERT INTO t106 (id, val) SELECT i, i FROM generate_series(1, 100) i; -INSERT 100 +INSERT 0 100 -- gang creation order is important, reset any guc to force the creation 10: RESET optimizer; diff --git a/src/test/isolation2/expected/gdd/dist-deadlock-upsert.out b/src/test/isolation2/expected/gdd/dist-deadlock-upsert.out index db209932428..7a900b6ab96 100644 --- a/src/test/isolation2/expected/gdd/dist-deadlock-upsert.out +++ b/src/test/isolation2/expected/gdd/dist-deadlock-upsert.out @@ -4,13 +4,13 @@ -- global deadlock when GDD is enabled. DROP TABLE IF EXISTS t_upsert; -DROP +DROP TABLE CREATE TABLE t_upsert (id int, val int) distributed by (id); -CREATE +CREATE TABLE CREATE UNIQUE INDEX uidx_t_upsert on t_upsert(id, val); -CREATE +CREATE INDEX INSERT INTO t_upsert (id, val) SELECT i, i FROM generate_series(1, 100) i; -INSERT 100 +INSERT 0 100 -- gang creation order is important, reset any guc to force the creation 10: RESET optimizer; @@ -24,10 +24,10 @@ BEGIN BEGIN 10: INSERT INTO t_upsert VALUES (segid(0,1), segid(0,1)) on conflict (id, val) do update set val = 999; -INSERT 1 +INSERT 0 1 20: INSERT INTO t_upsert VALUES (segid(1,1), segid(1,1)) on conflict (id, val) do update set val = 888; -INSERT 1 +INSERT 0 1 select gp_inject_fault('gdd_probe', 'suspend', dbid) from gp_segment_configuration where content=-1 and role='p'; gp_inject_fault @@ -57,5 +57,5 @@ ERROR: canceling statement due to user request: "cancelled by global deadlock d -- no more deadlock 10<: <... completed> -INSERT 1 +INSERT 0 1 10q: ... diff --git a/src/test/isolation2/expected/gdd/end.out b/src/test/isolation2/expected/gdd/end.out index 01a10b8a47a..70986307742 100644 --- a/src/test/isolation2/expected/gdd/end.out +++ b/src/test/isolation2/expected/gdd/end.out @@ -1,7 +1,7 @@ ALTER SYSTEM RESET gp_enable_global_deadlock_detector; -ALTER +ALTER SYSTEM ALTER SYSTEM RESET gp_global_deadlock_detector_period; -ALTER +ALTER SYSTEM -- Use utility session on seg 0 to restart master. This way avoids the -- situation where session issuing the restart doesn't disappear diff --git a/src/test/isolation2/expected/gdd/insert_root_partition_truncate_deadlock.out b/src/test/isolation2/expected/gdd/insert_root_partition_truncate_deadlock.out index bf78325fe93..3392152eb54 100644 --- a/src/test/isolation2/expected/gdd/insert_root_partition_truncate_deadlock.out +++ b/src/test/isolation2/expected/gdd/insert_root_partition_truncate_deadlock.out @@ -11,7 +11,7 @@ -- without GDD it is running to show that no deadlock happens. create table rank_13652 (id int, year int) partition by range (year) (start (2006) end (2009) every (1)); -CREATE +CREATE TABLE 1: select gp_inject_fault('func_init_plan_end', 'suspend', dbid, current_setting('gp_session_id')::int) from gp_segment_configuration where content = 0 and role = 'p'; gp_inject_fault @@ -35,7 +35,7 @@ select gp_inject_fault('func_init_plan_end', 'reset', dbid) from gp_segment_conf (1 row) 1<: <... completed> -INSERT 30 +INSERT 0 30 2<: <... completed> ERROR: canceling statement due to user request: "cancelled by global deadlock detector" @@ -43,4 +43,4 @@ ERROR: canceling statement due to user request: "cancelled by global deadlock d 2q: ... drop table rank_13652; -DROP +DROP TABLE diff --git a/src/test/isolation2/expected/gdd/local-deadlock-03.out b/src/test/isolation2/expected/gdd/local-deadlock-03.out index 0a0fc49e086..6aa7a02a2a6 100644 --- a/src/test/isolation2/expected/gdd/local-deadlock-03.out +++ b/src/test/isolation2/expected/gdd/local-deadlock-03.out @@ -4,7 +4,7 @@ -- deadlock testcases stable we reset the gdd period to 2min so should -- not be triggered during the local deadlock tests. ALTER SYSTEM SET gp_global_deadlock_detector_period to '2min'; -ALTER +ALTER SYSTEM SELECT pg_reload_conf(); pg_reload_conf ---------------- @@ -18,11 +18,11 @@ SELECT pg_reload_conf(); (1 row) DROP TABLE IF EXISTS t03; -DROP +DROP TABLE CREATE TABLE t03 (id int, val int); -CREATE +CREATE TABLE INSERT INTO t03 (id, val) SELECT i, i FROM generate_series(1, 100) i; -INSERT 100 +INSERT 0 100 -- gang creation order is important, reset any guc to force the creation 10: RESET optimizer; diff --git a/src/test/isolation2/expected/gdd/non-lock-105.out b/src/test/isolation2/expected/gdd/non-lock-105.out index 781e6d9929d..537f7225ddc 100644 --- a/src/test/isolation2/expected/gdd/non-lock-105.out +++ b/src/test/isolation2/expected/gdd/non-lock-105.out @@ -1,9 +1,9 @@ DROP TABLE IF EXISTS t105; -DROP +DROP TABLE CREATE TABLE t105 (id int, val int); -CREATE +CREATE TABLE INSERT INTO t105 (id, val) SELECT i, i FROM generate_series(1, 100) i; -INSERT 100 +INSERT 0 100 -- gang creation order is important, reset any guc to force the creation 10: RESET optimizer; diff --git a/src/test/isolation2/expected/gdd/prepare.out b/src/test/isolation2/expected/gdd/prepare.out index d8940c2d3cf..73af33a0268 100644 --- a/src/test/isolation2/expected/gdd/prepare.out +++ b/src/test/isolation2/expected/gdd/prepare.out @@ -1,17 +1,17 @@ -- t0r is the reference table to provide the data distribution info. DROP TABLE IF EXISTS t0p; -DROP +DROP TABLE CREATE TABLE t0p (id int, val int); -CREATE +CREATE TABLE INSERT INTO t0p (id, val) SELECT i, i FROM generate_series(1, 100) i; -INSERT 100 +INSERT 0 100 DROP TABLE IF EXISTS t0r; -DROP +DROP TABLE CREATE TABLE t0r (id int, val int, segid int) DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE INSERT INTO t0r (id, val, segid) SELECT id, val, gp_segment_id from t0p; -INSERT 100 +INSERT 0 100 -- GDD tests rely on the data distribution, but depends on the number of -- the segments the distribution might be different. @@ -19,7 +19,7 @@ INSERT 100 -- * `seg` is the segment id, starts from 0; -- * `idx` is the index on the segment, starts from 1; CREATE OR REPLACE FUNCTION segid(seg int, idx int) RETURNS int AS $$ SELECT id FROM t0r WHERE segid=$1 ORDER BY id LIMIT 1 OFFSET ($2-1) $$ LANGUAGE sql; -CREATE +CREATE FUNCTION -- In some of the testcases the execution order of two background queries -- must be enforced not only on master but also on segments, for example @@ -38,7 +38,7 @@ CREATE -- So we provide this barrier function to ensure the execution order. -- It's implemented with sleep now, but should at least work. CREATE OR REPLACE FUNCTION barrier() RETURNS void AS $$ SELECT pg_sleep(4) $$ LANGUAGE sql; -CREATE +CREATE FUNCTION -- verify the function -- Data distribution is sensitive to the underlying hash algorithm, we need each @@ -63,14 +63,14 @@ SELECT segid(2,10) is not null; -- table to just store the master's data directory path on segment. CREATE TABLE datadir(a int, dir text); -CREATE +CREATE TABLE INSERT INTO datadir select 1,datadir from gp_segment_configuration where role='p' and content=-1; -INSERT 1 +INSERT 0 1 ALTER SYSTEM SET gp_enable_global_deadlock_detector TO on; -ALTER +ALTER SYSTEM ALTER SYSTEM SET gp_global_deadlock_detector_period TO 5; -ALTER +ALTER SYSTEM -- Use utility session on seg 0 to restart master. This way avoids the -- situation where session issuing the restart doesn't disappear diff --git a/src/test/isolation2/expected/gdd/update-deadlock-root-leaf-concurrent-op.out b/src/test/isolation2/expected/gdd/update-deadlock-root-leaf-concurrent-op.out index c88976980b4..a8954eae80f 100644 --- a/src/test/isolation2/expected/gdd/update-deadlock-root-leaf-concurrent-op.out +++ b/src/test/isolation2/expected/gdd/update-deadlock-root-leaf-concurrent-op.out @@ -1,9 +1,9 @@ DROP TABLE IF EXISTS part_tbl; -DROP +DROP TABLE CREATE TABLE part_tbl (a int, b int, c int) PARTITION BY RANGE(b) (START(1) END(2) EVERY(1)); -CREATE +CREATE TABLE INSERT INTO part_tbl SELECT i, 1, i FROM generate_series(1,100)i; -INSERT 100 +INSERT 0 100 -- check gdd is enabled show gp_enable_global_deadlock_detector; @@ -44,4 +44,4 @@ ROLLBACK 2:ROLLBACK; ROLLBACK DROP TABLE IF EXISTS part_tbl; -DROP +DROP TABLE diff --git a/src/test/isolation2/expected/gp_terminate_mpp_backends.out b/src/test/isolation2/expected/gp_terminate_mpp_backends.out index 941ccef8ddc..6c8ba84db6a 100644 --- a/src/test/isolation2/expected/gp_terminate_mpp_backends.out +++ b/src/test/isolation2/expected/gp_terminate_mpp_backends.out @@ -1,6 +1,6 @@ -- test gp_terminate_mpp_backends 1:create table gp_terminate_mpp_backends_t (a int); -CREATE +CREATE TABLE select gp_terminate_mpp_backends() from gp_dist_random('gp_id'); gp_terminate_mpp_backends diff --git a/src/test/isolation2/expected/gpdispatch.out b/src/test/isolation2/expected/gpdispatch.out index 67f569f65f4..8f6ca9e71a6 100644 --- a/src/test/isolation2/expected/gpdispatch.out +++ b/src/test/isolation2/expected/gpdispatch.out @@ -2,7 +2,7 @@ -- Report on https://github.com/greenplum-db/gpdb/issues/12399 create extension if not exists gp_inject_fault; -CREATE +CREATE EXTENSION 1: select gp_inject_fault('make_dispatch_result_error', 'skip', dbid) from gp_segment_configuration where role = 'p' and content = -1; gp_inject_fault @@ -41,9 +41,9 @@ select gp_inject_fault('make_dispatch_result_error', 'reset', dbid) from gp_segm -- create table test_waitevent(i int); -CREATE +CREATE TABLE insert into test_waitevent select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 1: set optimizer = off; SET @@ -59,7 +59,7 @@ SET 1&: WITH a1 as (select * from test_waitevent), a2 as (select * from test_waitevent) SELECT sum(a1.i) FROM a1 INNER JOIN a2 ON a2.i = a1.i UNION ALL SELECT count(a1.i) FROM a1 INNER JOIN a2 ON a2.i = a1.i; -- start_ignore 2: copy (select pg_stat_get_activity(NULL) from gp_dist_random('gp_id') where gp_segment_id=0) to '/tmp/_gpdb_test_output.txt'; -COPY 9 +COPY 10 -- end_ignore 2: select gp_wait_until_triggered_fault('shareinput_writer_notifyready', 1, 2); gp_wait_until_triggered_fault @@ -98,13 +98,13 @@ COPY 9 -- Case for cdbgang_createGang_async 1: create table t_12703(a int); -CREATE +CREATE TABLE 1:begin; BEGIN -- make a cursor so that we have a named portal 1: declare cur12703 cursor for select * from t_12703; -DECLARE +DECLARE CURSOR 2: select pg_ctl((select datadir from gp_segment_configuration c where c.role='p' and c.content=1), 'stop'); pg_ctl @@ -135,7 +135,7 @@ DECLARE 1: select * from t_12703; ERROR: gang was lost due to cluster reconfiguration (cdbgang_async.c:98) 1: abort; -ABORT +ROLLBACK 1q: ... 2q: ... @@ -143,7 +143,7 @@ ABORT -- Case for cdbCopyEndInternal -- Provide some data to copy in 4: insert into t_12703 select * from generate_series(1, 10)i; -INSERT 10 +INSERT 0 10 4: copy t_12703 to '/tmp/t_12703'; COPY 10 -- make copy in statement hang at the entry point of cdbCopyEndInternal @@ -193,7 +193,7 @@ ERROR: MPP detected 1 segment failures, system is reconnected 1 (1 row) 2: end; -END +COMMIT 2q: ... !\retcode gprecoverseg -aF --no-progress; diff --git a/src/test/isolation2/expected/gpdispatch_1.out b/src/test/isolation2/expected/gpdispatch_1.out index edd307d6d14..d54e376acd7 100644 --- a/src/test/isolation2/expected/gpdispatch_1.out +++ b/src/test/isolation2/expected/gpdispatch_1.out @@ -2,7 +2,7 @@ -- Report on https://github.com/greenplum-db/gpdb/issues/12399 create extension if not exists gp_inject_fault; -CREATE +CREATE EXTENSION 1: select gp_inject_fault('make_dispatch_result_error', 'skip', dbid) from gp_segment_configuration where role = 'p' and content = -1; gp_inject_fault @@ -41,9 +41,9 @@ select gp_inject_fault('make_dispatch_result_error', 'reset', dbid) from gp_segm -- create table test_waitevent(i int); -CREATE +CREATE TABLE insert into test_waitevent select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 1: set optimizer = off; SET @@ -98,13 +98,13 @@ COPY 9 -- Case for cdbgang_createGang_async 1: create table t_12703(a int); -CREATE +CREATE TABLE 1:begin; BEGIN -- make a cursor so that we have a named portal 1: declare cur12703 cursor for select * from t_12703; -DECLARE +DECLARE CURSOR 2: select pg_ctl((select datadir from gp_segment_configuration c where c.role='p' and c.content=1), 'stop'); pg_ctl @@ -127,7 +127,7 @@ ERROR: Error on receive from seg1 slice1 127.0.1.1:7003 pid=58391: server close This probably means the server terminated abnormally before or while processing the request. 1: abort; -ABORT +ROLLBACK 1q: ... 2q: ... @@ -135,7 +135,7 @@ ABORT -- Case for cdbCopyEndInternal -- Provide some data to copy in 4: insert into t_12703 select * from generate_series(1, 10)i; -INSERT 10 +INSERT 0 10 4: copy t_12703 to '/tmp/t_12703'; COPY 10 -- make copy in statement hang at the entry point of cdbCopyEndInternal @@ -180,7 +180,7 @@ ERROR: MPP detected 1 segment failures, system is reconnected 1 (1 row) 2: end; -END +COMMIT 2q: ... !\retcode gprecoverseg -aF --no-progress; diff --git a/src/test/isolation2/expected/gpexpand_catalog_lock.out b/src/test/isolation2/expected/gpexpand_catalog_lock.out index b060a23cfcc..580eaaf0e7d 100644 --- a/src/test/isolation2/expected/gpexpand_catalog_lock.out +++ b/src/test/isolation2/expected/gpexpand_catalog_lock.out @@ -1,12 +1,12 @@ drop table if exists t20; -DROP +DROP TABLE drop table if exists t30; -DROP +DROP TABLE create table t20 (c1 int, c2 int) distributed by (c1); -CREATE +CREATE TABLE create table t30 (c1 int, c2 int) distributed by (c1); -CREATE +CREATE TABLE -- c10, c11 simulate gpexpand's catalog lock protection -- they will acquire the catalog lock in exclusive mode @@ -34,7 +34,7 @@ BEGIN 11&: select gp_expand_lock_catalog(); 10: end; -END +COMMIT -- c10 released the lock, c11 acquired it now 11<: <... completed> @@ -43,7 +43,7 @@ END (1 row) 11: end; -END +COMMIT -- -- client sessions do not block each other on catalog changes @@ -56,14 +56,14 @@ BEGIN -- c20 and c30 both acquired the catalog lock in shared mode 20: create table t21 (c1 int, c2 int) distributed by (c1); -CREATE +CREATE TABLE 30: create table t31 (c1 int, c2 int) distributed by (c1); -CREATE +CREATE TABLE 20: insert into t21 values (1,1); -INSERT 1 +INSERT 0 1 30: insert into t31 values (1,1); -INSERT 1 +INSERT 0 1 20: rollback; ROLLBACK @@ -83,17 +83,17 @@ BEGIN -- c20 and c30 both acquired the catalog lock in shared mode 20: create table t21 (c1 int, c2 int) distributed by (c1); -CREATE +CREATE TABLE 30: create table t31 (c1 int, c2 int) distributed by (c1); -CREATE +CREATE TABLE -- c10 can not acquire the lock in exclusive mode ... 10&: select gp_expand_lock_catalog(); 20: insert into t21 values (1,1); -INSERT 1 +INSERT 0 1 30: insert into t31 values (1,1); -INSERT 1 +INSERT 0 1 20: rollback; ROLLBACK @@ -107,7 +107,7 @@ ROLLBACK (1 row) 10: end; -END +COMMIT -- -- the catalog lock can be acquired in order @@ -122,7 +122,7 @@ BEGIN -- c20 acquired the catalog lock in shared mode 20: create table t21 (c1 int, c2 int) distributed by (c1); -CREATE +CREATE TABLE -- c10 has to wait for c20 10&: select gp_expand_lock_catalog(); @@ -135,7 +135,7 @@ ROLLBACK -- c20 can still make catalog changes 20: drop table t21; -DROP +DROP TABLE 20: rollback; ROLLBACK @@ -147,7 +147,7 @@ ROLLBACK (1 row) 10: end; -END +COMMIT -- -- gpexpand does not block DMLs or readonly queries to catalogs @@ -169,7 +169,7 @@ BEGIN -- c20 and c30 can still run DMLs 20: insert into t20 values (1,1); -INSERT 1 +INSERT 0 1 20: select * from t20; c1 | c2 ----+---- @@ -181,7 +181,7 @@ UPDATE 1 DELETE 1 30: insert into t30 values (1,1); -INSERT 1 +INSERT 0 1 30: select * from t30; c1 | c2 ----+---- @@ -210,7 +210,7 @@ ROLLBACK ROLLBACK 10: end; -END +COMMIT -- -- catalog changes are disallowed when gpexpand is in progress @@ -246,4 +246,4 @@ ROLLBACK ROLLBACK 10: end; -END +COMMIT diff --git a/src/test/isolation2/expected/insert_root_partition_truncate_deadlock_without_gdd.out b/src/test/isolation2/expected/insert_root_partition_truncate_deadlock_without_gdd.out index 4724a9cf7ef..25834116f2f 100644 --- a/src/test/isolation2/expected/insert_root_partition_truncate_deadlock_without_gdd.out +++ b/src/test/isolation2/expected/insert_root_partition_truncate_deadlock_without_gdd.out @@ -11,7 +11,7 @@ -- without GDD it is running to show that no deadlock happens. create table rank_13652 (id int, year int) partition by range (year) (start (2006) end (2009) every (1)); -CREATE +CREATE TABLE 1: select gp_inject_fault('func_init_plan_end', 'suspend', dbid, current_setting('gp_session_id')::int) from gp_segment_configuration where content = 0 and role = 'p'; gp_inject_fault @@ -35,12 +35,12 @@ select gp_inject_fault('func_init_plan_end', 'reset', dbid) from gp_segment_conf (1 row) 1<: <... completed> -INSERT 30 +INSERT 0 30 2<: <... completed> -TRUNCATE +TRUNCATE TABLE 1q: ... 2q: ... drop table rank_13652; -DROP +DROP TABLE diff --git a/src/test/isolation2/expected/instr_in_shmem_terminate.out b/src/test/isolation2/expected/instr_in_shmem_terminate.out index 2bb0a86a6c9..338f5fd9b9a 100644 --- a/src/test/isolation2/expected/instr_in_shmem_terminate.out +++ b/src/test/isolation2/expected/instr_in_shmem_terminate.out @@ -5,34 +5,34 @@ -- slots in shmem should be recycled correctly. DROP SCHEMA IF EXISTS QUERY_METRICS CASCADE; -DROP +DROP SCHEMA CREATE SCHEMA QUERY_METRICS; -CREATE +CREATE SCHEMA SET SEARCH_PATH=QUERY_METRICS; SET CREATE EXTERNAL WEB TABLE __gp_localid ( localid int ) EXECUTE E'echo $GP_SEGMENT_ID' FORMAT 'TEXT'; -CREATE +CREATE EXTERNAL TABLE GRANT SELECT ON TABLE __gp_localid TO public; GRANT -CREATE EXTERNAL WEB TABLE __gp_masterid ( masterid int ) EXECUTE E'echo $GP_SEGMENT_ID' ON COORDINATOR FORMAT 'TEXT'; -CREATE -GRANT SELECT ON TABLE __gp_masterid TO public; +CREATE EXTERNAL WEB TABLE __gp_coordinatorid ( coordinatorid int ) EXECUTE E'echo $GP_SEGMENT_ID' ON COORDINATOR FORMAT 'TEXT'; +CREATE EXTERNAL TABLE +GRANT SELECT ON TABLE __gp_coordinatorid TO public; GRANT CREATE FUNCTION gp_instrument_shmem_detail_f() RETURNS SETOF RECORD AS '$libdir/gp_instrument_shmem', 'gp_instrument_shmem_detail' LANGUAGE C IMMUTABLE; -CREATE +CREATE FUNCTION GRANT EXECUTE ON FUNCTION gp_instrument_shmem_detail_f() TO public; GRANT -CREATE VIEW gp_instrument_shmem_detail AS WITH all_entries AS ( SELECT C.* FROM __gp_localid, gp_instrument_shmem_detail_f() as C ( tmid int4,ssid int4,ccnt int2,segid int2,pid int4 ,nid int2,tuplecount int8,nloops int8,ntuples int8 ) UNION ALL SELECT C.* FROM __gp_masterid, gp_instrument_shmem_detail_f() as C ( tmid int4,ssid int4,ccnt int2,segid int2,pid int4 ,nid int2,tuplecount int8,nloops int8,ntuples int8 )) SELECT tmid, ssid, ccnt,segid, pid, nid, tuplecount, nloops, ntuples FROM all_entries ORDER BY segid; -CREATE +CREATE VIEW gp_instrument_shmem_detail AS WITH all_entries AS ( SELECT C.* FROM __gp_localid, gp_instrument_shmem_detail_f() as C ( tmid int4,ssid int4,ccnt int2,segid int2,pid int4 ,nid int2,tuplecount int8,nloops int8,ntuples int8 ) UNION ALL SELECT C.* FROM __gp_coordinatorid, gp_instrument_shmem_detail_f() as C ( tmid int4,ssid int4,ccnt int2,segid int2,pid int4 ,nid int2,tuplecount int8,nloops int8,ntuples int8 )) SELECT tmid, ssid, ccnt,segid, pid, nid, tuplecount, nloops, ntuples FROM all_entries ORDER BY segid; +CREATE VIEW CREATE TABLE a (id int, c char) DISTRIBUTED BY (id); -CREATE +CREATE TABLE INSERT INTO a SELECT *, 'a' FROM generate_series(1, 50); -INSERT 50 +INSERT 0 50 SET OPTIMIZER=OFF; SET ANALYZE a; @@ -48,7 +48,7 @@ SELECT count(*) FROM (SELECT 1 FROM gp_instrument_shmem_detail GROUP BY ssid, cc (1 row) CREATE TABLE foo AS SELECT i a, i b FROM generate_series(1, 10) i; -CREATE 10 +SELECT 10 -- this query will be terminated by 'test pg_terminate_backend' 1&:EXPLAIN ANALYZE CREATE TEMP TABLE t1 AS SELECT count(*) FROM QUERY_METRICS.foo WHERE pg_sleep(200) IS NULL; @@ -156,9 +156,9 @@ SELECT count(*) FROM foo, pg_sleep(2); -- test 4: Merge Append should expose plan_node_id for whole plan tree CREATE TABLE QUERY_METRICS.mergeappend_test (a int, b int, x int) DISTRIBUTED BY (a,b); -CREATE +CREATE TABLE INSERT INTO QUERY_METRICS.mergeappend_test SELECT g/100, g/100, g FROM generate_series(1, 500) g; -INSERT 500 +INSERT 0 500 ANALYZE QUERY_METRICS.mergeappend_test; ANALYZE @@ -270,5 +270,5 @@ SELECT count(*) FROM (SELECT 1 FROM gp_instrument_shmem_detail GROUP BY ssid, cc -- start_ignore DROP SCHEMA IF EXISTS QUERY_METRICS CASCADE; -DROP +DROP SCHEMA -- end_ignore diff --git a/src/test/isolation2/expected/invalidated_toast_index.out b/src/test/isolation2/expected/invalidated_toast_index.out index 2c7e974813e..fe1351a4d75 100644 --- a/src/test/isolation2/expected/invalidated_toast_index.out +++ b/src/test/isolation2/expected/invalidated_toast_index.out @@ -5,19 +5,19 @@ -- CREATE TABLE toastable_heap(a text, b varchar, c int); -CREATE +CREATE TABLE -- Force external storage for toasted columns. ALTER TABLE toastable_heap ALTER COLUMN a SET STORAGE EXTERNAL; -ALTER +ALTER TABLE ALTER TABLE toastable_heap ALTER COLUMN b SET STORAGE EXTERNAL; -ALTER +ALTER TABLE -- Insert two values that we know will be toasted. INSERT INTO toastable_heap VALUES(repeat('a',100000), repeat('b',100001), 1); -INSERT 1 +INSERT 0 1 INSERT INTO toastable_heap VALUES(repeat('A',100000), repeat('B',100001), 2); -INSERT 1 +INSERT 0 1 -- start_ignore -- @@ -34,11 +34,7 @@ SET SET SET -*U: UPDATE pg_index - SET indisvalid = false - FROM pg_class heap - WHERE indrelid = heap.reltoastrelid - AND heap.oid = 'toastable_heap'::regclass; +*U: UPDATE pg_index SET indisvalid = false FROM pg_class heap WHERE indrelid = heap.reltoastrelid AND heap.oid = 'toastable_heap'::regclass; UPDATE 1 UPDATE 1 @@ -60,4 +56,4 @@ ERROR: no valid index found for toast relation with Oid 107484 (tuptoaster.c:10 -- Don't leave an unusable table in the DB for others to trip over. DROP TABLE toastable_heap; -DROP +DROP TABLE diff --git a/src/test/isolation2/expected/lockmodes.out b/src/test/isolation2/expected/lockmodes.out index 16635f9618b..01ce04b0582 100644 --- a/src/test/isolation2/expected/lockmodes.out +++ b/src/test/isolation2/expected/lockmodes.out @@ -1,14 +1,14 @@ -- table to just store the master's data directory path on segment. CREATE TABLE lockmodes_datadir(a int, dir text); -CREATE +CREATE TABLE INSERT INTO lockmodes_datadir select 1,datadir from gp_segment_configuration where role='p' and content=-1; -INSERT 1 +INSERT 0 1 1: set optimizer = off; SET create or replace view show_locks_lockmodes as select locktype, mode, granted, relation::regclass from pg_locks where gp_segment_id = -1 and locktype = 'relation' and relation::regclass::text like 't_lockmods%'; -CREATE +CREATE VIEW show gp_enable_global_deadlock_detector; gp_enable_global_deadlock_detector @@ -22,25 +22,25 @@ show gp_enable_global_deadlock_detector; -- 1.1 test for heap tables create table t_lockmods (c int) distributed randomly; -CREATE +CREATE TABLE insert into t_lockmods select * from generate_series(1, 5); -INSERT 5 +INSERT 0 5 analyze t_lockmods; ANALYZE create table t_lockmods1 (c int) distributed randomly; -CREATE +CREATE TABLE create table t_lockmods_rep(c int) distributed replicated; -CREATE +CREATE TABLE -- See github issue: https://github.com/greenplum-db/gpdb/issues/9449 -- upsert may lock tuples on segment, so we should upgrade lock level -- on QD if GDD is disabled. create table t_lockmods_upsert(a int, b int) distributed by (a); -CREATE +CREATE TABLE create unique index uidx_t_lockmodes_upsert on t_lockmods_upsert(a, b); -CREATE +CREATE INDEX -- add analyze to avoid auto vacuum when executing first insert analyze t_lockmods_upsert; ANALYZE @@ -71,7 +71,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -98,7 +98,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -125,7 +125,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -152,7 +152,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -180,7 +180,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -208,7 +208,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -236,7 +236,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -264,7 +264,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (4 rows) 1: abort; -ABORT +ROLLBACK -- 1.1.2 update | delete should hold ExclusiveLock on result relations 1: begin; @@ -277,7 +277,7 @@ UPDATE 5 relation | ExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -289,33 +289,33 @@ DELETE 5 relation | ExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK -- 1.1.3 insert should hold RowExclusiveLock on result relations 1: begin; BEGIN 1: insert into t_lockmods select * from generate_series(1, 5); -INSERT 5 +INSERT 0 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+------------ relation | RowExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK -- 1.1.4 upsert should hold ExclusiveLock on result relations 1: begin; BEGIN 1: insert into t_lockmods_upsert values (1, 1) on conflict(a, b) do update set b = 99; -INSERT 1 +INSERT 0 1 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+---------------+---------+------------------- relation | ExclusiveLock | t | t_lockmods_upsert (1 row) 1: abort; -ABORT +ROLLBACK -- 1.1.5 use cached plan should be consistent with no cached plan 1: prepare select_for_update as select * from t_lockmods for update; @@ -352,7 +352,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -371,7 +371,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -390,7 +390,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -409,65 +409,65 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute update_tlockmods; -EXECUTE 5 +UPDATE 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+---------------+---------+------------ relation | ExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute delete_tlockmods; -EXECUTE 5 +DELETE 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+---------------+---------+------------ relation | ExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute insert_tlockmods; -EXECUTE 5 +INSERT 0 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+------------ relation | RowExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute upsert_tlockmods; -EXECUTE 1 +INSERT 0 1 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+---------------+---------+------------------- relation | ExclusiveLock | t | t_lockmods_upsert (1 row) 1: abort; -ABORT +ROLLBACK -- 1.2 test for AO table create table t_lockmods_ao (c int) with (appendonly=true) distributed randomly; -CREATE +CREATE TABLE insert into t_lockmods_ao select * from generate_series(1, 8); -INSERT 8 +INSERT 0 8 analyze t_lockmods_ao; ANALYZE create table t_lockmods_ao1 (c int) with (appendonly=true) distributed randomly; -CREATE +CREATE TABLE -- 1.2.1 select for (update|share|key share|no key update) should hold ExclusiveLock on range tables 1: begin; @@ -498,7 +498,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -528,7 +528,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -558,7 +558,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -588,7 +588,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -616,7 +616,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -644,7 +644,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -672,7 +672,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -700,7 +700,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (4 rows) 1: abort; -ABORT +ROLLBACK -- 1.2.2 update | delete should hold ExclusiveLock on result relations 1: begin; @@ -713,7 +713,7 @@ UPDATE 8 relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -725,20 +725,20 @@ DELETE 8 relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK -- 1.2.3 insert should hold RowExclusiveLock on result relations 1: begin; BEGIN 1: insert into t_lockmods_ao select * from generate_series(1, 5); -INSERT 5 +INSERT 0 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+--------------- relation | RowExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK -- 1.2.4 use cached plan should be consistent with no cached plan 1: prepare select_for_update_ao as select * from t_lockmods_ao for update; @@ -776,7 +776,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -798,7 +798,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -820,7 +820,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -842,43 +842,43 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute update_tlockmods_ao; -EXECUTE 8 +UPDATE 8 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+---------------+---------+--------------- relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute delete_tlockmods_ao; -EXECUTE 8 +DELETE 8 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+---------------+---------+--------------- relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute insert_tlockmods_ao; -EXECUTE 5 +INSERT 0 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+--------------- relation | RowExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK -- 1.3 With limit clause, such case should -- acquire ExclusiveLock on the whole table and do not generate lockrows node @@ -908,7 +908,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK -- 1.4 For replicated table, we should lock the entire table on ExclusiveLock 1: begin; @@ -931,7 +931,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_rep (2 rows) 1: abort; -ABORT +ROLLBACK -- 1.5 test order-by's plan 1: begin; @@ -962,7 +962,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK -- 1.6 select for update NOWAIT/SKIP LOCKED -- NOWAIT/SKIP LOCKED should not affect the table-level lock @@ -979,7 +979,7 @@ BEGIN (5 rows) 2&: select * from t_lockmods for update nowait; 1: abort; -ABORT +ROLLBACK 2<: <... completed> c --- @@ -1003,7 +1003,7 @@ BEGIN (5 rows) 2&: select * from t_lockmods for update skip locked; 1: abort; -ABORT +ROLLBACK 2<: <... completed> c --- @@ -1026,12 +1026,12 @@ ABORT -- Details: https://groups.google.com/a/greenplum.org/g/gpdb-dev/c/wAPKpJzhbpM -- Issue: https://github.com/greenplum-db/gpdb/issues/13652 1:DROP TABLE IF EXISTS t_lockmods_part_tbl_dml; -DROP +DROP TABLE 1:CREATE TABLE t_lockmods_part_tbl_dml (a int, b int, c int) PARTITION BY RANGE(b) (START(1) END(3) EVERY(1)); -CREATE +CREATE TABLE 1:INSERT INTO t_lockmods_part_tbl_dml SELECT i, 1, i FROM generate_series(1,10)i; -INSERT 10 +INSERT 0 10 -- 1: BEGIN; @@ -1052,7 +1052,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: INSERT INTO t_lockmods_part_tbl_dml SELECT i, 1, i FROM generate_series(1,10)i; -INSERT 10 +INSERT 0 10 -- without GDD, it will lock all leaf partitions on QD 1: select * from show_locks_lockmodes; locktype | mode | granted | relation @@ -1134,8 +1134,8 @@ ROLLBACK -- enable gdd ALTER SYSTEM SET gp_enable_global_deadlock_detector TO on; -ALTER --- Use utility session on seg 0 to restart master. This way avoids the +ALTER SYSTEM +-- Use utility session on seg 0 to restart coordinator. This way avoids the -- situation where session issuing the restart doesn't disappear -- itself. 1U:SELECT pg_ctl(dir, 'restart') from lockmodes_datadir; @@ -1191,7 +1191,7 @@ BEGIN relation | RowShareLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1219,7 +1219,7 @@ BEGIN relation | RowShareLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1247,7 +1247,7 @@ BEGIN relation | RowShareLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1275,7 +1275,7 @@ BEGIN relation | RowShareLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1303,7 +1303,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1331,7 +1331,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1359,7 +1359,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1387,7 +1387,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (4 rows) 1: abort; -ABORT +ROLLBACK -- 2.1.2 update | delete should hold RowExclusiveLock on result relations @@ -1401,7 +1401,7 @@ UPDATE 5 relation | RowExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1413,33 +1413,33 @@ DELETE 5 relation | RowExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK -- 2.1.3 insert should hold RowExclusiveLock on result relations 1: begin; BEGIN 1: insert into t_lockmods select * from generate_series(1, 5); -INSERT 5 +INSERT 0 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+------------ relation | RowExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK -- 2.1.4 upsert should hold RowExclusiveLock on result relations 1: begin; BEGIN 1: insert into t_lockmods_upsert values (1, 1) on conflict(a, b) do update set b = 99; -INSERT 1 +INSERT 0 1 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+------------------- relation | RowExclusiveLock | t | t_lockmods_upsert (1 row) 1: abort; -ABORT +ROLLBACK -- 2.1.5 use cached plan should be consistent with no cached plan 1: prepare select_for_update as select * from t_lockmods for update; @@ -1476,7 +1476,7 @@ BEGIN relation | RowShareLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1495,7 +1495,7 @@ BEGIN relation | RowShareLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1514,7 +1514,7 @@ BEGIN relation | RowShareLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1533,55 +1533,55 @@ BEGIN relation | RowShareLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute update_tlockmods; -EXECUTE 5 +UPDATE 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+------------ relation | RowExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute delete_tlockmods; -EXECUTE 5 +DELETE 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+------------ relation | RowExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute insert_tlockmods; -EXECUTE 5 +INSERT 0 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+------------ relation | RowExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute upsert_tlockmods; -EXECUTE 1 +INSERT 0 1 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+------------------- relation | RowExclusiveLock | t | t_lockmods_upsert (1 row) 1: abort; -ABORT +ROLLBACK -- 2.2 test for AO table @@ -1614,7 +1614,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1644,7 +1644,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1674,7 +1674,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1704,7 +1704,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1732,7 +1732,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1760,7 +1760,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1788,7 +1788,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1816,7 +1816,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (4 rows) 1: abort; -ABORT +ROLLBACK -- 2.2.2 update | delete should hold ExclusiveLock on result relations 1: begin; @@ -1829,7 +1829,7 @@ UPDATE 8 relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1841,20 +1841,20 @@ DELETE 8 relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK -- 2.2.3 insert should hold RowExclusiveLock on result relations 1: begin; BEGIN 1: insert into t_lockmods_ao select * from generate_series(1, 5); -INSERT 5 +INSERT 0 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+--------------- relation | RowExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK -- 2.2.4 use cached plan should be consistent with no cached plan 1: prepare select_for_update_ao as select * from t_lockmods_ao for update; @@ -1892,7 +1892,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1914,7 +1914,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1936,7 +1936,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1958,43 +1958,43 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute update_tlockmods_ao; -EXECUTE 8 +UPDATE 8 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+---------------+---------+--------------- relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute delete_tlockmods_ao; -EXECUTE 8 +DELETE 8 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+---------------+---------+--------------- relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute insert_tlockmods_ao; -EXECUTE 5 +INSERT 0 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+--------------- relation | RowExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK -- 2.3 With limit clause, such case should -- acquire ExclusiveLock on the whole table and do not generate lockrows node @@ -2026,7 +2026,7 @@ BEGIN relation | RowShareLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK -- 2.4 For replicated table, we should lock the entire table on ExclusiveLock 1: begin; @@ -2049,7 +2049,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_rep (2 rows) 1: abort; -ABORT +ROLLBACK -- 2.5 test order-by's plan 1: begin; @@ -2081,7 +2081,7 @@ BEGIN relation | RowShareLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK -- 2.6 select for update NOWAIT/SKIP LOCKED -- with GDD, select for update could be optimized to not upgrade lock. @@ -2123,7 +2123,7 @@ BEGIN 2: select * from t_lockmods for update nowait; ERROR: could not obtain lock on row in relation "t_lockmods" (seg1 slice1 10.140.0.3:7003 pid=15182) 1: abort; -ABORT +ROLLBACK 1q: ... 2q: ... @@ -2199,7 +2199,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: INSERT INTO t_lockmods_part_tbl_dml SELECT i, 1, i FROM generate_series(1,10)i; -INSERT 10 +INSERT 0 10 -- With GDD enabled, QD will only hold lock on root for insert 1: select * from show_locks_lockmodes; locktype | mode | granted | relation @@ -2210,14 +2210,34 @@ INSERT 10 ROLLBACK 1q: ... +1: CREATE TABLE t_lockmods_aopart(i int, t text) USING ao_row PARTITION BY RANGE(i) (START(1) END(5) EVERY(1)); +CREATE TABLE +1: BEGIN; +BEGIN +1: DELETE FROM t_lockmods_aopart WHERE i = 4; +DELETE 0 +-- With GDD enabled, QD will only hold lock on root for delete +1: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+--------------------------- + relation | ExclusiveLock | t | t_lockmods_aopart_1_prt_4 + relation | AccessShareLock | t | t_lockmods_aopart + relation | ExclusiveLock | t | t_lockmods_aopart +(3 rows) +1: COMMIT; +COMMIT +1: DROP TABLE t_lockmods_aopart; +DROP TABLE +1q: ... + -- 2.8 Verify behaviors of select with locking clause (i.e. select for update) -- when running concurrently with index creation, for Heap tables. -- For AO/CO tables, refer to create_index_allows_readonly.source. 1: CREATE TABLE create_index_select_for_update_tbl(a int, b int); -CREATE +CREATE TABLE 1: INSERT INTO create_index_select_for_update_tbl SELECT i,i FROM generate_series(1,10)i; -INSERT 10 +INSERT 0 10 1: set optimizer = off; SET @@ -2243,7 +2263,7 @@ SET BEGIN -- expect no blocking 2: CREATE INDEX create_index_select_for_update_idx ON create_index_select_for_update_tbl(a); -CREATE +CREATE INDEX 2: COMMIT; COMMIT @@ -2251,12 +2271,12 @@ COMMIT COMMIT 2: DROP INDEX create_index_select_for_update_idx; -DROP +DROP INDEX 2: BEGIN; BEGIN 2: CREATE INDEX create_index_select_for_update_idx ON create_index_select_for_update_tbl(a); -CREATE +CREATE INDEX 1: BEGIN; BEGIN @@ -2275,12 +2295,12 @@ COMMIT COMMIT 2: DROP INDEX create_index_select_for_update_idx; -DROP +DROP INDEX -- 2.8.2 with GDD disabled, expect blocking -- reset gdd 2: ALTER SYSTEM RESET gp_enable_global_deadlock_detector; -ALTER +ALTER SYSTEM -- close session to avoid renew session failure after restart 2q: ... 1U:SELECT pg_ctl(dir, 'restart') from lockmodes_datadir; @@ -2317,17 +2337,17 @@ BEGIN COMMIT 2<: <... completed> -CREATE +CREATE INDEX 2: COMMIT; COMMIT 2: DROP INDEX create_index_select_for_update_idx; -DROP +DROP INDEX 2: BEGIN; BEGIN 2: CREATE INDEX create_index_select_for_update_idx ON create_index_select_for_update_tbl(a); -CREATE +CREATE INDEX 1: BEGIN; BEGIN @@ -2346,7 +2366,7 @@ COMMIT COMMIT 1: drop table lockmodes_datadir; -DROP +DROP TABLE 1q: ... 2q: ... @@ -2355,13 +2375,13 @@ DROP -- require an AccessExclusiveLock. -- Case 1. The analyze result is expected when there's concurrent drop on child. 1:create table analyzedrop(a int) partition by range(a); -CREATE +CREATE TABLE 1:create table analyzedrop_1 partition of analyzedrop for values from (0) to (10); -CREATE +CREATE TABLE 1:create table analyzedrop_2 partition of analyzedrop for values from (10) to (20); -CREATE +CREATE TABLE 1:insert into analyzedrop select * from generate_series(0,19); -INSERT 20 +INSERT 0 20 1:select gp_inject_fault_infinite('merge_leaf_stats_after_find_children', 'suspend', dbid) from gp_segment_configuration where content = -1 and role = 'p'; gp_inject_fault_infinite -------------------------- @@ -2377,7 +2397,7 @@ INSERT 20 1<: <... completed> ANALYZE 2<: <... completed> -DROP +DROP TABLE 3:select * from pg_stats where tablename like 'analyzedrop%'; schemaname | tablename | attname | inherited | null_frac | avg_width | n_distinct | most_common_vals | most_common_freqs | histogram_bounds | correlation | most_common_elems | most_common_elem_freqs | elem_count_histogram ------------+---------------+---------+-----------+-----------+-----------+------------+------------------+-------------------+--------------------------------------------------+-------------+-------------------+------------------------+---------------------- @@ -2401,9 +2421,9 @@ DROP 1<: <... completed> ANALYZE 2<: <... completed> -DROP +DROP TABLE 3<: <... completed> -DROP +DROP TABLE --empty as table is dropped 4:select * from pg_stats where tablename like 'analyzedrop%'; schemaname | tablename | attname | inherited | null_frac | avg_width | n_distinct | most_common_vals | most_common_freqs | histogram_bounds | correlation | most_common_elems | most_common_elem_freqs | elem_count_histogram diff --git a/src/test/isolation2/expected/lockmodes_optimizer.out b/src/test/isolation2/expected/lockmodes_optimizer.out index 9077e116cf2..420b205ad64 100644 --- a/src/test/isolation2/expected/lockmodes_optimizer.out +++ b/src/test/isolation2/expected/lockmodes_optimizer.out @@ -1,14 +1,14 @@ -- table to just store the master's data directory path on segment. CREATE TABLE lockmodes_datadir(a int, dir text); -CREATE +CREATE TABLE INSERT INTO lockmodes_datadir select 1,datadir from gp_segment_configuration where role='p' and content=-1; -INSERT 1 +INSERT 0 1 1: set optimizer = off; SET create or replace view show_locks_lockmodes as select locktype, mode, granted, relation::regclass from pg_locks where gp_segment_id = -1 and locktype = 'relation' and relation::regclass::text like 't_lockmods%'; -CREATE +CREATE VIEW show gp_enable_global_deadlock_detector; gp_enable_global_deadlock_detector @@ -22,25 +22,25 @@ show gp_enable_global_deadlock_detector; -- 1.1 test for heap tables create table t_lockmods (c int) distributed randomly; -CREATE +CREATE TABLE insert into t_lockmods select * from generate_series(1, 5); -INSERT 5 +INSERT 0 5 analyze t_lockmods; ANALYZE create table t_lockmods1 (c int) distributed randomly; -CREATE +CREATE TABLE create table t_lockmods_rep(c int) distributed replicated; -CREATE +CREATE TABLE -- See github issue: https://github.com/greenplum-db/gpdb/issues/9449 -- upsert may lock tuples on segment, so we should upgrade lock level -- on QD if GDD is disabled. create table t_lockmods_upsert(a int, b int) distributed by (a); -CREATE +CREATE TABLE create unique index uidx_t_lockmodes_upsert on t_lockmods_upsert(a, b); -CREATE +CREATE INDEX -- add analyze to avoid auto vacuum when executing first insert analyze t_lockmods_upsert; ANALYZE @@ -71,7 +71,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -98,7 +98,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -125,7 +125,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -152,7 +152,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -180,7 +180,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -208,7 +208,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -236,7 +236,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -264,7 +264,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (4 rows) 1: abort; -ABORT +ROLLBACK -- 1.1.2 update | delete should hold ExclusiveLock on result relations 1: begin; @@ -277,7 +277,7 @@ UPDATE 5 relation | ExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -289,33 +289,33 @@ DELETE 5 relation | ExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK -- 1.1.3 insert should hold RowExclusiveLock on result relations 1: begin; BEGIN 1: insert into t_lockmods select * from generate_series(1, 5); -INSERT 5 +INSERT 0 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+------------ relation | RowExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK -- 1.1.4 upsert should hold ExclusiveLock on result relations 1: begin; BEGIN 1: insert into t_lockmods_upsert values (1, 1) on conflict(a, b) do update set b = 99; -INSERT 1 +INSERT 0 1 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+---------------+---------+------------------- relation | ExclusiveLock | t | t_lockmods_upsert (1 row) 1: abort; -ABORT +ROLLBACK -- 1.1.5 use cached plan should be consistent with no cached plan 1: prepare select_for_update as select * from t_lockmods for update; @@ -352,7 +352,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -371,7 +371,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -390,7 +390,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -409,65 +409,65 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute update_tlockmods; -EXECUTE 5 +UPDATE 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+---------------+---------+------------ relation | ExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute delete_tlockmods; -EXECUTE 5 +DELETE 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+---------------+---------+------------ relation | ExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute insert_tlockmods; -EXECUTE 5 +INSERT 0 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+------------ relation | RowExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute upsert_tlockmods; -EXECUTE 1 +INSERT 0 1 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+---------------+---------+------------------- relation | ExclusiveLock | t | t_lockmods_upsert (1 row) 1: abort; -ABORT +ROLLBACK -- 1.2 test for AO table create table t_lockmods_ao (c int) with (appendonly=true) distributed randomly; -CREATE +CREATE TABLE insert into t_lockmods_ao select * from generate_series(1, 8); -INSERT 8 +INSERT 0 8 analyze t_lockmods_ao; ANALYZE create table t_lockmods_ao1 (c int) with (appendonly=true) distributed randomly; -CREATE +CREATE TABLE -- 1.2.1 select for (update|share|key share|no key update) should hold ExclusiveLock on range tables 1: begin; @@ -498,7 +498,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -528,7 +528,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -558,7 +558,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -588,7 +588,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -616,7 +616,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -644,7 +644,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -672,7 +672,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -700,7 +700,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (4 rows) 1: abort; -ABORT +ROLLBACK -- 1.2.2 update | delete should hold ExclusiveLock on result relations 1: begin; @@ -713,7 +713,7 @@ UPDATE 8 relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -725,20 +725,20 @@ DELETE 8 relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK -- 1.2.3 insert should hold RowExclusiveLock on result relations 1: begin; BEGIN 1: insert into t_lockmods_ao select * from generate_series(1, 5); -INSERT 5 +INSERT 0 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+--------------- relation | RowExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK -- 1.2.4 use cached plan should be consistent with no cached plan 1: prepare select_for_update_ao as select * from t_lockmods_ao for update; @@ -776,7 +776,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -798,7 +798,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -820,7 +820,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -842,43 +842,43 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute update_tlockmods_ao; -EXECUTE 8 +UPDATE 8 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+---------------+---------+--------------- relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute delete_tlockmods_ao; -EXECUTE 8 +DELETE 8 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+---------------+---------+--------------- relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute insert_tlockmods_ao; -EXECUTE 5 +INSERT 0 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+--------------- relation | RowExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK -- 1.3 With limit clause, such case should -- acquire ExclusiveLock on the whole table and do not generate lockrows node @@ -908,7 +908,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK -- 1.4 For replicated table, we should lock the entire table on ExclusiveLock 1: begin; @@ -931,7 +931,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_rep (2 rows) 1: abort; -ABORT +ROLLBACK -- 1.5 test order-by's plan 1: begin; @@ -962,7 +962,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK -- 1.6 select for update NOWAIT/SKIP LOCKED -- NOWAIT/SKIP LOCKED should not affect the table-level lock @@ -979,7 +979,7 @@ BEGIN (5 rows) 2&: select * from t_lockmods for update nowait; 1: abort; -ABORT +ROLLBACK 2<: <... completed> c --- @@ -1003,7 +1003,7 @@ BEGIN (5 rows) 2&: select * from t_lockmods for update skip locked; 1: abort; -ABORT +ROLLBACK 2<: <... completed> c --- @@ -1026,12 +1026,12 @@ ABORT -- Details: https://groups.google.com/a/greenplum.org/g/gpdb-dev/c/wAPKpJzhbpM -- Issue: https://github.com/greenplum-db/gpdb/issues/13652 1:DROP TABLE IF EXISTS t_lockmods_part_tbl_dml; -DROP +DROP TABLE 1:CREATE TABLE t_lockmods_part_tbl_dml (a int, b int, c int) PARTITION BY RANGE(b) (START(1) END(3) EVERY(1)); -CREATE +CREATE TABLE 1:INSERT INTO t_lockmods_part_tbl_dml SELECT i, 1, i FROM generate_series(1,10)i; -INSERT 10 +INSERT 0 10 -- 1: BEGIN; @@ -1052,7 +1052,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: INSERT INTO t_lockmods_part_tbl_dml SELECT i, 1, i FROM generate_series(1,10)i; -INSERT 10 +INSERT 0 10 -- without GDD, it will lock all leaf partitions on QD 1: select * from show_locks_lockmodes; locktype | mode | granted | relation @@ -1135,8 +1135,8 @@ ROLLBACK -- enable gdd ALTER SYSTEM SET gp_enable_global_deadlock_detector TO on; -ALTER --- Use utility session on seg 0 to restart master. This way avoids the +ALTER SYSTEM +-- Use utility session on seg 0 to restart coordinator. This way avoids the -- situation where session issuing the restart doesn't disappear -- itself. 1U:SELECT pg_ctl(dir, 'restart') from lockmodes_datadir; @@ -1192,7 +1192,7 @@ BEGIN relation | RowShareLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1220,7 +1220,7 @@ BEGIN relation | RowShareLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1248,7 +1248,7 @@ BEGIN relation | RowShareLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1276,7 +1276,7 @@ BEGIN relation | RowShareLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1304,7 +1304,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1332,7 +1332,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1360,7 +1360,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1388,7 +1388,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods (4 rows) 1: abort; -ABORT +ROLLBACK -- 2.1.2 update | delete should hold RowExclusiveLock on result relations @@ -1402,7 +1402,7 @@ UPDATE 5 relation | RowExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1414,33 +1414,33 @@ DELETE 5 relation | RowExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK -- 2.1.3 insert should hold RowExclusiveLock on result relations 1: begin; BEGIN 1: insert into t_lockmods select * from generate_series(1, 5); -INSERT 5 +INSERT 0 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+------------ relation | RowExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK -- 2.1.4 upsert should hold RowExclusiveLock on result relations 1: begin; BEGIN 1: insert into t_lockmods_upsert values (1, 1) on conflict(a, b) do update set b = 99; -INSERT 1 +INSERT 0 1 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+------------------- relation | RowExclusiveLock | t | t_lockmods_upsert (1 row) 1: abort; -ABORT +ROLLBACK -- 2.1.5 use cached plan should be consistent with no cached plan 1: prepare select_for_update as select * from t_lockmods for update; @@ -1477,7 +1477,7 @@ BEGIN relation | RowShareLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1496,7 +1496,7 @@ BEGIN relation | RowShareLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1515,7 +1515,7 @@ BEGIN relation | RowShareLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1534,55 +1534,55 @@ BEGIN relation | RowShareLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute update_tlockmods; -EXECUTE 5 +UPDATE 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+------------ relation | RowExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute delete_tlockmods; -EXECUTE 5 +DELETE 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+------------ relation | RowExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute insert_tlockmods; -EXECUTE 5 +INSERT 0 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+------------ relation | RowExclusiveLock | t | t_lockmods (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute upsert_tlockmods; -EXECUTE 1 +INSERT 0 1 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+------------------- relation | RowExclusiveLock | t | t_lockmods_upsert (1 row) 1: abort; -ABORT +ROLLBACK -- 2.2 test for AO table @@ -1615,7 +1615,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1645,7 +1645,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1675,7 +1675,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1705,7 +1705,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (2 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1733,7 +1733,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1761,7 +1761,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1789,7 +1789,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (4 rows) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1817,7 +1817,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (4 rows) 1: abort; -ABORT +ROLLBACK -- 2.2.2 update | delete should hold ExclusiveLock on result relations 1: begin; @@ -1830,7 +1830,7 @@ UPDATE 8 relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1842,20 +1842,20 @@ DELETE 8 relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK -- 2.2.3 insert should hold RowExclusiveLock on result relations 1: begin; BEGIN 1: insert into t_lockmods_ao select * from generate_series(1, 5); -INSERT 5 +INSERT 0 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+--------------- relation | RowExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK -- 2.2.4 use cached plan should be consistent with no cached plan 1: prepare select_for_update_ao as select * from t_lockmods_ao for update; @@ -1893,7 +1893,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1915,7 +1915,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1937,7 +1937,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN @@ -1959,43 +1959,43 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute update_tlockmods_ao; -EXECUTE 8 +UPDATE 8 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+---------------+---------+--------------- relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute delete_tlockmods_ao; -EXECUTE 8 +DELETE 8 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+---------------+---------+--------------- relation | ExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK 1: begin; BEGIN 1: execute insert_tlockmods_ao; -EXECUTE 5 +INSERT 0 5 2: select * from show_locks_lockmodes; locktype | mode | granted | relation ----------+------------------+---------+--------------- relation | RowExclusiveLock | t | t_lockmods_ao (1 row) 1: abort; -ABORT +ROLLBACK -- 2.3 With limit clause, such case should -- acquire ExclusiveLock on the whole table and do not generate lockrows node @@ -2028,7 +2028,7 @@ BEGIN relation | RowShareLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK -- 2.4 For replicated table, we should lock the entire table on ExclusiveLock 1: begin; @@ -2051,7 +2051,7 @@ BEGIN relation | ExclusiveLock | t | t_lockmods_rep (2 rows) 1: abort; -ABORT +ROLLBACK -- 2.5 test order-by's plan 1: begin; @@ -2083,7 +2083,7 @@ BEGIN relation | RowShareLock | t | t_lockmods (2 rows) 1: abort; -ABORT +ROLLBACK -- 2.6 select for update NOWAIT/SKIP LOCKED -- with GDD, select for update could be optimized to not upgrade lock. @@ -2125,7 +2125,7 @@ BEGIN 2: select * from t_lockmods for update nowait; ERROR: could not obtain lock on row in relation "t_lockmods" (seg1 slice1 10.140.0.3:7003 pid=15182) 1: abort; -ABORT +ROLLBACK 1q: ... 2q: ... @@ -2202,7 +2202,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: INSERT INTO t_lockmods_part_tbl_dml SELECT i, 1, i FROM generate_series(1,10)i; -INSERT 10 +INSERT 0 10 -- With GDD enabled, QD will only hold lock on root for insert 1: select * from show_locks_lockmodes; locktype | mode | granted | relation @@ -2214,14 +2214,37 @@ INSERT 10 ROLLBACK 1q: ... +1: CREATE TABLE t_lockmods_aopart(i int, t text) USING ao_row PARTITION BY RANGE(i) (START(1) END(5) EVERY(1)); +CREATE TABLE +1: BEGIN; +BEGIN +1: DELETE FROM t_lockmods_aopart WHERE i = 4; +DELETE 0 +-- With GDD enabled, QD will only hold lock on root for delete +1: select * from show_locks_lockmodes; + locktype | mode | granted | relation +----------+-----------------+---------+--------------------------- + relation | AccessShareLock | t | t_lockmods_aopart_1_prt_4 + relation | AccessShareLock | t | t_lockmods_aopart_1_prt_3 + relation | AccessShareLock | t | t_lockmods_aopart_1_prt_2 + relation | AccessShareLock | t | t_lockmods_aopart_1_prt_1 + relation | AccessShareLock | t | t_lockmods_aopart + relation | ExclusiveLock | t | t_lockmods_aopart +(6 rows) +1: COMMIT; +COMMIT +1: DROP TABLE t_lockmods_aopart; +DROP TABLE +1q: ... + -- 2.8 Verify behaviors of select with locking clause (i.e. select for update) -- when running concurrently with index creation, for Heap tables. -- For AO/CO tables, refer to create_index_allows_readonly.source. 1: CREATE TABLE create_index_select_for_update_tbl(a int, b int); -CREATE +CREATE TABLE 1: INSERT INTO create_index_select_for_update_tbl SELECT i,i FROM generate_series(1,10)i; -INSERT 10 +INSERT 0 10 1: set optimizer = off; SET @@ -2247,7 +2270,7 @@ SET BEGIN -- expect no blocking 2: CREATE INDEX create_index_select_for_update_idx ON create_index_select_for_update_tbl(a); -CREATE +CREATE INDEX 2: COMMIT; COMMIT @@ -2255,12 +2278,12 @@ COMMIT COMMIT 2: DROP INDEX create_index_select_for_update_idx; -DROP +DROP INDEX 2: BEGIN; BEGIN 2: CREATE INDEX create_index_select_for_update_idx ON create_index_select_for_update_tbl(a); -CREATE +CREATE INDEX 1: BEGIN; BEGIN @@ -2279,12 +2302,12 @@ COMMIT COMMIT 2: DROP INDEX create_index_select_for_update_idx; -DROP +DROP INDEX -- 2.8.2 with GDD disabled, expect blocking -- reset gdd 2: ALTER SYSTEM RESET gp_enable_global_deadlock_detector; -ALTER +ALTER SYSTEM -- close session to avoid renew session failure after restart 2q: ... 1U:SELECT pg_ctl(dir, 'restart') from lockmodes_datadir; @@ -2321,17 +2344,17 @@ BEGIN COMMIT 2<: <... completed> -CREATE +CREATE INDEX 2: COMMIT; COMMIT 2: DROP INDEX create_index_select_for_update_idx; -DROP +DROP INDEX 2: BEGIN; BEGIN 2: CREATE INDEX create_index_select_for_update_idx ON create_index_select_for_update_tbl(a); -CREATE +CREATE INDEX 1: BEGIN; BEGIN @@ -2350,7 +2373,7 @@ COMMIT COMMIT 1: drop table lockmodes_datadir; -DROP +DROP TABLE 1q: ... 2q: ... @@ -2359,13 +2382,13 @@ DROP -- require an AccessExclusiveLock. -- Case 1. The analyze result is expected when there's concurrent drop on child. 1:create table analyzedrop(a int) partition by range(a); -CREATE +CREATE TABLE 1:create table analyzedrop_1 partition of analyzedrop for values from (0) to (10); -CREATE +CREATE TABLE 1:create table analyzedrop_2 partition of analyzedrop for values from (10) to (20); -CREATE +CREATE TABLE 1:insert into analyzedrop select * from generate_series(0,19); -INSERT 20 +INSERT 0 20 1:select gp_inject_fault_infinite('merge_leaf_stats_after_find_children', 'suspend', dbid) from gp_segment_configuration where content = -1 and role = 'p'; gp_inject_fault_infinite -------------------------- @@ -2381,7 +2404,7 @@ INSERT 20 1<: <... completed> ANALYZE 2<: <... completed> -DROP +DROP TABLE 3:select * from pg_stats where tablename like 'analyzedrop%'; schemaname | tablename | attname | inherited | null_frac | avg_width | n_distinct | most_common_vals | most_common_freqs | histogram_bounds | correlation | most_common_elems | most_common_elem_freqs | elem_count_histogram ------------+---------------+---------+-----------+-----------+-----------+------------+------------------+-------------------+--------------------------------------------------+-------------+-------------------+------------------------+---------------------- @@ -2405,9 +2428,9 @@ DROP 1<: <... completed> ANALYZE 2<: <... completed> -DROP +DROP TABLE 3<: <... completed> -DROP +DROP TABLE --empty as table is dropped 4:select * from pg_stats where tablename like 'analyzedrop%'; schemaname | tablename | attname | inherited | null_frac | avg_width | n_distinct | most_common_vals | most_common_freqs | histogram_bounds | correlation | most_common_elems | most_common_elem_freqs | elem_count_histogram diff --git a/src/test/isolation2/expected/mark_all_aoseg_await_drop.out b/src/test/isolation2/expected/mark_all_aoseg_await_drop.out index 2bdc65236f8..77c1b98655c 100644 --- a/src/test/isolation2/expected/mark_all_aoseg_await_drop.out +++ b/src/test/isolation2/expected/mark_all_aoseg_await_drop.out @@ -3,7 +3,7 @@ -- AOSEG_STATE_AWAITING_DROP. CREATE TABLE mark_all_aoseg_await_drop (a int) WITH (appendonly=true); -CREATE +CREATE TABLE -- Create 3 aoseg entries 0: BEGIN; @@ -13,11 +13,11 @@ BEGIN 2: BEGIN; BEGIN 0: INSERT INTO mark_all_aoseg_await_drop SELECT i FROM generate_series(1, 10)i; -INSERT 10 +INSERT 0 10 1: INSERT INTO mark_all_aoseg_await_drop SELECT i FROM generate_series(1, 10)i; -INSERT 10 +INSERT 0 10 2: INSERT INTO mark_all_aoseg_await_drop SELECT i FROM generate_series(1, 10)i; -INSERT 10 +INSERT 0 10 0: COMMIT; COMMIT 1: COMMIT; @@ -46,11 +46,11 @@ BEGIN 0 (1 row) 1: INSERT INTO mark_all_aoseg_await_drop SELECT i FROM generate_series(1, 10)i; -INSERT 10 +INSERT 0 10 2: VACUUM mark_all_aoseg_await_drop; VACUUM 1: END; -END +COMMIT -- We should see segno 2 and 3 in state 2 (AOSEG_STATE_AWAITING_DROP) -- and segno 1 and 4 in state 1 (AOSEG_STATE_DEFAULT). Segno 1 is not diff --git a/src/test/isolation2/expected/misc.out b/src/test/isolation2/expected/misc.out index c342e1ad5cf..bf65cf90c4a 100644 --- a/src/test/isolation2/expected/misc.out +++ b/src/test/isolation2/expected/misc.out @@ -5,11 +5,11 @@ -- preassigned in QD, if we create a table in utility mode in QE, the oid might -- conflict with preassigned oid. -1U: create table utilitymode_primary_key_tab (c1 int); -CREATE +CREATE TABLE -1U: create unique index idx_utilitymode_c1 on utilitymode_primary_key_tab (c1); -CREATE +CREATE INDEX -1U: drop table utilitymode_primary_key_tab; -DROP +DROP TABLE -- Try a few queries in utility mode. (Once upon a time, there was a bug that -- caused a crash on EXPLAIN ANALYZE on a Sort node in utility mode.) @@ -62,7 +62,7 @@ ROLLBACK -- -- We have changed the name to pg_temp_0 in utility mode. 0U: CREATE TEMP TABLE utilitymode_tmp_tab (c1 int) DISTRIBUTED BY (c1); -CREATE +CREATE TABLE 0U: SELECT substring(n.nspname FROM 1 FOR 9) FROM pg_namespace n JOIN pg_class c ON n.oid = c.relnamespace WHERE c.relname = 'utilitymode_tmp_tab'; substring ----------- @@ -78,7 +78,7 @@ CREATE -- gp_dist_random('') should not crash in utility mode -- create or replace view misc_v as select 1; -CREATE +CREATE VIEW 0U: select 1 from gp_dist_random('misc_v') union select 1 from misc_v; ?column? ---------- @@ -91,12 +91,12 @@ CREATE (1 row) -- But views created in utility mode should not throw away gp_dist_random 0U: create or replace view misc_v2 as select 1 from gp_dist_random('pg_class'); -CREATE +CREATE VIEW 0U: select definition from pg_views where viewname = 'misc_v2'; definition ------------------------------------------------------------- - FROM gp_dist_random('pg_class'); SELECT 1 AS "?column?" + FROM gp_dist_random('pg_class'); (1 row) 0U: select count(*) > 0 from gp_dist_random('misc_v2'); ?column? @@ -104,7 +104,7 @@ CREATE t (1 row) 0U: drop view misc_v2; -DROP +DROP VIEW drop view misc_v; DROP diff --git a/src/test/isolation2/expected/modify_table_data_corrupt.out b/src/test/isolation2/expected/modify_table_data_corrupt.out index e5fc04f36f0..3af5476081e 100644 --- a/src/test/isolation2/expected/modify_table_data_corrupt.out +++ b/src/test/isolation2/expected/modify_table_data_corrupt.out @@ -24,18 +24,18 @@ DROP -- and see if it is motioned to other segments. create table tab1(a int, b int) distributed by (b); -CREATE +CREATE TABLE create table tab2(a int, b int) distributed by (a); -CREATE +CREATE TABLE create table tab3 (a int, b int) distributed by (b); -CREATE +CREATE TABLE insert into tab1 values (1, 1); -INSERT 1 +INSERT 0 1 insert into tab2 values (1, 1); -INSERT 1 +INSERT 0 1 insert into tab3 values (1, 1); -INSERT 1 +INSERT 0 1 analyze tab1; ANALYZE @@ -56,7 +56,7 @@ update pg_class set reltuples = 100000 where relname='tab3'; UPDATE 1 0U: insert into tab1 values (1, 1); -INSERT 1 +INSERT 0 1 select gp_segment_id, * from tab1; gp_segment_id | a | b @@ -90,7 +90,7 @@ BEGIN delete from tab1 using tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.b; ERROR: distribution key of the tuple (0, 1) doesn't belong to current segment (actually from seg0) (nodeModifyTable.c:735) (seg1 127.0.1.1:7003 pid=89508) (nodeModifyTable.c:735) abort; -ABORT +ROLLBACK -- For planner, this will error out explain (costs off) update tab1 set a = 999 from tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.b; @@ -117,7 +117,7 @@ BEGIN update tab1 set a = 999 from tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.b; ERROR: distribution key of the tuple (0, 1) doesn't belong to current segment (actually from seg0) (nodeModifyTable.c:1276) (seg1 127.0.1.1:7003 pid=89508) (nodeModifyTable.c:1276) abort; -ABORT +ROLLBACK -- For orca, this will error out explain (costs off) delete from tab1 using tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.a; @@ -144,7 +144,7 @@ BEGIN delete from tab1 using tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.a; DELETE 2 abort; -ABORT +ROLLBACK -- For orca, this will error out explain (costs off) update tab1 set a = 999 from tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.a; @@ -171,7 +171,7 @@ BEGIN update tab1 set a = 999 from tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.a; UPDATE 2 abort; -ABORT +ROLLBACK -- test splitupdate. -- For orca, the plan contains a redistribute motion, so that @@ -193,11 +193,11 @@ BEGIN update tab1 set b = b + 1; UPDATE 2 abort; -ABORT +ROLLBACK drop table tab1; -DROP +DROP TABLE drop table tab2; -DROP +DROP TABLE drop table tab3; -DROP +DROP TABLE diff --git a/src/test/isolation2/expected/modify_table_data_corrupt_optimizer.out b/src/test/isolation2/expected/modify_table_data_corrupt_optimizer.out index 2a647497cb0..b60bb24315b 100644 --- a/src/test/isolation2/expected/modify_table_data_corrupt_optimizer.out +++ b/src/test/isolation2/expected/modify_table_data_corrupt_optimizer.out @@ -24,18 +24,18 @@ ERROR: table "tab3" does not exist -- and see if it is motioned to other segments. create table tab1(a int, b int) distributed by (b); -CREATE +CREATE TABLE create table tab2(a int, b int) distributed by (a); -CREATE +CREATE TABLE create table tab3 (a int, b int) distributed by (b); -CREATE +CREATE TABLE insert into tab1 values (1, 1); -INSERT 1 +INSERT 0 1 insert into tab2 values (1, 1); -INSERT 1 +INSERT 0 1 insert into tab3 values (1, 1); -INSERT 1 +INSERT 0 1 analyze tab1; ANALYZE @@ -56,7 +56,7 @@ update pg_class set reltuples = 100000 where relname='tab3'; UPDATE 1 0U: insert into tab1 values (1, 1); -INSERT 1 +INSERT 0 1 select gp_segment_id, * from tab1; gp_segment_id | a | b @@ -90,7 +90,7 @@ BEGIN delete from tab1 using tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.b; DELETE 1 abort; -ABORT +ROLLBACK -- For planner, this will error out explain (costs off) update tab1 set a = 999 from tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.b; @@ -110,14 +110,14 @@ explain (costs off) update tab1 set a = 999 from tab2, tab3 where tab1.a = tab2. -> Seq Scan on tab3 -> Hash -> Seq Scan on tab1 - Optimizer: Pivotal Optimizer (GPORCA) + Optimizer: Pivotal Optimizer (GPORCA) version 3.86.0 (15 rows) begin; BEGIN update tab1 set a = 999 from tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.b; UPDATE 1 abort; -ABORT +ROLLBACK -- For orca, this will error out explain (costs off) delete from tab1 using tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.a; @@ -145,7 +145,7 @@ BEGIN delete from tab1 using tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.a; ERROR: distribution key of the tuple (0, 1) doesn't belong to current segment (actually from seg0) (nodeModifyTable.c:1156) (seg1 172.17.0.2:7003 pid=30251) (nodeModifyTable.c:1156) abort; -ABORT +ROLLBACK -- For orca, this will error out explain (costs off) update tab1 set a = 999 from tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.a; @@ -166,14 +166,14 @@ explain (costs off) update tab1 set a = 999 from tab2, tab3 where tab1.a = tab2. -> Hash -> Broadcast Motion 3:3 (slice3; segments: 3) -> Seq Scan on tab1 - Optimizer: Pivotal Optimizer (GPORCA) + Optimizer: Pivotal Optimizer (GPORCA) version 3.86.0 (16 rows) begin; BEGIN update tab1 set a = 999 from tab2, tab3 where tab1.a = tab2.a and tab1.b = tab3.a; ERROR: distribution key of the tuple (0, 1) doesn't belong to current segment (actually from seg0) (nodeModifyTable.c:1156) (seg1 172.17.0.2:7003 pid=30251) (nodeModifyTable.c:1156) abort; -ABORT +ROLLBACK -- test splitupdate. -- For orca, the plan contains a redistribute motion, so that @@ -199,11 +199,11 @@ BEGIN update tab1 set b = b + 1; ERROR: distribution key of the tuple (0, 1) doesn't belong to current segment (actually from seg0) (nodeModifyTable.c:1156) (seg1 172.17.0.2:7003 pid=30251) (nodeModifyTable.c:1156) abort; -ABORT +ROLLBACK drop table tab1; -DROP +DROP TABLE drop table tab2; -DROP +DROP TABLE drop table tab3; -DROP +DROP TABLE diff --git a/src/test/isolation2/expected/orphan_temp_table.out b/src/test/isolation2/expected/orphan_temp_table.out index 85cbe165008..a47a7642748 100644 --- a/src/test/isolation2/expected/orphan_temp_table.out +++ b/src/test/isolation2/expected/orphan_temp_table.out @@ -3,7 +3,7 @@ -- case 1: Before the fix, when backend process panic on the segment, the temp table will be left on the coordinator. -- create a temp table 1: CREATE TEMP TABLE test_temp_table_cleanup(a int); -CREATE +CREATE TABLE -- panic on segment 0 1: SELECT gp_inject_fault('before_exec_scan', 'panic', dbid) FROM gp_segment_configuration WHERE role='p' AND content = 0; diff --git a/src/test/isolation2/expected/pg_rewind_fail_missing_xlog.out b/src/test/isolation2/expected/pg_rewind_fail_missing_xlog.out index 845dc6be0f7..9520545d094 100644 --- a/src/test/isolation2/expected/pg_rewind_fail_missing_xlog.out +++ b/src/test/isolation2/expected/pg_rewind_fail_missing_xlog.out @@ -9,9 +9,9 @@ CREATE OR REPLACE FUNCTION connectSeg(n int, port int, hostname text) RETURNS bo CREATE CREATE TABLE tst_missing_tbl (a int); -CREATE +CREATE TABLE INSERT INTO tst_missing_tbl values(2),(1),(5); -INSERT 3 +INSERT 0 3 -- Make the test faster by not preserving any extra wal segment files !\retcode gpconfig -c wal_keep_size -v 0; @@ -42,7 +42,7 @@ CHECKPOINT t (1 row) 1: INSERT INTO tst_missing_tbl values(2),(1),(5); -INSERT 3 +INSERT 0 3 -- Should be not needed mostly but let's 100% ensure since pg_switch_wal() -- won't switch if it has been on the boundary (seldom though). 0U: SELECT pg_switch_wal is not null FROM pg_switch_wal(); @@ -51,7 +51,7 @@ INSERT 3 t (1 row) 1: INSERT INTO tst_missing_tbl values(2),(1),(5); -INSERT 3 +INSERT 0 3 0Uq: ... -- Make sure primary/mirror pair is in sync, otherwise FTS can't promote mirror @@ -87,9 +87,9 @@ CHECKPOINT 0M: BEGIN; BEGIN 0M: DROP TABLE tst_missing_tbl; -DROP +DROP TABLE 0M: ABORT; -ABORT +ROLLBACK 0M: CHECKPOINT; CHECKPOINT 0Mq: ... @@ -99,7 +99,7 @@ CHECKPOINT -- know that a wal divergence is explicitly triggered and 100% completed. Also -- sanity check the tuple distribution (assumption of the test). 2: INSERT INTO tst_missing_tbl values(2),(1),(5); -INSERT 3 +INSERT 0 3 2: SELECT gp_segment_id, count(*) from tst_missing_tbl group by gp_segment_id; gp_segment_id | count ---------------+------- @@ -147,21 +147,21 @@ CHECKPOINT t (1 row) 3: INSERT INTO tst_missing_tbl values(2),(1),(5); -INSERT 3 +INSERT 0 3 1U: SELECT pg_switch_wal is not null FROM pg_switch_wal(); ?column? ---------- t (1 row) 3: INSERT INTO tst_missing_tbl values(2),(1),(5); -INSERT 3 +INSERT 0 3 1U: SELECT pg_switch_wal is not null FROM pg_switch_wal(); ?column? ---------- t (1 row) 3: INSERT INTO tst_missing_tbl values(2),(1),(5); -INSERT 3 +INSERT 0 3 -- Should be not needed mostly but let's 100% ensure since pg_switch_wal() -- won't switch if it is on the boundary already (seldom though). 1U: SELECT pg_switch_wal is not null FROM pg_switch_wal(); @@ -170,7 +170,7 @@ INSERT 3 t (1 row) 3: INSERT INTO tst_missing_tbl values(2),(1),(5); -INSERT 3 +INSERT 0 3 -- Hang at checkpointer before writing checkpoint xlog. 3: SELECT gp_inject_fault('checkpoint_after_redo_calculated', 'suspend', dbid) FROM gp_segment_configuration WHERE role='p' AND content = 1; @@ -226,7 +226,7 @@ INSERT 3 (2 rows) 4: INSERT INTO tst_missing_tbl values(2),(1),(5); -INSERT 3 +INSERT 0 3 4: SELECT gp_segment_id, count(*) from tst_missing_tbl group by gp_segment_id; gp_segment_id | count ---------------+------- @@ -284,7 +284,7 @@ CHECKPOINT t (1 row) 1: INSERT INTO tst_missing_tbl values(2),(1),(5); -INSERT 3 +INSERT 0 3 -- Should be not needed mostly but let's 100% ensure since pg_switch_wal() -- won't switch if it has been on the boundary (seldom though). 0U: SELECT pg_switch_wal is not null FROM pg_switch_wal(); @@ -293,7 +293,7 @@ INSERT 3 t (1 row) 1: INSERT INTO tst_missing_tbl values(2),(1),(5); -INSERT 3 +INSERT 0 3 0Uq: ... -- Make sure primary/mirror pair is in sync, otherwise FTS can't promote mirror @@ -327,17 +327,17 @@ INSERT 3 0M: BEGIN; BEGIN 0M: DROP TABLE tst_missing_tbl; -DROP +DROP TABLE 0M: ABORT; -ABORT +ROLLBACK 0M: CHECKPOINT; CHECKPOINT 0M: BEGIN; BEGIN 0M: DROP TABLE tst_missing_tbl; -DROP +DROP TABLE 0M: ABORT; -ABORT +ROLLBACK 0M: CHECKPOINT; CHECKPOINT @@ -368,7 +368,7 @@ CHECKPOINT -- know that a wal divergence is explicitly triggered and 100% completed. Also -- sanity check the tuple distribution (assumption of the test). 2: INSERT INTO tst_missing_tbl values(2),(1),(5); -INSERT 3 +INSERT 0 3 2: SELECT gp_segment_id, count(*) from tst_missing_tbl group by gp_segment_id; gp_segment_id | count ---------------+------- @@ -416,7 +416,7 @@ CHECKPOINT t (1 row) 3: INSERT INTO tst_missing_tbl values(2),(1),(5); -INSERT 3 +INSERT 0 3 -- Should be not needed mostly but let's 100% ensure since pg_switch_wal() -- won't switch if it is on the boundary already (seldom though). 1U: SELECT pg_switch_wal is not null FROM pg_switch_wal(); @@ -425,7 +425,7 @@ INSERT 3 t (1 row) 3: INSERT INTO tst_missing_tbl values(2),(1),(5); -INSERT 3 +INSERT 0 3 -- Have primary/mirror pair in sync before suspending the wal sender. 3: SELECT wait_until_all_segments_synchronized(); @@ -497,7 +497,7 @@ INSERT 3 -- Write something on the current primary 4: INSERT INTO tst_missing_tbl values(2),(1),(5); -INSERT 3 +INSERT 0 3 4: SELECT gp_segment_id, count(*) from tst_missing_tbl group by gp_segment_id; gp_segment_id | count ---------------+------- @@ -550,9 +550,9 @@ server closed the connection unexpectedly -- Create an unlogged table on the primary that remembers replication slot's last restart_lsn and number of WAL files. 1U: CREATE UNLOGGED TABLE unlogged_wal_retention_test(restart_lsn_before pg_lsn, wal_count_before int); -CREATE +CREATE TABLE 1U: INSERT INTO unlogged_wal_retention_test SELECT (select restart_lsn FROM pg_replication_slots WHERE slot_name = 'internal_wal_replication_slot') as restart_lsn_before, (select count(*) from pg_ls_waldir()) as wal_count_before; -INSERT 1 +INSERT 0 1 5: CHECKPOINT; CHECKPOINT -- Replication slot's restart_lsn should advance to the checkpoint's redo location. @@ -582,7 +582,7 @@ UPDATE 1 t (1 row) 5: INSERT INTO tst_missing_tbl values(2),(1),(5); -INSERT 3 +INSERT 0 3 -- Replication slot's restart_lsn should NOT change regardless mirror has received more wals. 1U: select pg_wal_lsn_diff(restart_lsn, restart_lsn_before) = 0 FROM pg_replication_slots, unlogged_wal_retention_test WHERE slot_name = 'internal_wal_replication_slot'; ?column? @@ -624,7 +624,7 @@ CHECKPOINT (1 row) -- Perform transaction to make sure wals are in sync. 5: INSERT INTO tst_missing_tbl values(2),(1),(5); -INSERT 3 +INSERT 0 3 -- Replication slot's restart_lsn should now advance to the checkpoint's redo location. 1U: SELECT pg_wal_lsn_diff(restart_lsn, restart_lsn_before) > 0 from pg_replication_slots, unlogged_wal_retention_test WHERE slot_name = 'internal_wal_replication_slot'; ?column? @@ -648,13 +648,11 @@ CHECKPOINT -- Cleanup 1U: DROP TABLE unlogged_wal_retention_test; -DROP +DROP TABLE 1Uq: ... 5: DROP TABLE tst_missing_tbl; -DROP -5: DROP FUNCTION connectSeg; -DROP +DROP TABLE !\retcode gpconfig -r wal_keep_size; (exited with code 0) !\retcode gpconfig -r wal_recycle; diff --git a/src/test/isolation2/expected/pg_terminate_backend.out b/src/test/isolation2/expected/pg_terminate_backend.out index d3bb0b2ad2b..fc1e6f1d42c 100644 --- a/src/test/isolation2/expected/pg_terminate_backend.out +++ b/src/test/isolation2/expected/pg_terminate_backend.out @@ -1,5 +1,5 @@ 1:create table terminate_backend_t (a int) distributed by (a); -CREATE +CREATE TABLE -- fault on seg1 to block insert command into terminate_backend_t table select gp_inject_fault('heap_insert', 'infinite_loop', '', '', 'terminate_backend_t', 1, 1, 0, dbid) from gp_segment_configuration where content = 1 and role = 'p'; diff --git a/src/test/isolation2/expected/pg_views_concurrent_drop.out b/src/test/isolation2/expected/pg_views_concurrent_drop.out index aa3c86fc664..a2187664711 100644 --- a/src/test/isolation2/expected/pg_views_concurrent_drop.out +++ b/src/test/isolation2/expected/pg_views_concurrent_drop.out @@ -1,7 +1,7 @@ 1:drop view if exists concurrent_drop_view cascade; -DROP +DROP VIEW 1:create view concurrent_drop_view as select * from pg_class; -CREATE +CREATE VIEW 1:select viewname from pg_views where viewname = 'concurrent_drop_view'; viewname ---------------------- @@ -19,7 +19,7 @@ CREATE 1:begin; BEGIN 1:drop view concurrent_drop_view; -DROP +DROP VIEW 2&:select viewname, definition from pg_views where viewname = 'concurrent_drop_view'; -- wait till halts for AccessShareLock on QD 3: SELECT wait_until_waiting_for_required_lock('concurrent_drop_view', 'AccessShareLock', -1); diff --git a/src/test/isolation2/expected/prepare_limit.out b/src/test/isolation2/expected/prepare_limit.out index c9479617b27..8e188a57252 100644 --- a/src/test/isolation2/expected/prepare_limit.out +++ b/src/test/isolation2/expected/prepare_limit.out @@ -18,13 +18,13 @@ (exited with code 0) 5: create table prepare_limit1 (a int); -CREATE +CREATE TABLE 5: create table prepare_limit2 (a int); -CREATE +CREATE TABLE 5: create table prepare_limit3 (a int); -CREATE +CREATE TABLE 5: create table prepare_limit4 (a int); -CREATE +CREATE TABLE 5: select gp_inject_fault_infinite('dtm_before_insert_forget_comitted', 'suspend', 1); gp_inject_fault_infinite @@ -64,13 +64,13 @@ CREATE Success: (1 row) 1<: <... completed> -INSERT 1 +INSERT 0 1 2<: <... completed> -INSERT 1 +INSERT 0 1 3<: <... completed> -INSERT 1 +INSERT 0 1 4<: <... completed> -INSERT 1 +INSERT 0 1 -- verify that standby is correctly wal streaming. 5: select state from pg_stat_replication; @@ -104,13 +104,13 @@ INSERT 1 -- cleanup 5: drop table prepare_limit1; -DROP +DROP TABLE 5: drop table prepare_limit2; -DROP +DROP TABLE 5: drop table prepare_limit3; -DROP +DROP TABLE 5: drop table prepare_limit4; -DROP +DROP TABLE -- Not using gpconfig -r, else it makes max_prepared_transactions be default -- (50) and some isolation2 tests will fail due to "too many clients". Hardcode diff --git a/src/test/isolation2/expected/prepared_xact_deadlock_pg_rewind.out b/src/test/isolation2/expected/prepared_xact_deadlock_pg_rewind.out index cb59647769e..56838af0657 100644 --- a/src/test/isolation2/expected/prepared_xact_deadlock_pg_rewind.out +++ b/src/test/isolation2/expected/prepared_xact_deadlock_pg_rewind.out @@ -5,9 +5,9 @@ -- start_ignore -- set GUCs to speed-up the test 1: alter system set gp_fts_probe_retries to 2; -ALTER +ALTER SYSTEM 1: alter system set gp_fts_probe_timeout to 5; -ALTER +ALTER SYSTEM 1: select pg_reload_conf(); pg_reload_conf ---------------- @@ -109,9 +109,9 @@ select wait_until_all_segments_synchronized(); -- start_ignore -- reset fts GUCs. 3: alter system reset gp_fts_probe_retries; -ALTER +ALTER SYSTEM 3: alter system reset gp_fts_probe_timeout; -ALTER +ALTER SYSTEM 3: select pg_reload_conf(); pg_reload_conf ---------------- diff --git a/src/test/isolation2/expected/prevent_ao_wal.out b/src/test/isolation2/expected/prevent_ao_wal.out index 314d5b20440..6b76c11c8c8 100644 --- a/src/test/isolation2/expected/prevent_ao_wal.out +++ b/src/test/isolation2/expected/prevent_ao_wal.out @@ -23,9 +23,9 @@ GP_IGNORE: defined new match expression -- Create tables (AO, AOCO) -1U: CREATE TABLE ao_foo (n int) WITH (appendonly=true); -CREATE +CREATE TABLE -1U: CREATE TABLE aoco_foo (n int, m int) WITH (appendonly=true, orientation=column); -CREATE +CREATE TABLE -- Switch WAL file -1U: SELECT true FROM pg_switch_wal(); @@ -35,10 +35,10 @@ CREATE (1 row) -- Insert data (AO) -1U: INSERT INTO ao_foo SELECT generate_series(1,10); -INSERT 10 +INSERT 0 10 -- Insert data (AOCO) -1U: INSERT INTO aoco_foo SELECT generate_series(1,10), generate_series(1,10); -INSERT 10 +INSERT 0 10 -- Delete data and run vacuum (AO) -1U: DELETE FROM ao_foo WHERE n > 5; DELETE 5 @@ -93,10 +93,10 @@ rmgr: Appendonly len (rec/tot): 50/ 50, tx: ##, lsn: #/########, prev #/ (1 row) -- Insert data (AO) -1U: INSERT INTO ao_foo SELECT generate_series(1,10); -INSERT 10 +INSERT 0 10 -- Insert data (AOCO) -1U: INSERT INTO aoco_foo SELECT generate_series(1,10), generate_series(1,10); -INSERT 10 +INSERT 0 10 -- Delete data and run vacuum (AO) -1U: DELETE FROM ao_foo WHERE n > 5; DELETE 5 @@ -113,9 +113,9 @@ VACUUM -1U: DROP TABLE ao_foo; -DROP +DROP TABLE -1U: DROP TABLE aoco_foo; -DROP +DROP TABLE -- Reset wal_level !\retcode gpconfig -r wal_level --masteronly; diff --git a/src/test/isolation2/expected/reader_waits_for_lock.out b/src/test/isolation2/expected/reader_waits_for_lock.out index df9cf7de46f..98c8763ef00 100644 --- a/src/test/isolation2/expected/reader_waits_for_lock.out +++ b/src/test/isolation2/expected/reader_waits_for_lock.out @@ -4,17 +4,17 @@ -- setup CREATE or REPLACE FUNCTION check_readers_are_blocked () RETURNS bool AS $$ declare retries int; /* in func */ begin retries := 1200; /* in func */ loop if (SELECT count(*) > 0 as reader_waits from pg_locks l join pg_stat_activity a on a.pid = l.pid and a.query like '%reader_waits_for_lock_table%' and not a.pid = pg_backend_pid() and l.granted = false and l.mppiswriter = false) then return true; /* in func */ end if; /* in func */ if retries <= 0 then return false; /* in func */ end if; /* in func */ perform pg_sleep(0.1); /* in func */ perform pg_stat_clear_snapshot(); /* in func */ retries := retries - 1; /* in func */ end loop; /* in func */ end; /* in func */ $$ language plpgsql; -CREATE +CREATE FUNCTION 1: create table reader_waits_for_lock_table(a int, b int) distributed by (a); -CREATE +CREATE TABLE 1: insert into reader_waits_for_lock_table select 1, 1; -INSERT 1 +INSERT 0 1 -- Aquire a conflicting lock in utility mode on seg0. 0U: BEGIN; BEGIN 0U: LOCK reader_waits_for_lock_table IN ACCESS EXCLUSIVE MODE; -LOCK +LOCK TABLE -- A utility mode connection should not have valid gp_session_id, else -- locks aquired by it may not confict with locks requested by a -- normal mode backend. diff --git a/src/test/isolation2/expected/reindex.out b/src/test/isolation2/expected/reindex.out index a9eac24f660..b166a6ad591 100644 --- a/src/test/isolation2/expected/reindex.out +++ b/src/test/isolation2/expected/reindex.out @@ -1,6 +1,6 @@ -- Dropping table while reindex database should not fail reindex CREATE DATABASE reindexdb1 TEMPLATE template1; -CREATE +CREATE DATABASE -- halt reindex after scanning the pg_class and getting the relids SELECT gp_inject_fault_infinite('reindex_db', 'suspend', 1); gp_inject_fault_infinite @@ -8,7 +8,7 @@ SELECT gp_inject_fault_infinite('reindex_db', 'suspend', 1); Success: (1 row) 1:@db_name reindexdb1: CREATE TABLE heap1(a INT, b INT); -CREATE +CREATE TABLE 1&:REINDEX DATABASE reindexdb1; SELECT gp_wait_until_triggered_fault('reindex_db', 1, 1); gp_wait_until_triggered_fault @@ -16,7 +16,7 @@ SELECT gp_wait_until_triggered_fault('reindex_db', 1, 1); Success: (1 row) 2:@db_name reindexdb1:DROP TABLE heap1; -DROP +DROP TABLE SELECT gp_inject_fault('reindex_db', 'reset', 1); gp_inject_fault ----------------- @@ -33,11 +33,11 @@ REINDEX BEGIN; BEGIN CREATE TABLE reindex_index1(a int, b int); -CREATE +CREATE TABLE CREATE INDEX reindex_index1_idx1 on reindex_index1 (b); -CREATE +CREATE INDEX insert into reindex_index1 select i,i+1 from generate_series(1, 10)i; -INSERT 10 +INSERT 0 10 COMMIT; COMMIT SELECT gp_inject_fault_infinite('reindex_relation', 'suspend', 1); @@ -53,7 +53,7 @@ SELECT gp_wait_until_triggered_fault('reindex_relation', 1, 1); (1 row) -- create one more index CREATE INDEX reindex_index1_idx2 on reindex_index1 (a); -CREATE +CREATE INDEX SELECT gp_inject_fault('reindex_relation', 'reset', 1); gp_inject_fault ----------------- @@ -63,4 +63,4 @@ SELECT gp_inject_fault('reindex_relation', 'reset', 1); REINDEX DROP DATABASE reindexdb1; -DROP +DROP DATABASE diff --git a/src/test/isolation2/expected/reindex/abort_reindex.out b/src/test/isolation2/expected/reindex/abort_reindex.out index ad5c7d1cef2..3a8e2a73701 100644 --- a/src/test/isolation2/expected/reindex/abort_reindex.out +++ b/src/test/isolation2/expected/reindex/abort_reindex.out @@ -1,18 +1,18 @@ DROP TABLE IF EXISTS reindex_abort_ao; -DROP +DROP TABLE CREATE TABLE reindex_abort_ao (a INT) WITH (appendonly=true, orientation=column); -CREATE +CREATE TABLE insert into reindex_abort_ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 create index idx_btree_reindex_abort_ao on reindex_abort_ao(a); -CREATE +CREATE INDEX -- start_ignore drop table if exists reindex_abort_ao_old; -DROP +DROP TABLE create table reindex_abort_ao_old as (select oid as c_oid, gp_segment_id as c_gp_segment_id, relfilenode as c_relfilenode from pg_class where relname = 'idx_btree_reindex_abort_ao' union all select oid as c_oid, gp_segment_id as c_gp_segment_id, relfilenode as c_relfilenode from gp_dist_random('pg_class') where relname = 'idx_btree_reindex_abort_ao'); -CREATE 4 +SELECT 4 -- end_ignore select 1 as have_same_number_of_rows from reindex_abort_ao_old where c_gp_segment_id > -1 group by c_oid having count(*) = (select count(*) from gp_segment_configuration where role = 'p' and content > -1); diff --git a/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_ao_bitmap.out b/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_ao_bitmap.out index ebda60ec248..707f70681c5 100644 --- a/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_ao_bitmap.out +++ b/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_ao_bitmap.out @@ -1,14 +1,14 @@ DROP TABLE IF EXISTS reindex_crtab_ao_bitmap; -DROP +DROP TABLE CREATE TABLE reindex_crtab_ao_bitmap (a INT) WITH (appendonly=true); -CREATE +CREATE TABLE insert into reindex_crtab_ao_bitmap select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into reindex_crtab_ao_bitmap select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 create index idx_reindex_crtab_ao_bitmap on reindex_crtab_ao_bitmap USING bitmap(a); -CREATE +CREATE INDEX select 1 as oid_same_on_all_segs from gp_dist_random('pg_class') where relname = 'idx_reindex_crtab_ao_bitmap' group by oid having count(*) = (select count(*) from gp_segment_configuration where role='p' and content > -1); oid_same_on_all_segs ---------------------- @@ -30,6 +30,8 @@ REINDEX CREATE 1: COMMIT; COMMIT +2<: <... completed> +CREATE INDEX 2: COMMIT; COMMIT 3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_reindex_crtab_ao_bitmap' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); diff --git a/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_ao_btree.out b/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_ao_btree.out index 65b18f1147e..d9edc941eec 100644 --- a/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_ao_btree.out +++ b/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_ao_btree.out @@ -1,14 +1,14 @@ DROP TABLE IF EXISTS reindex_crtab_ao_btree; -DROP +DROP TABLE CREATE TABLE reindex_crtab_ao_btree (a INT) WITH (appendonly=true); -CREATE +CREATE TABLE insert into reindex_crtab_ao_btree select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into reindex_crtab_ao_btree select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 create index idx_reindex_crtab_ao_btree on reindex_crtab_ao_btree(a); -CREATE +CREATE INDEX select 1 as oid_same_on_all_segs from gp_dist_random('pg_class') where relname = 'idx_reindex_crtab_ao_btree' group by oid having count(*) = (select count(*) from gp_segment_configuration where role='p' and content > -1); oid_same_on_all_segs ---------------------- @@ -30,6 +30,8 @@ REINDEX CREATE 1: COMMIT; COMMIT +2<: <... completed> +CREATE INDEX 2: COMMIT; COMMIT 3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_reindex_crtab_ao_btree' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); diff --git a/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_aoco_bitmap.out b/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_aoco_bitmap.out index 4f7b6f9bd23..5fab7906557 100644 --- a/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_aoco_bitmap.out +++ b/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_aoco_bitmap.out @@ -1,14 +1,14 @@ DROP TABLE IF EXISTS reindex_crtab_aoco_bitmap; -DROP +DROP TABLE CREATE TABLE reindex_crtab_aoco_bitmap (a INT) WITH (appendonly=true, orientation=column); -CREATE +CREATE TABLE insert into reindex_crtab_aoco_bitmap select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into reindex_crtab_aoco_bitmap select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 create index idx_reindex_crtab_aoco_bitmap on reindex_crtab_aoco_bitmap USING bitmap(a); -CREATE +CREATE INDEX select 1 as oid_same_on_all_segs from gp_dist_random('pg_class') where relname = 'idx_reindex_crtab_aoco_bitmap' group by oid having count(*) = (select count(*) from gp_segment_configuration where role='p' and content > -1); oid_same_on_all_segs ---------------------- @@ -30,6 +30,8 @@ REINDEX CREATE 1: COMMIT; COMMIT +2<: <... completed> +CREATE INDEX 2: COMMIT; COMMIT 3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_reindex_crtab_aoco_bitmap' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); diff --git a/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_aoco_btree.out b/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_aoco_btree.out index c7a70b9ccd0..639ed4c0553 100644 --- a/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_aoco_btree.out +++ b/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_aoco_btree.out @@ -1,14 +1,14 @@ DROP TABLE IF EXISTS reindex_crtab_aoco_btree; -DROP +DROP TABLE CREATE TABLE reindex_crtab_aoco_btree (a INT) WITH (appendonly=true, orientation=column); -CREATE +CREATE TABLE insert into reindex_crtab_aoco_btree select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into reindex_crtab_aoco_btree select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 create index idx_reindex_crtab_aoco_btree on reindex_crtab_aoco_btree(a); -CREATE +CREATE INDEX select 1 as oid_same_on_all_segs from gp_dist_random('pg_class') where relname = 'idx_reindex_crtab_aoco_btree' group by oid having count(*) = (select count(*) from gp_segment_configuration where role='p' and content > -1); oid_same_on_all_segs ---------------------- @@ -30,6 +30,8 @@ REINDEX CREATE 1: COMMIT; COMMIT +2<: <... completed> +CREATE INDEX 2: COMMIT; COMMIT 3: SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'idx_reindex_crtab_aoco_btree' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); diff --git a/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_heap_bitmap.out b/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_heap_bitmap.out index 15bbec1e6a7..2ae538a7b0c 100644 --- a/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_heap_bitmap.out +++ b/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_heap_bitmap.out @@ -1,14 +1,14 @@ DROP TABLE IF EXISTS reindex_crtab_heap_bitmap; -DROP +DROP TABLE CREATE TABLE reindex_crtab_heap_bitmap (a INT); -CREATE +CREATE TABLE insert into reindex_crtab_heap_bitmap select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into reindex_crtab_heap_bitmap select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 create index idx_reindex_crtab_heap_bitmap on reindex_crtab_heap_bitmap(a); -CREATE +CREATE INDEX select 1 as oid_same_on_all_segs from gp_dist_random('pg_class') where relname = 'idx_reindex_crtab_heap_bitmap' group by oid having count(*) = (select count(*) from gp_segment_configuration where role='p' and content > -1); oid_same_on_all_segs ---------------------- @@ -27,7 +27,7 @@ BEGIN 1: REINDEX index idx_reindex_crtab_heap_bitmap; REINDEX 2: create index idx_reindex_crtab_heap_bitmap2 on reindex_crtab_heap_bitmap(a); -CREATE +CREATE INDEX 1: COMMIT; COMMIT 2: COMMIT; diff --git a/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_heap_btree.out b/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_heap_btree.out index 7bae7e1d940..a25e65b12ea 100644 --- a/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_heap_btree.out +++ b/src/test/isolation2/expected/reindex/createidx_while_reindex_idx_heap_btree.out @@ -1,14 +1,14 @@ DROP TABLE IF EXISTS reindex_crtab_heap_btree; -DROP +DROP TABLE CREATE TABLE reindex_crtab_heap_btree (a INT); -CREATE +CREATE TABLE insert into reindex_crtab_heap_btree select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into reindex_crtab_heap_btree select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 create index idx_reindex_crtab_heap_btree on reindex_crtab_heap_btree(a); -CREATE +CREATE INDEX select 1 as oid_same_on_all_segs from gp_dist_random('pg_class') where relname = 'idx_reindex_crtab_heap_btree' group by oid having count(*) = (select count(*) from gp_segment_configuration where role='p' and content > -1); oid_same_on_all_segs ---------------------- @@ -27,7 +27,7 @@ BEGIN 1: REINDEX index idx_reindex_crtab_heap_btree; REINDEX 2: create index idx_reindex_crtab_heap_btree2 on reindex_crtab_heap_btree(a); -CREATE +CREATE INDEX 1: COMMIT; COMMIT 2: COMMIT; diff --git a/src/test/isolation2/expected/reindex/reindextable_while_addpart_ao_part_btree.out b/src/test/isolation2/expected/reindex/reindextable_while_addpart_ao_part_btree.out index cefd1bf866b..8da2942791f 100644 --- a/src/test/isolation2/expected/reindex/reindextable_while_addpart_ao_part_btree.out +++ b/src/test/isolation2/expected/reindex/reindextable_while_addpart_ao_part_btree.out @@ -1,24 +1,24 @@ DROP TABLE IF EXISTS reindex_crtabforadd_part_ao_btree; -DROP +DROP TABLE CREATE TABLE reindex_crtabforadd_part_ao_btree (id int, date date, amt decimal(10,2)) with (appendonly=true) DISTRIBUTED BY (id) PARTITION BY RANGE (date) ( PARTITION sales_Jul13 START (date '2013-07-01') INCLUSIVE , PARTITION sales_Aug13 START (date '2013-08-01') INCLUSIVE , PARTITION sales_Sep13 START (date '2013-09-01') INCLUSIVE END (date '2014-01-01') EXCLUSIVE ); -CREATE +CREATE TABLE Insert into reindex_crtabforadd_part_ao_btree select i, to_date('2013-07-'||i, 'YYYY/MM/DD') , 19.21+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 Insert into reindex_crtabforadd_part_ao_btree select i, to_date('2013-08-'||i, 'YYYY/MM/DD') , 9.31+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 Insert into reindex_crtabforadd_part_ao_btree select i, to_date('2013-09-'||i, 'YYYY/MM/DD') , 12.25+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 Insert into reindex_crtabforadd_part_ao_btree select i, to_date('2013-11-'||i, 'YYYY/MM/DD') , 29.51+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 create index on reindex_crtabforadd_part_ao_btree(id); -CREATE +CREATE INDEX -- start_ignore create table before_reindex_crtabforadd_part_ao_btree as select oid as c_oid, gp_segment_id as c_gp_segment_id, relfilenode as c_relfilenode, relname as c_relname from gp_dist_random('pg_class') where relname like 'reindex_crtabforadd_part_ao_btree%_idx'; -CREATE 12 +SELECT 12 -- end_ignore select c_relname, 1 as have_same_number_of_rows from before_reindex_crtabforadd_part_ao_btree group by c_oid, c_relname having count(*) = (select count(*) from gp_segment_configuration where role = 'p' and content > -1); @@ -38,7 +38,7 @@ DELETE 8 1: BEGIN; BEGIN 1: LOCK reindex_crtabforadd_part_ao_btree IN ACCESS EXCLUSIVE MODE; -LOCK +LOCK TABLE 2&: REINDEX TABLE reindex_crtabforadd_part_ao_btree; 3&: alter table reindex_crtabforadd_part_ao_btree add partition p1 START (date '2013-05-01') INCLUSIVE with(appendonly=true); 1: COMMIT; @@ -46,9 +46,9 @@ COMMIT 2<: <... completed> REINDEX 3<: <... completed> -ALTER +ALTER TABLE 3: Insert into reindex_crtabforadd_part_ao_btree values(9,'2013-05-22',14.22); -INSERT 1 +INSERT 0 1 3: select count(*) from reindex_crtabforadd_part_ao_btree where id = 29; count ------- diff --git a/src/test/isolation2/expected/reindex/reindextable_while_addpart_aoco_part_btree.out b/src/test/isolation2/expected/reindex/reindextable_while_addpart_aoco_part_btree.out index 89d80f1a9fb..6db2d2d1c52 100644 --- a/src/test/isolation2/expected/reindex/reindextable_while_addpart_aoco_part_btree.out +++ b/src/test/isolation2/expected/reindex/reindextable_while_addpart_aoco_part_btree.out @@ -1,24 +1,24 @@ DROP TABLE IF EXISTS reindex_crtabforadd_part_aoco_btree; -DROP +DROP TABLE CREATE TABLE reindex_crtabforadd_part_aoco_btree (id int, date date, amt decimal(10,2)) with (appendonly=true, orientation=column) DISTRIBUTED BY (id) PARTITION BY RANGE (date) ( PARTITION sales_Jul13 START (date '2013-07-01') INCLUSIVE , PARTITION sales_Aug13 START (date '2013-08-01') INCLUSIVE , PARTITION sales_Sep13 START (date '2013-09-01') INCLUSIVE END (date '2014-01-01') EXCLUSIVE ); -CREATE +CREATE TABLE Insert into reindex_crtabforadd_part_aoco_btree select i, to_date('2013-07-'||i, 'YYYY/MM/DD') , 19.21+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 Insert into reindex_crtabforadd_part_aoco_btree select i, to_date('2013-08-'||i, 'YYYY/MM/DD') , 9.31+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 Insert into reindex_crtabforadd_part_aoco_btree select i, to_date('2013-09-'||i, 'YYYY/MM/DD') , 12.25+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 Insert into reindex_crtabforadd_part_aoco_btree select i, to_date('2013-11-'||i, 'YYYY/MM/DD') , 29.51+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 create index on reindex_crtabforadd_part_aoco_btree(id); -CREATE +CREATE INDEX -- start_ignore create table before_reindex_crtabforadd_part_aoco_btree as select oid as c_oid, gp_segment_id as c_gp_segment_id, relfilenode as c_relfilenode, relname as c_relname from gp_dist_random('pg_class') where relname like 'reindex_crtabforadd_part_aoco_btree%_idx'; -CREATE 12 +SELECT 12 -- end_ignore select c_relname, 1 as have_same_number_of_rows from before_reindex_crtabforadd_part_aoco_btree group by c_oid, c_relname having count(*) = (select count(*) from gp_segment_configuration where role = 'p' and content > -1); @@ -38,7 +38,7 @@ DELETE 8 1: BEGIN; BEGIN 1: LOCK reindex_crtabforadd_part_aoco_btree IN ACCESS EXCLUSIVE MODE; -LOCK +LOCK TABLE 2&: REINDEX TABLE reindex_crtabforadd_part_aoco_btree; 3&: alter table reindex_crtabforadd_part_aoco_btree add default partition part_others with(appendonly=true, orientation=column); 1: COMMIT; @@ -46,9 +46,9 @@ COMMIT 2<: <... completed> REINDEX 3<: <... completed> -ALTER +ALTER TABLE 3: Insert into reindex_crtabforadd_part_aoco_btree values(29,'2013-04-22',12.52); -INSERT 1 +INSERT 0 1 3: select count(*) from reindex_crtabforadd_part_aoco_btree where id = 29; count ------- diff --git a/src/test/isolation2/expected/reindex/reindextable_while_addpart_heap_part_btree.out b/src/test/isolation2/expected/reindex/reindextable_while_addpart_heap_part_btree.out index eed3c9c024e..49ed4aa95b4 100644 --- a/src/test/isolation2/expected/reindex/reindextable_while_addpart_heap_part_btree.out +++ b/src/test/isolation2/expected/reindex/reindextable_while_addpart_heap_part_btree.out @@ -1,24 +1,24 @@ DROP TABLE IF EXISTS reindex_crtabforadd_part_heap_btree; -DROP +DROP TABLE CREATE TABLE reindex_crtabforadd_part_heap_btree (id int, date date, amt decimal(10,2)) DISTRIBUTED BY (id) PARTITION BY RANGE (date) ( PARTITION sales_Jul13 START (date '2013-07-01') INCLUSIVE , PARTITION sales_Aug13 START (date '2013-08-01') INCLUSIVE , PARTITION sales_Sep13 START (date '2013-09-01') INCLUSIVE END (date '2014-01-01') EXCLUSIVE ); -CREATE +CREATE TABLE Insert into reindex_crtabforadd_part_heap_btree select i, to_date('2013-07-'||i, 'YYYY/MM/DD') , 19.21+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 Insert into reindex_crtabforadd_part_heap_btree select i, to_date('2013-08-'||i, 'YYYY/MM/DD') , 9.31+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 Insert into reindex_crtabforadd_part_heap_btree select i, to_date('2013-09-'||i, 'YYYY/MM/DD') , 12.25+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 Insert into reindex_crtabforadd_part_heap_btree select i, to_date('2013-11-'||i, 'YYYY/MM/DD') , 29.51+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 create index on reindex_crtabforadd_part_heap_btree(id); -CREATE +CREATE INDEX -- start_ignore create table before_reindex_crtabforadd_part_heap_btree as select oid as c_oid, gp_segment_id as c_gp_segment_id, relfilenode as c_relfilenode, relname as c_relname from gp_dist_random('pg_class') where relname like 'reindex_crtabforadd_part_heap_btree%_idx'; -CREATE 12 +SELECT 12 -- end_ignore select c_relname, 1 as have_same_number_of_rows from before_reindex_crtabforadd_part_heap_btree group by c_oid, c_relname having count(*) = (select count(*) from gp_segment_configuration where role = 'p' and content > -1); @@ -38,7 +38,7 @@ DELETE 8 1: BEGIN; BEGIN 1: LOCK reindex_crtabforadd_part_heap_btree IN ACCESS EXCLUSIVE MODE; -LOCK +LOCK TABLE 2&: REINDEX TABLE reindex_crtabforadd_part_heap_btree; 3&: alter table reindex_crtabforadd_part_heap_btree add partition new_p START (date '2013-06-01') INCLUSIVE ; 1: COMMIT; @@ -46,9 +46,9 @@ COMMIT 2<: <... completed> REINDEX 3<: <... completed> -ALTER +ALTER TABLE 3: Insert into reindex_crtabforadd_part_heap_btree values(29,'2013-06-09',14.20); -INSERT 1 +INSERT 0 1 3: select count(*) from reindex_crtabforadd_part_heap_btree where id = 29; count ------- diff --git a/src/test/isolation2/expected/reindex/reindextable_while_altertable_ao_part_btree.out b/src/test/isolation2/expected/reindex/reindextable_while_altertable_ao_part_btree.out index 52b56766ec5..d467c88c2b6 100644 --- a/src/test/isolation2/expected/reindex/reindextable_while_altertable_ao_part_btree.out +++ b/src/test/isolation2/expected/reindex/reindextable_while_altertable_ao_part_btree.out @@ -1,24 +1,24 @@ DROP TABLE IF EXISTS reindex_crtabforalter_part_ao_btree; -DROP +DROP TABLE CREATE TABLE reindex_crtabforalter_part_ao_btree (id int, date date, amt decimal(10,2)) with (appendonly=true) DISTRIBUTED BY (id) PARTITION BY RANGE (date) ( PARTITION sales_Jul13 START (date '2013-07-01') INCLUSIVE , PARTITION sales_Aug13 START (date '2013-08-01') INCLUSIVE , PARTITION sales_Sep13 START (date '2013-09-01') INCLUSIVE END (date '2014-01-01') EXCLUSIVE ); -CREATE +CREATE TABLE Insert into reindex_crtabforalter_part_ao_btree select i, to_date('2013-07-'||i, 'YYYY/MM/DD') , 19.21+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 Insert into reindex_crtabforalter_part_ao_btree select i, to_date('2013-08-'||i, 'YYYY/MM/DD') , 9.31+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 Insert into reindex_crtabforalter_part_ao_btree select i, to_date('2013-09-'||i, 'YYYY/MM/DD') , 12.25+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 Insert into reindex_crtabforalter_part_ao_btree select i, to_date('2013-11-'||i, 'YYYY/MM/DD') , 29.51+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 create index on reindex_crtabforalter_part_ao_btree(id); -CREATE +CREATE INDEX -- start_ignore create table before_reindex_crtabforalter_part_ao_btree as select oid as c_oid, gp_segment_id as c_gp_segment_id, relfilenode as c_relfilenode, relname as c_relname from gp_dist_random('pg_class') where relname like 'reindex_crtabforalter_part_ao_btree%_idx'; -CREATE 12 +SELECT 12 -- end_ignore select c_relname, 1 as have_same_number_of_rows from before_reindex_crtabforalter_part_ao_btree group by c_oid, c_relname having count(*) = (select count(*) from gp_segment_configuration where role = 'p' and content > -1); @@ -38,7 +38,7 @@ DELETE 8 1: BEGIN; BEGIN 1: LOCK reindex_crtabforalter_part_ao_btree IN ACCESS EXCLUSIVE MODE; -LOCK +LOCK TABLE 2&: REINDEX TABLE reindex_crtabforalter_part_ao_btree; 3&: alter table reindex_crtabforalter_part_ao_btree drop column amt; 1: COMMIT; @@ -46,7 +46,7 @@ COMMIT 2<: <... completed> REINDEX 3<: <... completed> -ALTER +ALTER TABLE 3: select count(*) from reindex_crtabforalter_part_ao_btree where id = 29; count ------- diff --git a/src/test/isolation2/expected/reindex/reindextable_while_altertable_aoco_part_btree.out b/src/test/isolation2/expected/reindex/reindextable_while_altertable_aoco_part_btree.out index 6780e137f16..00a6b537348 100644 --- a/src/test/isolation2/expected/reindex/reindextable_while_altertable_aoco_part_btree.out +++ b/src/test/isolation2/expected/reindex/reindextable_while_altertable_aoco_part_btree.out @@ -1,24 +1,24 @@ DROP TABLE IF EXISTS reindex_crtabforalter_part_aoco_btree; -DROP +DROP TABLE CREATE TABLE reindex_crtabforalter_part_aoco_btree (id int, date date, amt decimal(10,2)) with (appendonly=true, orientation=column) DISTRIBUTED BY (id) PARTITION BY RANGE (date) ( PARTITION sales_Jul13 START (date '2013-07-01') INCLUSIVE , PARTITION sales_Aug13 START (date '2013-08-01') INCLUSIVE , PARTITION sales_Sep13 START (date '2013-09-01') INCLUSIVE END (date '2014-01-01') EXCLUSIVE ); -CREATE +CREATE TABLE Insert into reindex_crtabforalter_part_aoco_btree select i, to_date('2013-07-'||i, 'YYYY/MM/DD') , 19.21+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 Insert into reindex_crtabforalter_part_aoco_btree select i, to_date('2013-08-'||i, 'YYYY/MM/DD') , 9.31+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 Insert into reindex_crtabforalter_part_aoco_btree select i, to_date('2013-09-'||i, 'YYYY/MM/DD') , 12.25+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 Insert into reindex_crtabforalter_part_aoco_btree select i, to_date('2013-11-'||i, 'YYYY/MM/DD') , 29.51+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 create index on reindex_crtabforalter_part_aoco_btree(id); -CREATE +CREATE INDEX -- start_ignore create table before_reindex_crtabforalter_part_aoco_btree as select oid as c_oid, gp_segment_id as c_gp_segment_id, relfilenode as c_relfilenode, relname as c_relname from gp_dist_random('pg_class') where relname like 'reindex_crtabforalter_part_aoco_btree%_idx'; -CREATE 12 +SELECT 12 -- end_ignore select c_relname, 1 as have_same_number_of_rows from before_reindex_crtabforalter_part_aoco_btree group by c_oid, c_relname having count(*) = (select count(*) from gp_segment_configuration where role = 'p' and content > -1); @@ -38,7 +38,7 @@ DELETE 8 1: BEGIN; BEGIN 1: LOCK reindex_crtabforalter_part_aoco_btree IN ACCESS EXCLUSIVE MODE; -LOCK +LOCK TABLE 2&: REINDEX TABLE reindex_crtabforalter_part_aoco_btree; 3&: alter table reindex_crtabforalter_part_aoco_btree drop column amt; 1: COMMIT; @@ -46,7 +46,7 @@ COMMIT 2<: <... completed> REINDEX 3<: <... completed> -ALTER +ALTER TABLE 3: select count(*) from reindex_crtabforalter_part_aoco_btree where id = 29; count ------- diff --git a/src/test/isolation2/expected/reindex/reindextable_while_altertable_heap_part_btree.out b/src/test/isolation2/expected/reindex/reindextable_while_altertable_heap_part_btree.out index 0a63be4559e..975e2c93301 100644 --- a/src/test/isolation2/expected/reindex/reindextable_while_altertable_heap_part_btree.out +++ b/src/test/isolation2/expected/reindex/reindextable_while_altertable_heap_part_btree.out @@ -1,24 +1,24 @@ DROP TABLE IF EXISTS reindex_crtabforalter_part_heap_btree; -DROP +DROP TABLE CREATE TABLE reindex_crtabforalter_part_heap_btree (id int, date date, amt decimal(10,2)) DISTRIBUTED BY (id) PARTITION BY RANGE (date) ( PARTITION sales_Jul13 START (date '2013-07-01') INCLUSIVE , PARTITION sales_Aug13 START (date '2013-08-01') INCLUSIVE , PARTITION sales_Sep13 START (date '2013-09-01') INCLUSIVE END (date '2014-01-01') EXCLUSIVE ); -CREATE +CREATE TABLE Insert into reindex_crtabforalter_part_heap_btree select i, to_date('2013-07-'||i, 'YYYY/MM/DD') , 19.21+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 Insert into reindex_crtabforalter_part_heap_btree select i, to_date('2013-08-'||i, 'YYYY/MM/DD') , 9.31+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 Insert into reindex_crtabforalter_part_heap_btree select i, to_date('2013-09-'||i, 'YYYY/MM/DD') , 12.25+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 Insert into reindex_crtabforalter_part_heap_btree select i, to_date('2013-11-'||i, 'YYYY/MM/DD') , 29.51+i from generate_series(10,30) i; -INSERT 21 +INSERT 0 21 create index on reindex_crtabforalter_part_heap_btree(id); -CREATE +CREATE INDEX -- start_ignore create table before_reindex_crtabforalter_part_heap_btree as select oid as c_oid, gp_segment_id as c_gp_segment_id, relfilenode as c_relfilenode, relname as c_relname from gp_dist_random('pg_class') where relname like 'reindex_crtabforalter_part_heap_btree%_idx'; -CREATE 12 +SELECT 12 -- end_ignore select c_relname, 1 as have_same_number_of_rows from before_reindex_crtabforalter_part_heap_btree group by c_oid, c_relname having count(*) = (select count(*) from gp_segment_configuration where role = 'p' and content > -1); @@ -38,7 +38,7 @@ DELETE 8 1: BEGIN; BEGIN 1: LOCK reindex_crtabforalter_part_heap_btree IN ACCESS EXCLUSIVE MODE; -LOCK +LOCK TABLE 2&: REINDEX TABLE reindex_crtabforalter_part_heap_btree; 3&: alter table reindex_crtabforalter_part_heap_btree drop column amt; 1: COMMIT; @@ -46,7 +46,7 @@ COMMIT 2<: <... completed> REINDEX 3<: <... completed> -ALTER +ALTER TABLE 3: select count(*) from reindex_crtabforalter_part_heap_btree where id = 29; count ------- diff --git a/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_ao_bitmap.out b/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_ao_bitmap.out index ed48fe86ad7..c78baee8b1e 100644 --- a/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_ao_bitmap.out +++ b/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_ao_bitmap.out @@ -1,14 +1,14 @@ DROP TABLE IF EXISTS reindex_crtab_ao_bitmap; -DROP +DROP TABLE CREATE TABLE reindex_crtab_ao_bitmap (a INT) WITH (appendonly=true); -CREATE +CREATE TABLE insert into reindex_crtab_ao_bitmap select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into reindex_crtab_ao_bitmap select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 create index idx_reindex_crtab_ao_bitmap on reindex_crtab_ao_bitmap USING BITMAP(a); -CREATE +CREATE INDEX -- @Description Ensures that a reindex table during reindex index operations is ok -- @@ -17,7 +17,7 @@ DELETE 254 1: BEGIN; BEGIN 1: create temp table old_relfilenodes as (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname = 'idx_reindex_crtab_ao_bitmap' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname = 'idx_reindex_crtab_ao_bitmap'); -CREATE 4 +SELECT 4 2: BEGIN; BEGIN 1: REINDEX index idx_reindex_crtab_ao_bitmap; @@ -32,7 +32,7 @@ REINDEX -- validates that reindex command in session 1 indeed generates new -- relfilenode for the index. 1: insert into old_relfilenodes (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname = 'idx_reindex_crtab_ao_bitmap' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname = 'idx_reindex_crtab_ao_bitmap'); -INSERT 4 +INSERT 0 4 -- Expect two distinct relfilenodes per segment in old_relfilenodes table. 1: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; count | relname @@ -44,7 +44,7 @@ COMMIT -- After session 2 commits, the relfilenode it assigned to the index -- is visible to session 1. 1: insert into old_relfilenodes (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname = 'idx_reindex_crtab_ao_bitmap' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname = 'idx_reindex_crtab_ao_bitmap'); -INSERT 4 +INSERT 0 4 -- Expect three distinct relfilenodes per segment in old_relfilenodes table. 1: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; count | relname diff --git a/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_ao_part_btree.out b/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_ao_part_btree.out index d17fb59d8fd..f9864b0f48b 100644 --- a/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_ao_part_btree.out +++ b/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_ao_part_btree.out @@ -1,14 +1,14 @@ DROP TABLE IF EXISTS reindex_crtab_part_ao_btree; -DROP +DROP TABLE CREATE TABLE reindex_crtab_part_ao_btree ( id INTEGER, owner VARCHAR, description VARCHAR, property BOX, poli POLYGON, target CIRCLE, v VARCHAR, t TEXT, f FLOAT, p POINT, c CIRCLE, filler VARCHAR DEFAULT 'Big data is difficult to work with using most relational database management systems and desktop statistics and visualization packages, requiring instead massively parallel software running on tens, hundreds, or even thousands of servers.What is considered big data varies depending on the capabilities of the organization managing the set, and on the capabilities of the applications.This is here just to take up space so that we use more pages of data and sequential scans take a lot more time. ') with (appendonly=true) DISTRIBUTED BY (id) PARTITION BY RANGE (id) ( PARTITION p_one START('1') INCLUSIVE END ('10') EXCLUSIVE, DEFAULT PARTITION de_fault ); -CREATE +CREATE TABLE insert into reindex_crtab_part_ao_btree (id, owner, description, property, poli, target) select i, 'user' || i, 'Testing GiST Index', '((3, 1300), (33, 1330))','( (22,660), (57, 650), (68, 660) )', '( (76, 76), 76)' from generate_series(1,1000) i ; -INSERT 1000 +INSERT 0 1000 insert into reindex_crtab_part_ao_btree (id, owner, description, property, poli, target) select i, 'user' || i, 'Testing GiST Index', '((3, 1300), (33, 1330))','( (22,660), (57, 650), (68, 660) )', '( (76, 76), 76)' from generate_series(1,1000) i ; -INSERT 1000 +INSERT 0 1000 create index on reindex_crtab_part_ao_btree(id); -CREATE +CREATE INDEX -- @product_version gpdb: [4.3.4.0 -],4.3.4.0O2 -- @Description Ensures that a reindex table during reindex index operations is ok -- @@ -16,11 +16,11 @@ CREATE DELETE FROM reindex_crtab_part_ao_btree WHERE id < 128; DELETE 254 3: create temp table old_relfilenodes as (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname like 'reindex_crtab_part_ao_btree%_idx' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname like 'reindex_crtab_part_ao_btree%_idx'); -CREATE 12 +SELECT 12 1: BEGIN; BEGIN 1: LOCK reindex_crtab_part_ao_btree IN ACCESS EXCLUSIVE MODE; -LOCK +LOCK TABLE 2&: REINDEX TABLE reindex_crtab_part_ao_btree; 3:BEGIN; BEGIN @@ -34,7 +34,7 @@ REINDEX -- validates that reindex command in session 3 indeed generates new -- relfilenode for the index. 3: insert into old_relfilenodes (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname like 'reindex_crtab_part_ao_btree%_idx' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname like 'reindex_crtab_part_ao_btree%_idx'); -INSERT 12 +INSERT 0 12 -- Expect two distinct relfilenodes for one segment in old_relfilenodes table. -- CBDB#26: This test actually assumes when txn1 commits, its lock is acquired by -- txn3, and txn2 is blocked by it. Normally this is the case, but when the system @@ -60,7 +60,7 @@ COMMIT 2<: <... completed> REINDEX 3: insert into old_relfilenodes (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname like 'reindex_crtab_part_ao_btree%_idx' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname like 'reindex_crtab_part_ao_btree%_idx'); -INSERT 12 +INSERT 0 12 -- Expect three distinct relfilenodes per segment for "1_prt_de_fault" index. -- CBDB#26: Same as L45. 3: select relname, relname = 'reindex_crtab_part_ao_btree_1_prt_de_fault_id_idx' and res.cnt in (2, 3) as special_case_for_de_fault_id_idx, case when relname = 'reindex_crtab_part_ao_btree_1_prt_de_fault_id_idx' then -1 else res.cnt end as count from (select distinct count(distinct relfilenode) as cnt, relname from old_relfilenodes group by dbid, relname) as res; diff --git a/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_aoco_bitmap.out b/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_aoco_bitmap.out index 8c766da8fc8..85238f7aa65 100644 --- a/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_aoco_bitmap.out +++ b/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_aoco_bitmap.out @@ -1,14 +1,14 @@ DROP TABLE IF EXISTS reindex_crtab_aoco_bitmap; -DROP +DROP TABLE CREATE TABLE reindex_crtab_aoco_bitmap (a INT) WITH (appendonly=true, orientation=column); -CREATE +CREATE TABLE insert into reindex_crtab_aoco_bitmap select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into reindex_crtab_aoco_bitmap select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 create index idx_reindex_crtab_aoco_bitmap on reindex_crtab_aoco_bitmap USING BITMAP(a); -CREATE +CREATE INDEX -- @Description Ensures that a reindex table during reindex index operations is ok -- @@ -17,7 +17,7 @@ DELETE 254 1: BEGIN; BEGIN 1: create temp table old_relfilenodes as (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname = 'idx_reindex_crtab_aoco_bitmap' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname = 'idx_reindex_crtab_aoco_bitmap'); -CREATE 4 +SELECT 4 2: BEGIN; BEGIN 1: REINDEX index idx_reindex_crtab_aoco_bitmap; @@ -32,7 +32,7 @@ REINDEX -- validates that reindex command in session 1 indeed generates new -- relfilenode for the index. 1: insert into old_relfilenodes (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname = 'idx_reindex_crtab_aoco_bitmap' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname = 'idx_reindex_crtab_aoco_bitmap'); -INSERT 4 +INSERT 0 4 -- Expect two distinct relfilenodes per segment in old_relfilenodes table. 1: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; count | relname @@ -44,7 +44,7 @@ COMMIT -- After session 2 commits, the relfilenode it assigned to the index -- is visible to session 1. 1: insert into old_relfilenodes (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname = 'idx_reindex_crtab_aoco_bitmap' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname = 'idx_reindex_crtab_aoco_bitmap'); -INSERT 4 +INSERT 0 4 -- Expect three distinct relfilenodes per segment in old_relfilenodes table. 1: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; count | relname diff --git a/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_aoco_part_btree.out b/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_aoco_part_btree.out index 7dd094ee895..627a989e6df 100644 --- a/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_aoco_part_btree.out +++ b/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_aoco_part_btree.out @@ -1,25 +1,25 @@ DROP TABLE IF EXISTS reindex_crtab_part_aoco_btree; -DROP +DROP TABLE CREATE TABLE reindex_crtab_part_aoco_btree ( id INTEGER, owner VARCHAR, description VARCHAR, property BOX, poli POLYGON, target CIRCLE, v VARCHAR, t TEXT, f FLOAT, p POINT, c CIRCLE, filler VARCHAR DEFAULT 'Big data is difficult to work with using most relational database management systems and desktop statistics and visualization packages, requiring instead massively parallel software running on tens, hundreds, or even thousands of servers.What is considered big data varies depending on the capabilities of the organization managing the set, and on the capabilities of the applications.This is here just to take up space so that we use more pages of data and sequential scans take a lot more time. ') with (appendonly=true,orientation=column) DISTRIBUTED BY (id) PARTITION BY RANGE (id) ( PARTITION p_one START('1') INCLUSIVE END ('10') EXCLUSIVE, DEFAULT PARTITION de_fault ); -CREATE +CREATE TABLE insert into reindex_crtab_part_aoco_btree (id, owner, description, property, poli, target) select i, 'user' || i, 'Testing GiST Index', '((3, 1300), (33, 1330))','( (22,660), (57, 650), (68, 660) )', '( (76, 76), 76)' from generate_series(1,1000) i ; -INSERT 1000 +INSERT 0 1000 insert into reindex_crtab_part_aoco_btree (id, owner, description, property, poli, target) select i, 'user' || i, 'Testing GiST Index', '((3, 1300), (33, 1330))','( (22,660), (57, 650), (68, 660) )', '( (76, 76), 76)' from generate_series(1,1000) i ; -INSERT 1000 +INSERT 0 1000 create index on reindex_crtab_part_aoco_btree(id); -CREATE +CREATE INDEX -- @Description Ensures that a reindex table during reindex index operations is ok -- DELETE FROM reindex_crtab_part_aoco_btree WHERE id < 128; DELETE 254 3: create temp table old_relfilenodes as (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname like 'reindex_crtab_part_aoco_btree%_idx' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname like 'reindex_crtab_part_aoco_btree%_idx'); -CREATE 12 +SELECT 12 1: BEGIN; BEGIN 1: LOCK reindex_crtab_part_aoco_btree IN ACCESS EXCLUSIVE MODE; -LOCK +LOCK TABLE 2&: REINDEX TABLE reindex_crtab_part_aoco_btree; 3: BEGIN; BEGIN @@ -33,7 +33,7 @@ REINDEX -- validates that reindex command in session 3 indeed generates new -- relfilenode for the index. 3: insert into old_relfilenodes (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname like 'reindex_crtab_part_aoco_btree%_idx' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname like 'reindex_crtab_part_aoco_btree%_idx'); -INSERT 12 +INSERT 0 12 -- Expect two distinct relfilenodes for one segment in old_relfilenodes table. -- CBDB#26: This test actually assumes when txn1 commits, its lock is acquired by -- txn3, and txn2 is blocked by it. Normally this is the case, but when the system @@ -59,7 +59,7 @@ COMMIT 2<: <... completed> REINDEX 3: insert into old_relfilenodes (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname like 'reindex_crtab_part_aoco_btree%_idx' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname like 'reindex_crtab_part_aoco_btree%_idx'); -INSERT 12 +INSERT 0 12 -- Expect three distinct relfilenodes per segment for "1_prt_de_fault" index. -- CBDB#26: Same as L45. 3: select relname, relname = 'reindex_crtab_part_aoco_btree_1_prt_de_fault_id_idx' and res.cnt in (2, 3) as special_case_for_de_fault_id_idx, case when relname = 'reindex_crtab_part_aoco_btree_1_prt_de_fault_id_idx' then -1 else res.cnt end as count from (select distinct count(distinct relfilenode) as cnt, relname from old_relfilenodes group by dbid, relname) as res; diff --git a/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_heap_bitmap.out b/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_heap_bitmap.out index 0a9689cb030..c19661cea66 100644 --- a/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_heap_bitmap.out +++ b/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_heap_bitmap.out @@ -1,14 +1,14 @@ DROP TABLE IF EXISTS reindex_crtab_heap_bitmap; -DROP +DROP TABLE CREATE TABLE reindex_crtab_heap_bitmap (a INT); -CREATE +CREATE TABLE insert into reindex_crtab_heap_bitmap select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into reindex_crtab_heap_bitmap select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 create index idx_reindex_crtab_heap_bitmap on reindex_crtab_heap_bitmap USING BITMAP(a); -CREATE +CREATE INDEX -- @Description Ensures that a reindex table during reindex index operations is ok -- @@ -17,7 +17,7 @@ DELETE 254 1: BEGIN; BEGIN 1: create temp table old_relfilenodes as (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname = 'idx_reindex_crtab_heap_bitmap' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname = 'idx_reindex_crtab_heap_bitmap'); -CREATE 4 +SELECT 4 2: BEGIN; BEGIN 1: REINDEX index idx_reindex_crtab_heap_bitmap; @@ -32,7 +32,7 @@ REINDEX -- validates that reindex command in session 1 indeed generates new -- relfilenode for the index. 1: insert into old_relfilenodes (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname = 'idx_reindex_crtab_heap_bitmap' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname = 'idx_reindex_crtab_heap_bitmap'); -INSERT 4 +INSERT 0 4 -- Expect two distinct relfilenodes per segment in old_relfilenodes table. 1: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; count | relname @@ -44,7 +44,7 @@ COMMIT -- After session 2 commits, the relfilenode it assigned to the index -- is visible to session 1. 1: insert into old_relfilenodes (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname = 'idx_reindex_crtab_heap_bitmap' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname = 'idx_reindex_crtab_heap_bitmap'); -INSERT 4 +INSERT 0 4 -- Expect three distinct relfilenodes per segment in old_relfilenodes table. 1: select distinct count(distinct relfilenode), relname from old_relfilenodes group by dbid, relname; count | relname diff --git a/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_heap_part_btree.out b/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_heap_part_btree.out index cf671261bce..31d58838e33 100644 --- a/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_heap_part_btree.out +++ b/src/test/isolation2/expected/reindex/reindextable_while_reindex_idx_heap_part_btree.out @@ -1,25 +1,25 @@ DROP TABLE IF EXISTS reindex_crtab_part_heap_btree; -DROP +DROP TABLE CREATE TABLE reindex_crtab_part_heap_btree ( id INTEGER, owner VARCHAR, description VARCHAR, property BOX, poli POLYGON, target CIRCLE, v VARCHAR, t TEXT, f FLOAT, p POINT, c CIRCLE, filler VARCHAR DEFAULT 'Big data is difficult to work with using most relational database management systems and desktop statistics and visualization packages, requiring instead massively parallel software running on tens, hundreds, or even thousands of servers.What is considered big data varies depending on the capabilities of the organization managing the set, and on the capabilities of the applications.This is here just to take up space so that we use more pages of data and sequential scans take a lot more time. ')DISTRIBUTED BY (id) PARTITION BY RANGE (id) ( PARTITION p_one START('1') INCLUSIVE END ('10') EXCLUSIVE, DEFAULT PARTITION de_fault ); -CREATE +CREATE TABLE insert into reindex_crtab_part_heap_btree (id, owner, description, property, poli, target) select i, 'user' || i, 'Testing GiST Index', '((3, 1300), (33, 1330))','( (22,660), (57, 650), (68, 660) )', '( (76, 76), 76)' from generate_series(1,1000) i ; -INSERT 1000 +INSERT 0 1000 insert into reindex_crtab_part_heap_btree (id, owner, description, property, poli, target) select i, 'user' || i, 'Testing GiST Index', '((3, 1300), (33, 1330))','( (22,660), (57, 650), (68, 660) )', '( (76, 76), 76)' from generate_series(1,1000) i ; -INSERT 1000 +INSERT 0 1000 create index on reindex_crtab_part_heap_btree(id); -CREATE +CREATE INDEX -- @Description Ensures that a reindex table during reindex index operations is ok -- DELETE FROM reindex_crtab_part_heap_btree WHERE id < 128; DELETE 254 3: create temp table old_relfilenodes as (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname like 'reindex_crtab_part_heap_btree%_idx' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname like 'reindex_crtab_part_heap_btree%_idx'); -CREATE 12 +SELECT 12 1: BEGIN; BEGIN 1: LOCK reindex_crtab_part_heap_btree IN ACCESS EXCLUSIVE MODE; -LOCK +LOCK TABLE 2&: REINDEX TABLE reindex_crtab_part_heap_btree; 3: BEGIN; BEGIN @@ -33,7 +33,7 @@ REINDEX -- validates that reindex command in session 3 indeed generates new -- relfilenode for the index. 3: insert into old_relfilenodes (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname like 'reindex_crtab_part_heap_btree%_idx' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname like 'reindex_crtab_part_heap_btree%_idx'); -INSERT 12 +INSERT 0 12 -- Expect two distinct relfilenodes for one segment in old_relfilenodes table. -- CBDB#26: This test actually assumes when txn1 commits, its lock is acquired by -- txn3, and txn2 is blocked by it. Normally this is the case, but when the system @@ -59,7 +59,7 @@ COMMIT 2<: <... completed> REINDEX 3: insert into old_relfilenodes (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname like 'reindex_crtab_part_heap_btree%_idx' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname like 'reindex_crtab_part_heap_btree%_idx'); -INSERT 12 +INSERT 0 12 -- Expect three distinct relfilenodes per segment for "1_prt_de_fault" index. -- CBDB#26: Same as L45. 3: select relname, relname = 'reindex_crtab_part_heap_btree_1_prt_de_fault_id_idx' and res.cnt in (2, 3) as special_case_for_de_fault_id_idx, case when relname = 'reindex_crtab_part_heap_btree_1_prt_de_fault_id_idx' then -1 else res.cnt end as count from (select distinct count(distinct relfilenode) as cnt, relname from old_relfilenodes group by dbid, relname) as res; diff --git a/src/test/isolation2/expected/reindex/repeatable_read_reindex_with_insert_heap.out b/src/test/isolation2/expected/reindex/repeatable_read_reindex_with_insert_heap.out index 03fd18bee3f..c6a8ffd473a 100644 --- a/src/test/isolation2/expected/reindex/repeatable_read_reindex_with_insert_heap.out +++ b/src/test/isolation2/expected/reindex/repeatable_read_reindex_with_insert_heap.out @@ -1,24 +1,24 @@ DROP TABLE IF EXISTS reindex_serialize_tab_heap; -DROP +DROP TABLE CREATE TABLE reindex_serialize_tab_heap (a INT, b text, c date, d numeric, e bigint, f char(10), g float) distributed by (a); -CREATE +CREATE TABLE insert into reindex_serialize_tab_heap select i, 'abc'||i, now(),i*100.43, i*-187, 'a'|| i*-1, i*2.23 from generate_series(1,10) i; -INSERT 10 +INSERT 0 10 create index idxa_reindex_serialize_tab_heap on reindex_serialize_tab_heap(a); -CREATE +CREATE INDEX create index idxb_reindex_serialize_tab_heap on reindex_serialize_tab_heap(b); -CREATE +CREATE INDEX create index idxc_reindex_serialize_tab_heap on reindex_serialize_tab_heap(c); -CREATE +CREATE INDEX create index idxd_reindex_serialize_tab_heap on reindex_serialize_tab_heap(d); -CREATE +CREATE INDEX create index idxe_reindex_serialize_tab_heap on reindex_serialize_tab_heap(e); -CREATE +CREATE INDEX create index idxf_reindex_serialize_tab_heap on reindex_serialize_tab_heap(f); -CREATE +CREATE INDEX create index idxg_reindex_serialize_tab_heap on reindex_serialize_tab_heap(g); -CREATE +CREATE INDEX -- start_ignore SET gp_create_table_random_default_distribution=off; SET @@ -35,7 +35,7 @@ SET 2: BEGIN; BEGIN 2: insert into reindex_serialize_tab_heap values(99,'green',now(),10,15.10); -INSERT 1 +INSERT 0 1 2: COMMIT; COMMIT 1: select a,b,d,e,f,g from reindex_serialize_tab_heap order by 1; diff --git a/src/test/isolation2/expected/reindex/serializable_reindex_with_drop_column_heap.out b/src/test/isolation2/expected/reindex/serializable_reindex_with_drop_column_heap.out index e4218e9ccd5..160bfca9f4f 100644 --- a/src/test/isolation2/expected/reindex/serializable_reindex_with_drop_column_heap.out +++ b/src/test/isolation2/expected/reindex/serializable_reindex_with_drop_column_heap.out @@ -1,30 +1,30 @@ DROP TABLE IF EXISTS reindex_serialize_tab_heap; -DROP +DROP TABLE CREATE TABLE reindex_serialize_tab_heap (a INT, b text, c date, d numeric, e bigint, f char(10), g float) distributed by (a); -CREATE +CREATE TABLE insert into reindex_serialize_tab_heap select 1, 'abc'||i, now(),i*100.43, i*-187, 'a'|| i*-1, i*2.23 from generate_series(1,1000) i; -INSERT 1000 +INSERT 0 1000 insert into reindex_serialize_tab_heap select 1, 'abc'||i, now(),i*100.43, i*-187, 'a'|| i*-1, i*2.23 from generate_series(1,1000) i; -INSERT 1000 +INSERT 0 1000 insert into reindex_serialize_tab_heap select 1, 'abc'||i, now(),i*100.43, i*-187, 'a'|| i*-1, i*2.23 from generate_series(1,1000) i; -INSERT 1000 +INSERT 0 1000 insert into reindex_serialize_tab_heap select 1, 'abc'||i, now(),i*100.43, i*-187, 'a'|| i*-1, i*2.23 from generate_series(1,1000) i; -INSERT 1000 +INSERT 0 1000 create index idxa_reindex_serialize_tab_heap on reindex_serialize_tab_heap(a); -CREATE +CREATE INDEX create index idxb_reindex_serialize_tab_heap on reindex_serialize_tab_heap(b); -CREATE +CREATE INDEX create index idxc_reindex_serialize_tab_heap on reindex_serialize_tab_heap(c); -CREATE +CREATE INDEX create index idxd_reindex_serialize_tab_heap on reindex_serialize_tab_heap(d); -CREATE +CREATE INDEX create index idxe_reindex_serialize_tab_heap on reindex_serialize_tab_heap(e); -CREATE +CREATE INDEX create index idxf_reindex_serialize_tab_heap on reindex_serialize_tab_heap(f); -CREATE +CREATE INDEX create index idxg_reindex_serialize_tab_heap on reindex_serialize_tab_heap(g); -CREATE +CREATE INDEX -- start_ignore SET gp_create_table_random_default_distribution=off; SET @@ -41,13 +41,13 @@ SET dummy select to establish snapshot (1 row) 1: alter table reindex_serialize_tab_heap drop column c; -ALTER +ALTER TABLE 1: COMMIT; COMMIT -- Remember index relfilenodes from master and segments before -- reindex. 2: create temp table old_relfilenodes as (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname like 'idx%_reindex_serialize_tab_heap' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname like 'idx%_reindex_serialize_tab_heap'); -CREATE 28 +SELECT 28 2: reindex table reindex_serialize_tab_heap; REINDEX 2: COMMIT; diff --git a/src/test/isolation2/expected/reindex/serializable_reindex_with_drop_index_ao.out b/src/test/isolation2/expected/reindex/serializable_reindex_with_drop_index_ao.out index 93c1a82b07e..63a4317af6b 100644 --- a/src/test/isolation2/expected/reindex/serializable_reindex_with_drop_index_ao.out +++ b/src/test/isolation2/expected/reindex/serializable_reindex_with_drop_index_ao.out @@ -1,30 +1,30 @@ DROP TABLE IF EXISTS reindex_serialize_tab_ao; -DROP +DROP TABLE CREATE TABLE reindex_serialize_tab_ao (a INT, b text, c date, d numeric, e bigint, f char(10), g float) with (appendonly=True) distributed by (a); -CREATE +CREATE TABLE insert into reindex_serialize_tab_ao select 1, 'abc'||i, now(),i*100.43, i*-187, 'a'|| i*-1, i*2.23 from generate_series(1,1000) i; -INSERT 1000 +INSERT 0 1000 insert into reindex_serialize_tab_ao select 1, 'abc'||i, now(),i*100.43, i*-187, 'a'|| i*-1, i*2.23 from generate_series(1,1000) i; -INSERT 1000 +INSERT 0 1000 insert into reindex_serialize_tab_ao select 1, 'abc'||i, now(),i*100.43, i*-187, 'a'|| i*-1, i*2.23 from generate_series(1,1000) i; -INSERT 1000 +INSERT 0 1000 insert into reindex_serialize_tab_ao select 1, 'abc'||i, now(),i*100.43, i*-187, 'a'|| i*-1, i*2.23 from generate_series(1,1000) i; -INSERT 1000 +INSERT 0 1000 create index idxa_reindex_serialize_tab_ao on reindex_serialize_tab_ao(a); -CREATE +CREATE INDEX create index idxb_reindex_serialize_tab_ao on reindex_serialize_tab_ao(b); -CREATE +CREATE INDEX create index idxc_reindex_serialize_tab_ao on reindex_serialize_tab_ao(c); -CREATE +CREATE INDEX create index idxd_reindex_serialize_tab_ao on reindex_serialize_tab_ao(d); -CREATE +CREATE INDEX create index idxe_reindex_serialize_tab_ao on reindex_serialize_tab_ao(e); -CREATE +CREATE INDEX create index idxf_reindex_serialize_tab_ao on reindex_serialize_tab_ao(f); -CREATE +CREATE INDEX create index idxg_reindex_serialize_tab_ao on reindex_serialize_tab_ao(g); -CREATE +CREATE INDEX -- start_ignore SET gp_create_table_random_default_distribution=off; SET @@ -41,13 +41,13 @@ SET dummy select to establish snapshot (1 row) 1: drop index idxg_reindex_serialize_tab_ao; -DROP +DROP INDEX 1: COMMIT; COMMIT -- Remember index relfilenodes from master and segments before -- reindex. 2: create table old_ao_relfilenodes as (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname like 'idx%_reindex_serialize_tab_ao' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname like 'idx%_reindex_serialize_tab_ao'); -CREATE 28 +SELECT 28 2: reindex table reindex_serialize_tab_ao; REINDEX 2: COMMIT; diff --git a/src/test/isolation2/expected/reindex/serializable_reindex_with_drop_index_heap.out b/src/test/isolation2/expected/reindex/serializable_reindex_with_drop_index_heap.out index 16382071948..fa3476c6cd5 100644 --- a/src/test/isolation2/expected/reindex/serializable_reindex_with_drop_index_heap.out +++ b/src/test/isolation2/expected/reindex/serializable_reindex_with_drop_index_heap.out @@ -1,27 +1,27 @@ CREATE TABLE reindex_dropindex_serialize_tab_heap (a INT, b text, c date, d numeric, e bigint, f char(10), g float) distributed by (a); -CREATE +CREATE TABLE insert into reindex_dropindex_serialize_tab_heap select 1, 'abc'||i, now(),i*100.43, i*-187, 'a'|| i*-1, i*2.23 from generate_series(1,1000) i; -INSERT 1000 +INSERT 0 1000 insert into reindex_dropindex_serialize_tab_heap select 1, 'abc'||i, now(),i*100.43, i*-187, 'a'|| i*-1, i*2.23 from generate_series(1,1000) i; -INSERT 1000 +INSERT 0 1000 insert into reindex_dropindex_serialize_tab_heap select 1, 'abc'||i, now(),i*100.43, i*-187, 'a'|| i*-1, i*2.23 from generate_series(1,1000) i; -INSERT 1000 +INSERT 0 1000 insert into reindex_dropindex_serialize_tab_heap select 1, 'abc'||i, now(),i*100.43, i*-187, 'a'|| i*-1, i*2.23 from generate_series(1,1000) i; -INSERT 1000 +INSERT 0 1000 create index idxa_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(a); -CREATE +CREATE INDEX create index idxb_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(b); -CREATE +CREATE INDEX create index idxc_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(c); -CREATE +CREATE INDEX create index idxd_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(d); -CREATE +CREATE INDEX create index idxe_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(e); -CREATE +CREATE INDEX create index idxf_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(f); -CREATE +CREATE INDEX create index idxg_reindex_dropindex_serialize_tab_heap on reindex_dropindex_serialize_tab_heap(g); -CREATE +CREATE INDEX -- start_ignore SET gp_create_table_random_default_distribution=off; SET @@ -38,13 +38,13 @@ SET dummy select to establish snapshot (1 row) 1: drop index idxg_reindex_dropindex_serialize_tab_heap; -DROP +DROP INDEX 1: COMMIT; COMMIT -- Remember index relfilenodes from master and segments before -- reindex. 2: create table old_heap_relfilenodes as (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname like 'idx%_reindex_dropindex_serialize_tab_heap' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname like 'idx%_reindex_dropindex_serialize_tab_heap'); -CREATE 28 +SELECT 28 2: reindex table reindex_dropindex_serialize_tab_heap; REINDEX 2: COMMIT; diff --git a/src/test/isolation2/expected/reindex/vacuum_analyze_while_reindex_ao_btree.out b/src/test/isolation2/expected/reindex/vacuum_analyze_while_reindex_ao_btree.out index a7ab01a3611..fc69bb61f5b 100644 --- a/src/test/isolation2/expected/reindex/vacuum_analyze_while_reindex_ao_btree.out +++ b/src/test/isolation2/expected/reindex/vacuum_analyze_while_reindex_ao_btree.out @@ -1,10 +1,10 @@ DROP TABLE IF EXISTS reindex_ao; -DROP +DROP TABLE CREATE TABLE reindex_ao (a INT) WITH (appendonly=true); -CREATE +CREATE TABLE insert into reindex_ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 analyze reindex_ao; ANALYZE select 1 as reltuples_same_as_count from pg_class where relname = 'reindex_ao' and reltuples = (select count(*) from reindex_ao); @@ -13,13 +13,13 @@ select 1 as reltuples_same_as_count from pg_class where relname = 'reindex_ao' 1 (1 row) insert into reindex_ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 select 1 as reltuples_same_as_count from pg_class where relname = 'reindex_ao' and reltuples = (select count(*) from reindex_ao); reltuples_same_as_count ------------------------- (0 rows) create index idx_btree_reindex_vacuum_analyze_ao on reindex_ao(a); -CREATE +CREATE INDEX -- @Description Ensures that a vacuum during reindex operations is ok -- @@ -30,7 +30,7 @@ BEGIN -- Remember index relfilenodes from master and segments before -- reindex. 1: create temp table old_relfilenodes as (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname = 'idx_btree_reindex_vacuum_analyze_ao' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname = 'idx_btree_reindex_vacuum_analyze_ao'); -CREATE 4 +SELECT 4 1: REINDEX index idx_btree_reindex_vacuum_analyze_ao; REINDEX 2&: VACUUM ANALYZE reindex_ao; @@ -58,4 +58,4 @@ COMMIT 1 (1 row) 3: INSERT INTO reindex_ao VALUES (0); -INSERT 1 +INSERT 0 1 diff --git a/src/test/isolation2/expected/reindex/vacuum_while_reindex_ao_bitmap.out b/src/test/isolation2/expected/reindex/vacuum_while_reindex_ao_bitmap.out index 6c3c5b14514..f8e2e01ae57 100644 --- a/src/test/isolation2/expected/reindex/vacuum_while_reindex_ao_bitmap.out +++ b/src/test/isolation2/expected/reindex/vacuum_while_reindex_ao_bitmap.out @@ -1,14 +1,14 @@ DROP TABLE IF EXISTS reindex_ao; -DROP +DROP TABLE CREATE TABLE reindex_ao (a INT) WITH (appendonly=true); -CREATE +CREATE TABLE insert into reindex_ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into reindex_ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 create index idx_bitmap_reindex_ao on reindex_ao USING bitmap(a); -CREATE +CREATE INDEX -- @Description Ensures that a vacuum during reindex operations is ok -- @@ -19,7 +19,7 @@ BEGIN -- Remember index relfilenodes from master and segments before -- reindex. 1: create temp table old_relfilenodes as (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname = 'idx_bitmap_reindex_ao' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname = 'idx_bitmap_reindex_ao'); -CREATE 4 +SELECT 4 1: REINDEX index idx_bitmap_reindex_ao; REINDEX 2&: VACUUM reindex_ao; @@ -41,4 +41,4 @@ COMMIT 0 (1 row) 3: INSERT INTO reindex_ao VALUES (0); -INSERT 1 +INSERT 0 1 diff --git a/src/test/isolation2/expected/reindex/vacuum_while_reindex_heap_btree.out b/src/test/isolation2/expected/reindex/vacuum_while_reindex_heap_btree.out index c049f48081f..cf8e6e3dbd9 100644 --- a/src/test/isolation2/expected/reindex/vacuum_while_reindex_heap_btree.out +++ b/src/test/isolation2/expected/reindex/vacuum_while_reindex_heap_btree.out @@ -1,14 +1,14 @@ DROP TABLE IF EXISTS reindex_heap; -DROP +DROP TABLE CREATE TABLE reindex_heap (a INT); -CREATE +CREATE TABLE insert into reindex_heap select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into reindex_heap select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 create index idx_btree_reindex_heap on reindex_heap(a); -CREATE +CREATE INDEX -- @Description Ensures that a vacuum during reindex operations is ok -- @@ -19,7 +19,7 @@ BEGIN -- Remember index relfilenodes from master and segments before -- reindex. 1: create temp table old_relfilenodes as (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname = 'idx_btree_reindex_heap' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname = 'idx_btree_reindex_heap'); -CREATE 4 +SELECT 4 1: REINDEX index idx_btree_reindex_heap; REINDEX 2&: VACUUM reindex_heap; @@ -41,4 +41,4 @@ COMMIT 0 (1 row) 3: INSERT INTO reindex_heap VALUES (0); -INSERT 1 +INSERT 0 1 diff --git a/src/test/isolation2/expected/reindex/vacuum_while_reindex_heap_btree_toast.out b/src/test/isolation2/expected/reindex/vacuum_while_reindex_heap_btree_toast.out index 6b6254e7230..e17213f0b22 100644 --- a/src/test/isolation2/expected/reindex/vacuum_while_reindex_heap_btree_toast.out +++ b/src/test/isolation2/expected/reindex/vacuum_while_reindex_heap_btree_toast.out @@ -1,14 +1,14 @@ DROP TABLE IF EXISTS reindex_toast_heap; -DROP +DROP TABLE CREATE TABLE reindex_toast_heap (a text, b int); -CREATE +CREATE TABLE alter table reindex_toast_heap alter column a set storage external; -ALTER +ALTER TABLE insert into reindex_toast_heap select repeat('123456789',10000), i from generate_series(1,100) i; -INSERT 100 +INSERT 0 100 create index idx_btree_reindex_toast_heap on reindex_toast_heap(b); -CREATE +CREATE INDEX -- @Description Ensures that a vacuum during reindex operations is ok -- @@ -19,7 +19,7 @@ BEGIN -- Remember index relfilenodes from master and segments before -- reindex. 1: create temp table old_relfilenodes as (select gp_segment_id as dbid, relfilenode, oid, relname from gp_dist_random('pg_class') where relname = 'idx_btree_reindex_toast_heap' union all select gp_segment_id as dbid, relfilenode, oid, relname from pg_class where relname = 'idx_btree_reindex_toast_heap'); -CREATE 4 +SELECT 4 1: REINDEX index idx_btree_reindex_toast_heap; REINDEX 2&: VACUUM reindex_toast_heap; @@ -41,4 +41,4 @@ COMMIT 0 (1 row) 3: INSERT INTO reindex_toast_heap VALUES (0); -INSERT 1 +INSERT 0 1 diff --git a/src/test/isolation2/expected/reindex_gpfastsequence.out b/src/test/isolation2/expected/reindex_gpfastsequence.out index bb25ca9f4f0..e49fb145130 100644 --- a/src/test/isolation2/expected/reindex_gpfastsequence.out +++ b/src/test/isolation2/expected/reindex_gpfastsequence.out @@ -1,11 +1,11 @@ -- Test concurrent reindex gp_fastsequence and insert on an AO table create table test_fastseqence ( a int, b char(20)) with (appendonly = true, orientation=column); -CREATE +CREATE TABLE create index test_fastseqence_idx on test_fastseqence(b); -CREATE +CREATE INDEX insert into test_fastseqence select i , 'aa'||i from generate_series(1,100) i; -INSERT 100 +INSERT 0 100 select gp_inject_fault_infinite('reindex_relation', 'suspend', 2); gp_inject_fault_infinite @@ -32,7 +32,7 @@ select gp_inject_fault('reindex_relation', 'reset', 2); 1<: <... completed> REINDEX 2<: <... completed> -INSERT 100 +INSERT 0 100 -- Validate that gp_fastsequence works as expected after reindex SELECT 1 AS oid_same_on_all_segs from gp_dist_random('pg_class') WHERE relname = 'gp_fastsequence_objid_objmod_index' GROUP BY oid having count(*) = (SELECT count(*) FROM gp_segment_configuration WHERE role='p' AND content > -1); @@ -53,7 +53,7 @@ select last_sequence from gp_dist_random('gp_fastsequence') where objid = (selec (6 rows) insert into test_fastseqence select i , 'aa'||i from generate_series(1,100) i; -INSERT 100 +INSERT 0 100 select last_sequence from gp_dist_random('gp_fastsequence') where objid = (select segrelid from pg_appendonly where relid = (select oid from pg_class where relname = 'test_fastseqence')); last_sequence diff --git a/src/test/isolation2/expected/reorganize_after_ao_vacuum_skip_drop.out b/src/test/isolation2/expected/reorganize_after_ao_vacuum_skip_drop.out index 604c84856a0..18cc24c26d1 100644 --- a/src/test/isolation2/expected/reorganize_after_ao_vacuum_skip_drop.out +++ b/src/test/isolation2/expected/reorganize_after_ao_vacuum_skip_drop.out @@ -3,9 +3,9 @@ -- rewrites the relation differently than other ALTER operations. CREATE TABLE reorganize_after_ao_vacuum_skip_drop (a INT, b INT) WITH (appendonly=true); -CREATE +CREATE TABLE INSERT INTO reorganize_after_ao_vacuum_skip_drop SELECT i as a, i as b FROM generate_series(1, 10) AS i; -INSERT 10 +INSERT 0 10 DELETE FROM reorganize_after_ao_vacuum_skip_drop; DELETE 10 @@ -28,7 +28,7 @@ BEGIN 2: VACUUM reorganize_after_ao_vacuum_skip_drop; VACUUM 1: END; -END +COMMIT -- We should see an aoseg in state 2 (AOSEG_STATE_AWAITING_DROP) 0U: SELECT segno, state FROM gp_toolkit.__gp_aoseg('reorganize_after_ao_vacuum_skip_drop'); @@ -40,7 +40,7 @@ END -- The AO relation should be rewritten and AppendOnlyHash entry invalidated 1: ALTER TABLE reorganize_after_ao_vacuum_skip_drop SET WITH (reorganize=true); -ALTER +ALTER TABLE 0U: SELECT segno, state FROM gp_toolkit.__gp_aoseg('reorganize_after_ao_vacuum_skip_drop'); segno | state -------+------- @@ -49,7 +49,7 @@ ALTER -- Check if insert goes into segno 1 instead of segno 2. If it did not -- go into segno 1, there was a leak in the AppendOnlyHash entry. 1: INSERT INTO reorganize_after_ao_vacuum_skip_drop SELECT i as a, i as b FROM generate_series(1, 100) AS i; -INSERT 100 +INSERT 0 100 0U: SELECT segno, tupcount > 0, state FROM gp_toolkit.__gp_aoseg('reorganize_after_ao_vacuum_skip_drop'); segno | ?column? | state -------+----------+------- diff --git a/src/test/isolation2/expected/resgroup/resgroup_alter_concurrency.out b/src/test/isolation2/expected/resgroup/resgroup_alter_concurrency.out index 7eecfacc404..817dc592962 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_alter_concurrency.out +++ b/src/test/isolation2/expected/resgroup/resgroup_alter_concurrency.out @@ -1,28 +1,28 @@ -- create a resource group when gp_resource_manager is queue DROP ROLE IF EXISTS role_concurrency_test; -DROP +DROP ROLE -- start_ignore DROP RESOURCE GROUP rg_concurrency_test; ERROR: resource group "rg_concurrency_test" does not exist -- end_ignore CREATE RESOURCE GROUP rg_concurrency_test WITH(concurrency=1, cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; -CREATE +CREATE ROLE -- After a 'q' command the client connection is disconnected but the -- QD may still be alive, if we then query pg_stat_activity quick enough -- we might still see this session with query ''. -- A filter is put to filter out this kind of quitted sessions. CREATE OR REPLACE VIEW rg_activity_status AS SELECT rsgname, wait_event_type, state, query FROM pg_stat_activity WHERE rsgname='rg_concurrency_test' AND query <> ''; -CREATE +CREATE VIEW -- -- 1. increase concurrency after pending queries -- ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; -ALTER +ALTER RESOURCE GROUP 11:SET ROLE role_concurrency_test; SET @@ -37,10 +37,10 @@ SET 22&:BEGIN; ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 2; -ALTER +ALTER RESOURCE GROUP 11:END; -END +COMMIT 11q: ... 21<: <... completed> BEGIN @@ -55,9 +55,9 @@ SELECT * FROM rg_activity_status; (2 rows) 21:END; -END +COMMIT 22:END; -END +COMMIT 21q: ... 22q: ... @@ -71,7 +71,7 @@ SELECT * FROM rg_activity_status; -- ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; -ALTER +ALTER RESOURCE GROUP 11:SET ROLE role_concurrency_test; SET @@ -79,7 +79,7 @@ SET BEGIN ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 2; -ALTER +ALTER RESOURCE GROUP 21:SET ROLE role_concurrency_test; SET @@ -98,7 +98,7 @@ SELECT * FROM rg_activity_status; (3 rows) 11:END; -END +COMMIT 11q: ... 22<: <... completed> BEGIN @@ -111,9 +111,9 @@ SELECT * FROM rg_activity_status; (2 rows) 21:END; -END +COMMIT 22:END; -END +COMMIT 21q: ... 22q: ... @@ -126,7 +126,7 @@ SELECT * FROM rg_activity_status; -- 3. decrease concurrency -- ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 10; -ALTER +ALTER RESOURCE GROUP 11:SET ROLE role_concurrency_test; SET 11:BEGIN; @@ -153,7 +153,7 @@ SET BEGIN ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; -ALTER +ALTER RESOURCE GROUP 11q: ... 12q: ... @@ -174,13 +174,13 @@ SELECT pg_sleep(1); -- 4. increase concurrency from 0 -- DROP ROLE role_concurrency_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_concurrency_test; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP rg_concurrency_test WITH(concurrency=0, cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; -CREATE +CREATE ROLE 11:SET ROLE role_concurrency_test; SET @@ -192,7 +192,7 @@ SELECT * FROM rg_activity_status; (1 row) ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; -ALTER +ALTER RESOURCE GROUP 11<: <... completed> BEGIN @@ -203,7 +203,7 @@ SELECT * FROM rg_activity_status; (1 row) 11:END; -END +COMMIT 11q: ... -- @@ -213,14 +213,14 @@ END -- ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_activity_status; rsgname | wait_event_type | state | query ---------+-----------------+-------+------- (0 rows) ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 0; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_activity_status; rsgname | wait_event_type | state | query ---------+-----------------+-------+------- @@ -233,7 +233,7 @@ SELECT * FROM rg_activity_status; -- ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_activity_status; rsgname | wait_event_type | state | query ---------+-----------------+-------+------- @@ -250,7 +250,7 @@ SELECT * FROM rg_activity_status; (1 row) ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 0; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_activity_status; rsgname | wait_event_type | state | query ---------------------+-----------------+---------------------+-------- @@ -258,7 +258,7 @@ SELECT * FROM rg_activity_status; (1 row) 11:END; -END +COMMIT 11q: ... -- @@ -268,7 +268,7 @@ END -- ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_activity_status; rsgname | wait_event_type | state | query ---------+-----------------+-------+------- @@ -289,7 +289,7 @@ SELECT * FROM rg_activity_status; (2 rows) ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 0; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_activity_status; rsgname | wait_event_type | state | query ---------------------+-----------------+---------------------+-------- @@ -298,7 +298,7 @@ SELECT * FROM rg_activity_status; (2 rows) 11:END; -END +COMMIT 11q: ... SELECT * FROM rg_activity_status; rsgname | wait_event_type | state | query @@ -321,51 +321,51 @@ SELECT * FROM rg_activity_status; -- 6: drop a resgroup with concurrency=0 and pending queries DROP ROLE IF EXISTS role_concurrency_test; -DROP +DROP ROLE -- start_ignore DROP RESOURCE GROUP rg_concurrency_test; -DROP +DROP RESOURCE GROUP -- end_ignore CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=0, cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; -CREATE +CREATE ROLE 61:SET ROLE role_concurrency_test; SET 61&:BEGIN; ALTER ROLE role_concurrency_test RESOURCE GROUP none; -ALTER +ALTER ROLE DROP RESOURCE GROUP rg_concurrency_test; -DROP +DROP RESOURCE GROUP 61<: <... completed> BEGIN 61:END; -END +COMMIT 61q: ... -- 7: drop a role with concurrency=0 and pending queries DROP ROLE IF EXISTS role_concurrency_test; -DROP +DROP ROLE -- start_ignore DROP RESOURCE GROUP rg_concurrency_test; ERROR: resource group "rg_concurrency_test" does not exist -- end_ignore CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=0, cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; -CREATE +CREATE ROLE 61:SET ROLE role_concurrency_test; SET 61&:BEGIN; DROP ROLE role_concurrency_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_concurrency_test; -DROP +DROP RESOURCE GROUP 61<: <... completed> ERROR: role with Oid 213301 was dropped @@ -375,7 +375,7 @@ DETAIL: Cannot execute commands anymore, please terminate this session. -- cleanup -- start_ignore DROP VIEW rg_activity_status; -DROP +DROP VIEW DROP ROLE role_concurrency_test; DROP DROP RESOURCE GROUP rg_concurrency_test; diff --git a/src/test/isolation2/expected/resgroup/resgroup_assign_slot_fail.out b/src/test/isolation2/expected/resgroup/resgroup_assign_slot_fail.out index a0f8f82984d..0d137952aea 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_assign_slot_fail.out +++ b/src/test/isolation2/expected/resgroup/resgroup_assign_slot_fail.out @@ -2,15 +2,15 @@ -- test the slot will be unassigned correctly. DROP ROLE IF EXISTS role_test; -DROP +DROP ROLE -- start_ignore DROP RESOURCE GROUP rg_test; ERROR: resource group "rg_test" does not exist -- end_ignore CREATE RESOURCE GROUP rg_test WITH (concurrency=2, cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_test RESOURCE GROUP rg_test; -CREATE +CREATE ROLE 1: SET ROLE role_test; SET @@ -35,14 +35,14 @@ ERROR: fault triggered, fault name:'resgroup_assigned_on_master' fault type:'er 2: BEGIN; BEGIN 1: END; -END +COMMIT 2: END; -END +COMMIT 1q: ... 2q: ... --clean up DROP ROLE role_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_test; -DROP +DROP RESOURCE GROUP diff --git a/src/test/isolation2/expected/resgroup/resgroup_auxiliary_tools_v1.out b/src/test/isolation2/expected/resgroup/resgroup_auxiliary_tools_v1.out index 1120930c158..01e019377d6 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_auxiliary_tools_v1.out +++ b/src/test/isolation2/expected/resgroup/resgroup_auxiliary_tools_v1.out @@ -75,7 +75,7 @@ def check_group_shares(name): cpu_weight = int(plpy.execute(''' SELECT value FRO # check default groups check_group_shares('default_group') check_group_shares('admin_group') check_group_shares('system_group') # check user groups check_group_shares('rg1_cpu_test') check_group_shares('rg2_cpu_test') return True $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION -- check whether the queries running on the specific core set @@ -92,7 +92,7 @@ expect_cpu = [] for token in tokens: if token.find('-') != -1: interval = token.split("-") num1 = interval[0] num2 = interval[1] for num in range(int(num1), int(num2) + 1): expect_cpu.append(str(num)) else: expect_cpu.append(token) sess_ids = get_all_sess_ids_in_group(grp) for i in range(1000): time.sleep(0.01) if not check(expect_cpu, sess_ids): return False return True $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION -- create a resource group that contains all the cpu cores 0: CREATE OR REPLACE FUNCTION create_allcores_group(grp TEXT) RETURNS BOOL AS $$ import subprocess @@ -100,7 +100,7 @@ file = "/sys/fs/cgroup/cpuset/gpdb/cpuset.cpus" fd = open(file) line = fd.readli # plpy SPI will always start a transaction, but res group cannot be created in a transaction. ret = subprocess.run(['psql', 'postgres', '-c' , '{}'.format(sql)], stdout=subprocess.PIPE) if ret.returncode != 0: plpy.error('failed to create resource group.\n {} \n {}'.format(ret.stdout, ret.stderr)) file = "/sys/fs/cgroup/cpuset/gpdb/1/cpuset.cpus" fd = open(file) line = fd.readline() fd.close() line = line.strip('\n') if line != "0": return False return True $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION -- check whether the cpuset value in cgroup is valid according to the rule 0: CREATE OR REPLACE FUNCTION check_cpuset_rules() RETURNS BOOL AS $$ def get_all_group_which_cpuset_is_set(): sql = "select groupid,cpuset from gp_toolkit.gp_resgroup_config where cpuset != '-1'" result = plpy.execute(sql) return result @@ -111,7 +111,7 @@ config_groups = get_all_group_which_cpuset_is_set() groups_cpuset = set([]) if not (config_cpuset.issubset(cgroup_cpuset) and cgroup_cpuset.issubset(config_cpuset)): return False # check whether cpuset in resource group union default group is universal set default_cpuset = get_cgroup_cpuset(1) all_cpuset = get_cgroup_cpuset(0) if not (default_cpuset | groups_cpuset).issubset(all_cpuset): return False if not all_cpuset.issubset(default_cpuset | groups_cpuset): return False # if all the cores are allocated to resource group, default group must has a core left if len(default_cpuset & groups_cpuset) > 0 and (len(default_cpuset) != 1 or (not default_cpuset.issubset(all_cpuset))): return False return True $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION 0: CREATE OR REPLACE FUNCTION is_session_in_group(pid integer, groupname text) RETURNS BOOL AS $$ import subprocess @@ -123,4 +123,4 @@ path = "/sys/fs/cgroup/cpu/gpdb/{}/cgroup.procs".format(groupid) stdout = subpro return set(session_pids).issubset(set(cgroups_pids)) for host in hosts: if not get_result(host): return False return True $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION diff --git a/src/test/isolation2/expected/resgroup/resgroup_auxiliary_tools_v2.out b/src/test/isolation2/expected/resgroup/resgroup_auxiliary_tools_v2.out index 779e4dd1bcf..1ca18c1414c 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_auxiliary_tools_v2.out +++ b/src/test/isolation2/expected/resgroup/resgroup_auxiliary_tools_v2.out @@ -74,7 +74,7 @@ def check_group_shares(name): cpu_weight = int(plpy.execute(''' SELECT value FRO # check default groups check_group_shares('default_group') check_group_shares('admin_group') check_group_shares('system_group') # check user groups check_group_shares('rg1_cpu_test') check_group_shares('rg2_cpu_test') return True $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION -- check whether the queries running on the specific core set @@ -91,7 +91,7 @@ expect_cpu = [] for token in tokens: if token.find('-') != -1: interval = token.split("-") num1 = interval[0] num2 = interval[1] for num in range(int(num1), int(num2) + 1): expect_cpu.append(str(num)) else: expect_cpu.append(token) sess_ids = get_all_sess_ids_in_group(grp) for i in range(1000): time.sleep(0.01) if not check(expect_cpu, sess_ids): return False return True $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION -- create a resource group that contains all the cpu cores 0: CREATE OR REPLACE FUNCTION create_allcores_group(grp TEXT) RETURNS BOOL AS $$ import subprocess @@ -99,7 +99,7 @@ file = "/sys/fs/cgroup/gpdb/cpuset.cpus" fd = open(file) line = fd.readline() fd # plpy SPI will always start a transaction, but res group cannot be created in a transaction. ret = subprocess.run(['psql', 'postgres', '-c' , '{}'.format(sql)], stdout=subprocess.PIPE) if ret.returncode != 0: plpy.error('failed to create resource group.\n {} \n {}'.format(ret.stdout, ret.stderr)) file = "/sys/fs/cgroup/gpdb/1/cpuset.cpus" fd = open(file) line = fd.readline() fd.close() line = line.strip('\n') if line != "0": return False return True $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION -- check whether the cpuset value in cgroup is valid according to the rule 0: CREATE OR REPLACE FUNCTION check_cpuset_rules() RETURNS BOOL AS $$ def get_all_group_which_cpuset_is_set(): sql = "select groupid,cpuset from gp_toolkit.gp_resgroup_config where cpuset != '-1'" result = plpy.execute(sql) return result @@ -110,7 +110,7 @@ config_groups = get_all_group_which_cpuset_is_set() groups_cpuset = set([]) if not (config_cpuset.issubset(cgroup_cpuset) and cgroup_cpuset.issubset(config_cpuset)): return False # check whether cpuset in resource group union default group is universal set default_cpuset = get_cgroup_cpuset(1) all_cpuset = get_cgroup_cpuset(0) if not (default_cpuset | groups_cpuset).issubset(all_cpuset): return False if not all_cpuset.issubset(default_cpuset | groups_cpuset): return False # if all the cores are allocated to resource group, default group must has a core left if len(default_cpuset & groups_cpuset) > 0 and (len(default_cpuset) != 1 or (not default_cpuset.issubset(all_cpuset))): return False return True $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION 0: CREATE OR REPLACE FUNCTION is_session_in_group(pid integer, groupname text) RETURNS BOOL AS $$ import subprocess @@ -122,26 +122,4 @@ path = "/sys/fs/cgroup/gpdb/{}/cgroup.procs".format(groupid) stdout = subprocess return set(session_pids).issubset(set(cgroups_pids)) for host in hosts: if not get_result(host): return False return True $$ LANGUAGE plpython3u; -CREATE - -0: CREATE OR REPLACE FUNCTION check_cgroup_io_max(groupname text, tablespace_name text, parameters text) RETURNS BOOL AS $$ import ctypes import os -postgres = ctypes.CDLL(None) get_bdi_of_path = postgres['get_bdi_of_path'] get_tablespace_path = postgres['get_tablespace_path'] get_tablespace_oid = postgres['get_tablespace_oid'] -# get group oid sql = "select groupid from gp_toolkit.gp_resgroup_config where groupname = '%s'" % groupname result = plpy.execute(sql) groupid = result[0]['groupid'] -cgroup_path = "/sys/fs/cgroup/gpdb/%d" % groupid -# get path of tablespace spcoid = get_tablespace_oid(tablespace_name.encode('utf-8'), False) location = ctypes.cast(get_tablespace_path(spcoid), ctypes.c_char_p).value -if location == "": return False -bdi = get_bdi_of_path(location) major = os.major(bdi) minor = os.minor(bdi) -match_string = "{}:{} {}".format(major, minor, parameters) match = False with open(os.path.join(cgroup_path, "io.max")) as f: for line in f.readlines(): line = line.strip() if match_string == line: match = True break -return match -$$ LANGUAGE plpython3u; -CREATE - -0: CREATE OR REPLACE FUNCTION mkdir(dirname text) RETURNS BOOL AS $$ import os -if os.path.exists(dirname): return True -try: os.makedirs(dirname) except Exception as e: plpy.error("cannot create dir {}".format(e)) else: return True $$ LANGUAGE plpython3u; -CREATE - -0: CREATE OR REPLACE FUNCTION rmdir(dirname text) RETURNS BOOL AS $$ import shutil import os -if not os.path.exists(dirname): return True -try: shutil.rmtree(dirname) except Exception as e: plpy.error("cannot remove dir {}".format(e)) else: return True $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION diff --git a/src/test/isolation2/expected/resgroup/resgroup_bypass.out b/src/test/isolation2/expected/resgroup/resgroup_bypass.out index 5cff41d745f..a9c294edb2c 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_bypass.out +++ b/src/test/isolation2/expected/resgroup/resgroup_bypass.out @@ -11,14 +11,20 @@ ERROR: resource group "rg_bypass" does not exist -- create a resource group with concurrency = 1. CREATE RESOURCE GROUP rg_bypass WITH(cpu_max_percent=20, concurrency=1); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_bypass RESOURCE GROUP rg_bypass; -CREATE +CREATE ROLE SET ROLE role_bypass; SET CREATE TABLE t_bypass(a int) distributed by (a); -CREATE +CREATE TABLE + +-- gp_resource_group_bypass can only be set by super user +-- below set statement will error out +set gp_resource_group_bypass = 1; +ERROR: permission denied to set parameter "gp_resource_group_bypass" + RESET ROLE; RESET @@ -164,7 +170,7 @@ SELECT gp_inject_fault('func_init_plan_end', 'reset', 1); (1 row) 1<: <... completed> -INSERT 1 +INSERT 0 1 1q: ... 2q: ... @@ -221,7 +227,7 @@ SELECT gp_inject_fault('func_init_plan_end', 'reset', 1); -- min_cost will not work for above. -- alter resource group's min_cost ALTER RESOURCE GROUP rg_bypass SET min_cost 500; -ALTER +ALTER RESOURCE GROUP ANALYZE t_bypass; ANALYZE -- Session1: for quries with cost under the min_cost limit, they will be unassigned and bypassed. @@ -279,9 +285,9 @@ SELECT gp_inject_fault('func_init_plan_end', 'reset', 1); -- cleanup -- start_ignore DROP TABLE t_bypass; -DROP +DROP TABLE DROP ROLE role_bypass; -DROP +DROP ROLE DROP RESOURCE GROUP rg_bypass; -DROP +DROP RESOURCE GROUP -- end_ignore diff --git a/src/test/isolation2/expected/resgroup/resgroup_bypass_catalog.out b/src/test/isolation2/expected/resgroup/resgroup_bypass_catalog.out index f32527713f7..2299c072a5c 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_bypass_catalog.out +++ b/src/test/isolation2/expected/resgroup/resgroup_bypass_catalog.out @@ -1,10 +1,10 @@ CREATE RESOURCE GROUP rg_test_catalog WITH (CONCURRENCY=2, CPU_MAX_PERCENT=10); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_test_catalog RESOURCE GROUP rg_test_catalog; -CREATE +CREATE ROLE CREATE FUNCTION rg_test_udf() RETURNS integer AS $$ return 1 $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION -- take 1 slot 1: SET ROLE role_test_catalog; diff --git a/src/test/isolation2/expected/resgroup/resgroup_cancel_terminate_concurrency.out b/src/test/isolation2/expected/resgroup/resgroup_cancel_terminate_concurrency.out index e1c3c77403c..25e5363080b 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_cancel_terminate_concurrency.out +++ b/src/test/isolation2/expected/resgroup/resgroup_cancel_terminate_concurrency.out @@ -1,18 +1,18 @@ -- test1: cancel a query that is waiting for a slot DROP ROLE IF EXISTS role_concurrency_test; -DROP +DROP ROLE -- start_ignore DROP RESOURCE GROUP rg_concurrency_test; ERROR: resource group "rg_concurrency_test" does not exist -- end_ignore CREATE OR REPLACE VIEW rg_concurrency_view AS SELECT wait_event_type IS NOT NULL as waiting, wait_event_type, state, query, rsgname FROM pg_stat_activity WHERE rsgname='rg_concurrency_test'; -CREATE +CREATE VIEW CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=1, cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; -CREATE +CREATE ROLE 1:SET ROLE role_concurrency_test; SET 1:BEGIN; @@ -37,7 +37,7 @@ SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE wait_event_type='Resou t (2 rows) 1:END; -END +COMMIT 2<: <... completed> ERROR: canceling statement due to user request 3<: <... completed> @@ -52,22 +52,22 @@ SELECT * FROM rg_concurrency_view; 2q: ... 3q: ... DROP ROLE role_concurrency_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_concurrency_test; -DROP +DROP RESOURCE GROUP -- test2: terminate a query that is waiting for a slot DROP ROLE IF EXISTS role_concurrency_test; -DROP +DROP ROLE -- start_ignore DROP RESOURCE GROUP rg_concurrency_test; ERROR: resource group "rg_concurrency_test" does not exist -- end_ignore CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=1, cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; -CREATE +CREATE ROLE 1:SET ROLE role_concurrency_test; SET 1:BEGIN; @@ -92,7 +92,7 @@ SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE wait_event_type='Re t (2 rows) 1:END; -END +COMMIT 2<: <... completed> FATAL: terminating connection due to administrator command server closed the connection unexpectedly @@ -111,22 +111,22 @@ SELECT * FROM rg_concurrency_view; 2q: ... 3q: ... DROP ROLE role_concurrency_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_concurrency_test; -DROP +DROP RESOURCE GROUP -- test3: cancel a query that is running DROP ROLE IF EXISTS role_concurrency_test; -DROP +DROP ROLE -- start_ignore DROP RESOURCE GROUP rg_concurrency_test; ERROR: resource group "rg_concurrency_test" does not exist -- end_ignore CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=2, cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; -CREATE +CREATE ROLE 1:SET ROLE role_concurrency_test; SET 1&:SELECT pg_sleep(10000); @@ -172,22 +172,22 @@ SELECT * FROM rg_concurrency_view; 6q: ... 7q: ... DROP ROLE role_concurrency_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_concurrency_test; -DROP +DROP RESOURCE GROUP -- test4: terminate a query that is running DROP ROLE IF EXISTS role_concurrency_test; -DROP +DROP ROLE -- start_ignore DROP RESOURCE GROUP rg_concurrency_test; ERROR: resource group "rg_concurrency_test" does not exist -- end_ignore CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=2, cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; -CREATE +CREATE ROLE 1:SET ROLE role_concurrency_test; SET 1&:SELECT pg_sleep(10000); @@ -239,26 +239,26 @@ SELECT * FROM rg_concurrency_view; 6q: ... 7q: ... DROP ROLE role_concurrency_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_concurrency_test; -DROP +DROP RESOURCE GROUP -- test5: terminate a query waiting for a slot, that opens a transaction on exit callback DROP ROLE IF EXISTS role_concurrency_test; -DROP +DROP ROLE -- start_ignore DROP RESOURCE GROUP rg_concurrency_test; ERROR: resource group "rg_concurrency_test" does not exist -- end_ignore CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=1, cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; -CREATE +CREATE ROLE 1:SET ROLE role_concurrency_test; SET 1:CREATE TEMP TABLE tmp(a INT); -CREATE +CREATE TABLE 2:SET ROLE role_concurrency_test; SET 2:BEGIN; @@ -292,9 +292,9 @@ SELECT * FROM rg_concurrency_view; 1q: ... 2q: ... DROP ROLE role_concurrency_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_concurrency_test; -DROP +DROP RESOURCE GROUP DROP VIEW rg_concurrency_view; -DROP +DROP VIEW diff --git a/src/test/isolation2/expected/resgroup/resgroup_concurrency.out b/src/test/isolation2/expected/resgroup/resgroup_concurrency.out index dda3764ba3d..556d8a757b4 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_concurrency.out +++ b/src/test/isolation2/expected/resgroup/resgroup_concurrency.out @@ -1,15 +1,15 @@ -- test1: test gp_toolkit.gp_resgroup_status and pg_stat_activity -- create a resource group when gp_resource_manager is queue DROP ROLE IF EXISTS role_concurrency_test; -DROP +DROP ROLE -- start_ignore DROP RESOURCE GROUP rg_concurrency_test; ERROR: resource group "rg_concurrency_test" does not exist -- end_ignore CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=2, cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; -CREATE +CREATE ROLE -- no query has been assigned to the this group @@ -44,13 +44,13 @@ SELECT wait_event from pg_stat_activity where query = 'BEGIN;' and state = 'acti rg_concurrency_test (1 row) 2:END; -END +COMMIT 3:END; -END +COMMIT 4<: <... completed> BEGIN 4:END; -END +COMMIT 2q: ... 3q: ... 4q: ... @@ -60,24 +60,24 @@ SELECT r.rsgname, num_running, num_queueing, num_queued, num_executed FROM gp_to rg_concurrency_test | 0 | 0 | 1 | 3 (1 row) DROP ROLE role_concurrency_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_concurrency_test; -DROP +DROP RESOURCE GROUP -- test2: test alter concurrency -- Create a resource group with concurrency=2. Prepare 2 running transactions and 1 queueing transactions. -- Alter concurrency 2->3, the queueing transaction will be woken up, the 'value' of pg_resgroupcapability -- will be set to 3. DROP ROLE IF EXISTS role_concurrency_test; -DROP +DROP ROLE -- start_ignore DROP RESOURCE GROUP rg_concurrency_test; ERROR: resource group "rg_concurrency_test" does not exist -- end_ignore CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=2, cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; -CREATE +CREATE ROLE 12:SET ROLE role_concurrency_test; SET 12:BEGIN; @@ -101,7 +101,7 @@ SELECT concurrency FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_concur 2 (1 row) ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 3; -ALTER +ALTER RESOURCE GROUP SELECT r.rsgname, num_running, num_queueing, num_queued, num_executed FROM gp_toolkit.gp_resgroup_status s, pg_resgroup r WHERE s.groupid=r.oid AND r.rsgname='rg_concurrency_test'; rsgname | num_running | num_queueing | num_queued | num_executed ---------------------+-------------+--------------+------------+-------------- @@ -113,33 +113,33 @@ SELECT concurrency FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_concur 3 (1 row) 12:END; -END +COMMIT 13:END; -END +COMMIT 14<: <... completed> BEGIN 14:END; -END +COMMIT 12q: ... 13q: ... 14q: ... DROP ROLE role_concurrency_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_concurrency_test; -DROP +DROP RESOURCE GROUP -- test3: test alter concurrency -- Create a resource group with concurrency=3. Prepare 3 running transactions, and 1 queueing transaction. DROP ROLE IF EXISTS role_concurrency_test; -DROP +DROP ROLE -- start_ignore DROP RESOURCE GROUP rg_concurrency_test; ERROR: resource group "rg_concurrency_test" does not exist -- end_ignore CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=3, cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; -CREATE +CREATE ROLE 22:SET ROLE role_concurrency_test; SET 22:BEGIN; @@ -167,7 +167,7 @@ SELECT concurrency FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_concur (1 row) -- Alter concurrency 3->2, the 'value' of pg_resgroupcapability will be set to 2. ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 2; -ALTER +ALTER RESOURCE GROUP SELECT concurrency FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_concurrency_test'; concurrency ------------- @@ -175,7 +175,7 @@ SELECT concurrency FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_concur (1 row) -- When one transaction is finished, queueing transaction won't be woken up. There're 2 running transactions and 1 queueing transaction. 24:END; -END +COMMIT SELECT r.rsgname, num_running, num_queueing, num_queued, num_executed FROM gp_toolkit.gp_resgroup_status s, pg_resgroup r WHERE s.groupid=r.oid AND r.rsgname='rg_concurrency_test'; rsgname | num_running | num_queueing | num_queued | num_executed ---------------------+-------------+--------------+------------+-------------- @@ -190,7 +190,7 @@ SELECT r.rsgname, num_running, num_queueing, num_queued, num_executed FROM gp_to (1 row) -- Finish another transaction, one queueing transaction will be woken up, there're 2 running transactions and 1 queueing transaction. 22:END; -END +COMMIT SELECT r.rsgname, num_running, num_queueing, num_queued, num_executed FROM gp_toolkit.gp_resgroup_status s, pg_resgroup r WHERE s.groupid=r.oid AND r.rsgname='rg_concurrency_test'; rsgname | num_running | num_queueing | num_queued | num_executed ---------------------+-------------+--------------+------------+-------------- @@ -198,7 +198,7 @@ SELECT r.rsgname, num_running, num_queueing, num_queued, num_executed FROM gp_to (1 row) -- Alter concurrency 2->2, the 'value' of pg_resgroupcapability will be set to 2. ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 2; -ALTER +ALTER RESOURCE GROUP SELECT concurrency FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_concurrency_test'; concurrency ------------- @@ -206,7 +206,7 @@ SELECT concurrency FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_concur (1 row) -- Finish another transaction, one queueing transaction will be woken up, there're 2 running transactions and 0 queueing transaction. 23:END; -END +COMMIT SELECT r.rsgname, num_running, num_queueing, num_queued, num_executed FROM gp_toolkit.gp_resgroup_status s, pg_resgroup r WHERE s.groupid=r.oid AND r.rsgname='rg_concurrency_test'; rsgname | num_running | num_queueing | num_queued | num_executed ---------------------+-------------+--------------+------------+-------------- @@ -217,30 +217,30 @@ BEGIN 25<: <... completed> BEGIN 25:END; -END +COMMIT 24:END; -END +COMMIT 22q: ... 23q: ... 24q: ... 25q: ... DROP ROLE role_concurrency_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_concurrency_test; -DROP +DROP RESOURCE GROUP -- test4: concurrently drop resource group DROP ROLE IF EXISTS role_concurrency_test; -DROP +DROP ROLE -- start_ignore DROP RESOURCE GROUP rg_concurrency_test; ERROR: resource group "rg_concurrency_test" does not exist -- end_ignore CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=2, cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; -CREATE +CREATE ROLE -- DROP should fail if there're running transactions 32:SET ROLE role_concurrency_test; @@ -248,32 +248,32 @@ SET 32:BEGIN; BEGIN DROP ROLE role_concurrency_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_concurrency_test; ERROR: cannot drop resource group "rg_concurrency_test" HINT: The resource group is currently managing 1 query(ies) and cannot be dropped. Terminate the queries first or try dropping the group later. The view pg_stat_activity tracks the queries managed by resource groups. 32:END; -END +COMMIT DROP ROLE IF EXISTS role_concurrency_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_concurrency_test; -DROP +DROP RESOURCE GROUP -- test5: QD exit before QE DROP ROLE IF EXISTS role_concurrency_test; -DROP +DROP ROLE -- start_ignore DROP RESOURCE GROUP rg_concurrency_test; ERROR: resource group "rg_concurrency_test" does not exist -- end_ignore CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=1, cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; -CREATE +CREATE ROLE 51:SET ROLE role_concurrency_test; SET 51:BEGIN; @@ -299,22 +299,22 @@ ERROR: canceling statement due to user request 51q: ... 52q: ... DROP ROLE role_concurrency_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_concurrency_test; -DROP +DROP RESOURCE GROUP -- test6: cancel a query that is waiting for a slot DROP ROLE IF EXISTS role_concurrency_test; -DROP +DROP ROLE -- start_ignore DROP RESOURCE GROUP rg_concurrency_test; ERROR: resource group "rg_concurrency_test" does not exist -- end_ignore CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=1, cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; -CREATE +CREATE ROLE 51:SET ROLE role_concurrency_test; SET 51:BEGIN; @@ -327,23 +327,23 @@ SET BEGIN 52q: ... DROP ROLE role_concurrency_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_concurrency_test; -DROP +DROP RESOURCE GROUP -- test7: terminate a query that is waiting for a slot DROP ROLE IF EXISTS role_concurrency_test; -DROP +DROP ROLE -- start_ignore DROP RESOURCE GROUP rg_concurrency_test; ERROR: resource group "rg_concurrency_test" does not exist -- end_ignore CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=1, cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; -CREATE +CREATE ROLE 61:SET ROLE role_concurrency_test; SET 61:BEGIN; @@ -364,22 +364,22 @@ server closed the connection unexpectedly 61q: ... 62q: ... DROP ROLE role_concurrency_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_concurrency_test; -DROP +DROP RESOURCE GROUP -- test8: create a resgroup with concurrency=0 DROP ROLE IF EXISTS role_concurrency_test; -DROP +DROP ROLE -- start_ignore DROP RESOURCE GROUP rg_concurrency_test; ERROR: resource group "rg_concurrency_test" does not exist -- end_ignore CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=0, cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; -CREATE +CREATE ROLE 61:SET ROLE role_concurrency_test; SET 61&:BEGIN; @@ -392,34 +392,34 @@ SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE wait_event_type='Resou ERROR: canceling statement due to user request 61q: ... DROP ROLE role_concurrency_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_concurrency_test; -DROP +DROP RESOURCE GROUP -- -- Test cursors, pl/* functions only take one slot. -- -- set concurrency to 1 CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=1, cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test; -CREATE +CREATE ROLE -- declare cursors and verify that it only takes one resource group slot 71:SET ROLE TO role_concurrency_test; SET 71:CREATE TABLE foo_concurrency_test as select i as c1 , i as c2 from generate_series(1, 1000) i; -CREATE 1000 +SELECT 1000 71:CREATE TABLE bar_concurrency_test as select i as c1 , i as c2 from generate_series(1, 1000) i; -CREATE 1000 +SELECT 1000 71:BEGIN; BEGIN 71:DECLARE c1 CURSOR for select c1, c2 from foo_concurrency_test order by c1 limit 10; -DECLARE +DECLARE CURSOR 71:DECLARE c2 CURSOR for select c1, c2 from bar_concurrency_test order by c1 limit 10; -DECLARE +DECLARE CURSOR 71:DECLARE c3 CURSOR for select count(*) from foo_concurrency_test t1, bar_concurrency_test t2 where t1.c2 = t2.c2; -DECLARE +DECLARE CURSOR 71:Fetch ALL FROM c1; c1 | c2 ----+---- @@ -454,11 +454,11 @@ DECLARE 1000 (1 row) 71:END; -END +COMMIT -- create a pl function and verify that it only takes one resource group slot. CREATE OR REPLACE FUNCTION func_concurrency_test () RETURNS integer as /*in func*/ $$ /*in func*/ DECLARE /*in func*/ tmprecord RECORD; /*in func*/ ret integer; /*in func*/ BEGIN /*in func*/ SELECT count(*) INTO ret FROM foo_concurrency_test; /*in func*/ FOR tmprecord IN SELECT * FROM bar_concurrency_test LOOP /*in func*/ SELECT count(*) INTO ret FROM foo_concurrency_test; /*in func*/ END LOOP; /*in func*/ /*in func*/ select 1/0; /*in func*/ EXCEPTION /*in func*/ WHEN division_by_zero THEN /*in func*/ SELECT count(*) INTO ret FROM foo_concurrency_test; /*in func*/ raise NOTICE 'divided by zero'; /*in func*/ RETURN ret; /*in func*/ END; /*in func*/ $$ /*in func*/ LANGUAGE plpgsql; -CREATE +CREATE FUNCTION 71: select func_concurrency_test(); func_concurrency_test @@ -484,7 +484,7 @@ PREPARE 2 | 2 (1 row) 71:END; -END +COMMIT 71:PREPARE p3 (integer) as select * from foo_concurrency_test where c2=$1; PREPARE 71:PREPARE p4 (integer) as select * from bar_concurrency_test where c2=$1; @@ -501,10 +501,10 @@ PREPARE (1 row) DROP TABLE foo_concurrency_test; -DROP +DROP TABLE DROP TABLE bar_concurrency_test; -DROP +DROP TABLE DROP ROLE role_concurrency_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_concurrency_test; -DROP +DROP RESOURCE GROUP diff --git a/src/test/isolation2/expected/resgroup/resgroup_cpu_max_percent.out b/src/test/isolation2/expected/resgroup/resgroup_cpu_max_percent.out index ae21059fcb6..9c5c2d47741 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_cpu_max_percent.out +++ b/src/test/isolation2/expected/resgroup/resgroup_cpu_max_percent.out @@ -1,17 +1,17 @@ -- start_ignore DROP VIEW IF EXISTS cancel_all; -DROP +DROP VIEW DROP ROLE IF EXISTS role1_cpu_test; -DROP +DROP ROLE DROP ROLE IF EXISTS role2_cpu_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg1_cpu_test; ERROR: resource group "rg1_cpu_test" does not exist DROP RESOURCE GROUP rg2_cpu_test; ERROR: resource group "rg2_cpu_test" does not exist CREATE LANGUAGE plpython3u; -CREATE +ERROR: language "plpython3u" already exists -- end_ignore -- @@ -19,16 +19,16 @@ CREATE -- DROP TABLE IF EXISTS cpu_usage_samples; -DROP +DROP TABLE CREATE TABLE cpu_usage_samples (sample text); -CREATE +CREATE TABLE -- fetch_sample: select cpu_usage from gp_toolkit.gp_resgroup_status -- and dump them into text in json format then save them in db for -- further analysis. CREATE OR REPLACE FUNCTION fetch_sample() RETURNS text AS $$ import json group_cpus = plpy.execute(''' SELECT groupname, cpu_usage FROM gp_toolkit.gp_resgroup_status_per_host ''') plpy.notice(group_cpus) json_text = json.dumps(dict([(row['groupname'], float(row['cpu_usage'])) for row in group_cpus])) plpy.execute(''' INSERT INTO cpu_usage_samples VALUES ('{value}') '''.format(value=json_text)) return json_text $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION -- verify_cpu_usage: calculate each QE's average cpu usage using all the data in -- the table cpu_usage_sample. And compare the average value to the expected value. @@ -36,22 +36,22 @@ CREATE CREATE OR REPLACE FUNCTION verify_cpu_usage(groupname TEXT, expect_cpu_usage INT, err_rate INT) RETURNS BOOL AS $$ import json import functools all_info = plpy.execute(''' SELECT sample::json->'{name}' AS cpu FROM cpu_usage_samples '''.format(name=groupname)) usage = float(all_info[0]['cpu']) return abs(usage - expect_cpu_usage) <= err_rate $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION CREATE OR REPLACE FUNCTION busy() RETURNS void AS $$ import os import signal n = 15 for i in range(n): if os.fork() == 0: # children must quit without invoking the atexit hooks signal.signal(signal.SIGINT, lambda a, b: os._exit(0)) signal.signal(signal.SIGQUIT, lambda a, b: os._exit(0)) signal.signal(signal.SIGTERM, lambda a, b: os._exit(0)) # generate pure cpu load while True: pass os.wait() $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION CREATE VIEW cancel_all AS SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE query LIKE 'SELECT * FROM % WHERE busy%'; -CREATE +CREATE VIEW -- create two resource groups CREATE RESOURCE GROUP rg1_cpu_test WITH (concurrency=5, cpu_max_percent=-1, cpu_weight=100); -CREATE +CREATE RESOURCE GROUP CREATE RESOURCE GROUP rg2_cpu_test WITH (concurrency=5, cpu_max_percent=-1, cpu_weight=200); -CREATE +CREATE RESOURCE GROUP -- -- check gpdb cgroup configuration @@ -65,13 +65,13 @@ select check_cgroup_configuration(); -- lower admin_group's cpu_max_percent to minimize its side effect ALTER RESOURCE GROUP admin_group SET cpu_max_percent 1; -ALTER +ALTER RESOURCE GROUP -- create two roles and assign them to above groups CREATE ROLE role1_cpu_test RESOURCE GROUP rg1_cpu_test; -CREATE +CREATE ROLE CREATE ROLE role2_cpu_test RESOURCE GROUP rg2_cpu_test; -CREATE +CREATE ROLE GRANT ALL ON FUNCTION busy() TO role1_cpu_test; GRANT GRANT ALL ON FUNCTION busy() TO role2_cpu_test; @@ -115,7 +115,7 @@ SET -- start_ignore -- Gather CPU usage statistics into cpu_usage_samples TRUNCATE TABLE cpu_usage_samples; -TRUNCATE +TRUNCATE TABLE SELECT fetch_sample(); fetch_sample --------------------------------------------------------------------------------------------------------------- @@ -167,7 +167,7 @@ SELECT pg_sleep(1.7); (1 row) TRUNCATE TABLE cpu_usage_samples; -TRUNCATE +TRUNCATE TABLE SELECT fetch_sample(); fetch_sample --------------------------------------------------------------------------------------------------------------- @@ -290,7 +290,7 @@ SET -- start_ignore TRUNCATE TABLE cpu_usage_samples; -TRUNCATE +TRUNCATE TABLE SELECT fetch_sample(); fetch_sample ---------------------------------------------------------------------------------------------------------------- @@ -342,7 +342,7 @@ SELECT pg_sleep(1.7); (1 row) TRUNCATE TABLE cpu_usage_samples; -TRUNCATE +TRUNCATE TABLE SELECT fetch_sample(); fetch_sample ---------------------------------------------------------------------------------------------------------------- @@ -462,9 +462,9 @@ ERROR: canceling statement due to user request -- Test cpu max percent ALTER RESOURCE GROUP rg1_cpu_test set cpu_max_percent 10; -ALTER +ALTER RESOURCE GROUP ALTER RESOURCE GROUP rg2_cpu_test set cpu_max_percent 20; -ALTER +ALTER RESOURCE GROUP -- prepare parallel queries in the two groups 10: SET ROLE TO role1_cpu_test; @@ -509,7 +509,7 @@ SET -- start_ignore 1:TRUNCATE TABLE cpu_usage_samples; -TRUNCATE +TRUNCATE TABLE 1:SELECT fetch_sample(); fetch_sample --------------------------------------------------------------------------------------------------------------- @@ -685,7 +685,7 @@ SET -- start_ignore 1:TRUNCATE TABLE cpu_usage_samples; -TRUNCATE +TRUNCATE TABLE 1:SELECT fetch_sample(); fetch_sample ---------------------------------------------------------------------------------------------------------------- @@ -737,7 +737,7 @@ TRUNCATE (1 row) 1:TRUNCATE TABLE cpu_usage_samples; -TRUNCATE +TRUNCATE TABLE 1:SELECT fetch_sample(); fetch_sample --------------------------------------------------------------------------------------------------------------- @@ -857,7 +857,7 @@ ERROR: canceling statement due to user request -- restore admin_group's cpu_max_percent 2:ALTER RESOURCE GROUP admin_group SET cpu_max_percent 10; -ALTER +ALTER RESOURCE GROUP -- cleanup 2:REVOKE ALL ON FUNCTION busy() FROM role1_cpu_test; @@ -865,10 +865,10 @@ REVOKE 2:REVOKE ALL ON FUNCTION busy() FROM role2_cpu_test; REVOKE 2:DROP ROLE role1_cpu_test; -DROP +DROP ROLE 2:DROP ROLE role2_cpu_test; -DROP +DROP ROLE 2:DROP RESOURCE GROUP rg1_cpu_test; -DROP +DROP RESOURCE GROUP 2:DROP RESOURCE GROUP rg2_cpu_test; -DROP +DROP RESOURCE GROUP diff --git a/src/test/isolation2/expected/resgroup/resgroup_cpuset.out b/src/test/isolation2/expected/resgroup/resgroup_cpuset.out index 0ff087de3a6..6969d621422 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_cpuset.out +++ b/src/test/isolation2/expected/resgroup/resgroup_cpuset.out @@ -1,30 +1,30 @@ -- start_ignore DROP VIEW IF EXISTS busy; -DROP +DROP VIEW DROP VIEW IF EXISTS cancel_all; -DROP +DROP VIEW DROP TABLE IF EXISTS bigtable; -DROP +DROP TABLE CREATE LANGUAGE plpython3u; CREATE -- end_ignore CREATE TABLE bigtable AS SELECT i AS c1, 'abc' AS c2 FROM generate_series(1,50000) i; -CREATE 50000 +SELECT 50000 CREATE OR REPLACE FUNCTION get_cpu_cores() RETURNS INTEGER AS $$ import os return os.cpu_count() $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION -CREATE VIEW busy AS SELECT count(*) FROM bigtable t1, bigtable t2, bigtable t3, bigtable t4, bigtable t5 WHERE 0 != (t1.c1 % 2 + 10000) AND 0 != (t2.c1 % 2 + 10000) AND 0 != (t3.c1 % 2 + 10000) AND 0 != (t4.c1 % 2 + 10000) AND 0 != (t5.c1 % 2 + 10000) ; -CREATE +CREATE VIEW busy AS SELECT count(*) FROM bigtable t1, bigtable t2, bigtable t3, bigtable t4, bigtable t5 WHERE 0 = (t1.c1 % 2 + 10000)! AND 0 = (t2.c1 % 2 + 10000)! AND 0 = (t3.c1 % 2 + 10000)! AND 0 = (t4.c1 % 2 + 10000)! AND 0 = (t5.c1 % 2 + 10000)! ; +CREATE VIEW CREATE VIEW cancel_all AS SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE query LIKE 'SELECT * FROM busy%'; -CREATE +CREATE VIEW CREATE RESOURCE GROUP rg1_cpuset_test WITH (cpuset='0'); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role1_cpuset_test RESOURCE GROUP rg1_cpuset_test; -CREATE +CREATE ROLE GRANT ALL ON busy TO role1_cpuset_test; GRANT @@ -52,7 +52,7 @@ BEGIN (1 row) ALTER RESOURCE GROUP rg1_cpuset_test SET cpuset '1'; -ALTER +ALTER RESOURCE GROUP select pg_sleep(2); pg_sleep ---------- @@ -66,7 +66,7 @@ select pg_sleep(2); (1 row) ALTER RESOURCE GROUP rg1_cpuset_test SET cpuset '0,1'; -ALTER +ALTER RESOURCE GROUP select pg_sleep(2); pg_sleep ---------- @@ -79,11 +79,11 @@ select pg_sleep(2); t (1 row) 11: END; -END +COMMIT -- change to cpu_max_percent while the transaction is running ALTER RESOURCE GROUP rg1_cpuset_test SET cpu_max_percent 70; -ALTER +ALTER RESOURCE GROUP -- cancel the transaction -- start_ignore @@ -180,49 +180,49 @@ SELECT check_cpuset_rules(); t (1 row) CREATE RESOURCE GROUP rg1_test_group WITH (cpuset='0'); -CREATE +CREATE RESOURCE GROUP SELECT check_cpuset_rules(); check_cpuset_rules -------------------- t (1 row) CREATE RESOURCE GROUP rg2_test_group WITH (cpuset='1'); -CREATE +CREATE RESOURCE GROUP SELECT check_cpuset_rules(); check_cpuset_rules -------------------- t (1 row) ALTER RESOURCE GROUP rg1_test_group SET cpu_max_percent 1; -ALTER +ALTER RESOURCE GROUP SELECT check_cpuset_rules(); check_cpuset_rules -------------------- t (1 row) ALTER RESOURCE GROUP rg1_test_group SET cpuset '0'; -ALTER +ALTER RESOURCE GROUP SELECT check_cpuset_rules(); check_cpuset_rules -------------------- t (1 row) ALTER RESOURCE GROUP rg1_test_group SET cpu_max_percent 1; -ALTER +ALTER RESOURCE GROUP SELECT check_cpuset_rules(); check_cpuset_rules -------------------- t (1 row) DROP RESOURCE GROUP rg1_test_group; -DROP +DROP RESOURCE GROUP SELECT check_cpuset_rules(); check_cpuset_rules -------------------- t (1 row) DROP RESOURCE GROUP rg2_test_group; -DROP +DROP RESOURCE GROUP SELECT check_cpuset_rules(); check_cpuset_rules -------------------- @@ -241,7 +241,7 @@ SELECT check_cpuset_rules(); t (1 row) DROP RESOURCE GROUP rg1_test_group; -DROP +DROP RESOURCE GROUP SELECT check_cpuset_rules(); check_cpuset_rules -------------------- @@ -277,9 +277,9 @@ ERROR: resource group "rg1_test_group" does not exist -- test segment/master cpuset CREATE RESOURCE GROUP rg_multi_cpuset1 WITH (concurrency=2, cpuset='0;0'); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP rg_multi_cpuset1 set CPUSET '1;1'; -ALTER +ALTER RESOURCE GROUP select groupname,cpuset from gp_toolkit.gp_resgroup_config where groupname='rg_multi_cpuset1'; groupname | cpuset ------------------+-------- @@ -287,23 +287,23 @@ select groupname,cpuset from gp_toolkit.gp_resgroup_config where groupname='rg_m (1 row) DROP RESOURCE GROUP rg_multi_cpuset1; -DROP +DROP RESOURCE GROUP REVOKE ALL ON busy FROM role1_cpuset_test; REVOKE DROP ROLE role1_cpuset_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg1_cpuset_test; -DROP +DROP RESOURCE GROUP DROP FUNCTION check_cpuset_rules(); -DROP +DROP FUNCTION DROP FUNCTION check_cpuset(TEXT, TEXT); -DROP +DROP FUNCTION DROP FUNCTION create_allcores_group(TEXT); -DROP +DROP FUNCTION DROP VIEW cancel_all; -DROP +DROP VIEW DROP VIEW busy; -DROP +DROP VIEW DROP TABLE bigtable; -DROP +DROP TABLE diff --git a/src/test/isolation2/expected/resgroup/resgroup_cpuset_empty_default.out b/src/test/isolation2/expected/resgroup/resgroup_cpuset_empty_default.out index c84e98b5779..1ef006a10f6 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_cpuset_empty_default.out +++ b/src/test/isolation2/expected/resgroup/resgroup_cpuset_empty_default.out @@ -24,7 +24,7 @@ CREATE RESOURCE GROUP -- Alter a resource group from / to all the cpu cores should also work. ALTER RESOURCE GROUP rg1_cpuset_test SET cpuset '0'; -ALTER +ALTER RESOURCE GROUP ! psql -d isolation2resgrouptest -Ac "ALTER RESOURCE GROUP rg1_cpuset_test SET cpuset '0-$(($(nproc)-1))'"; ALTER RESOURCE GROUP @@ -35,4 +35,4 @@ ALTER RESOURCE GROUP -- Cleanup in a new connection as the default one is disconnected by gpstop 10: DROP RESOURCE GROUP rg1_cpuset_test; -DROP +DROP RESOURCE GROUP diff --git a/src/test/isolation2/expected/resgroup/resgroup_disable_resgroup.out b/src/test/isolation2/expected/resgroup/resgroup_disable_resgroup.out index ae3324c605d..1ccaf65d732 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_disable_resgroup.out +++ b/src/test/isolation2/expected/resgroup/resgroup_disable_resgroup.out @@ -13,6 +13,6 @@ SHOW gp_resource_manager; -- reset settings ALTER RESOURCE GROUP admin_group SET concurrency 10; -ALTER +ALTER RESOURCE GROUP ALTER RESOURCE GROUP default_group SET concurrency 20; -ALTER +ALTER RESOURCE GROUP diff --git a/src/test/isolation2/expected/resgroup/resgroup_dumpinfo.out b/src/test/isolation2/expected/resgroup/resgroup_dumpinfo.out index dc57a23fa17..c04ece07ef6 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_dumpinfo.out +++ b/src/test/isolation2/expected/resgroup/resgroup_dumpinfo.out @@ -1,7 +1,7 @@ DROP ROLE IF EXISTS role_dumpinfo_test; -DROP +DROP ROLE DROP ROLE IF EXISTS role_permission; -DROP +DROP ROLE -- start_ignore DROP RESOURCE GROUP rg_dumpinfo_test; ERROR: resource group "rg_dumpinfo_test" does not exist @@ -20,12 +20,12 @@ r = plpy.execute("select value from pg_resgroup_get_status_kv('dump');") json_te plpy.execute("""CREATE TEMPORARY TABLE t_pg_resgroup_get_status_kv AS SELECT * FROM pg_resgroup_get_status_kv('dump');""") r = plpy.execute("SELECT value FROM t_pg_resgroup_get_status_kv;") json_text = r[0]['value'] json_obj = json.loads(json_text) return validate(json_obj, n) $$ LANGUAGE plpython3u; -CREATE +CREATE FUNCTION CREATE RESOURCE GROUP rg_dumpinfo_test WITH (concurrency=2, cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_dumpinfo_test RESOURCE GROUP rg_dumpinfo_test; -CREATE +CREATE ROLE 2:SET ROLE role_dumpinfo_test; SET @@ -46,19 +46,19 @@ SELECT dump_test_check(); (1 row) 2:END; -END +COMMIT 3:END; -END +COMMIT 4<: <... completed> BEGIN 4:END; -END +COMMIT 2q: ... 3q: ... 4q: ... CREATE ROLE role_permission; -CREATE +CREATE ROLE SET ROLE role_permission; SET select value from pg_resgroup_get_status_kv('dump'); @@ -81,12 +81,10 @@ SELECT count(*) FROM pg_resgroup_get_status_kv(NULL); (1 row) DROP ROLE role_dumpinfo_test; -DROP +DROP ROLE DROP ROLE role_permission; -DROP +DROP ROLE DROP RESOURCE GROUP rg_dumpinfo_test; -DROP --- start_ignore +DROP RESOURCE GROUP DROP LANGUAGE plpython3u CASCADE; -DROP --- end_ignore +DROP LANGUAGE diff --git a/src/test/isolation2/expected/resgroup/resgroup_functions.out b/src/test/isolation2/expected/resgroup/resgroup_functions.out index 7835bb2f3a8..67a95310d2b 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_functions.out +++ b/src/test/isolation2/expected/resgroup/resgroup_functions.out @@ -5,10 +5,10 @@ SELECT s.groupid, s.num_running, s.num_queueing, s.num_queued, s.num_executed FR (0 rows) -- end_ignore CREATE TEMP TABLE resgroup_function_test(LIKE gp_toolkit.gp_resgroup_status); -CREATE +CREATE TABLE INSERT INTO resgroup_function_test(groupid, num_running, num_queueing, num_queued, num_executed) SELECT s.groupid, s.num_running, s.num_queueing, s.num_queued, s.num_executed FROM pg_resgroup_get_status(NULL::oid) s(groupid, num_running, num_queueing, num_queued, num_executed, total_queue_duration) LIMIT 1; -INSERT 1 +INSERT 0 1 SELECT count(num_executed)>0 FROM resgroup_function_test WHERE num_executed IS NOT NULL; ?column? diff --git a/src/test/isolation2/expected/resgroup/resgroup_large_group_id.out b/src/test/isolation2/expected/resgroup/resgroup_large_group_id.out index fc132ebd271..3f5b3aee71e 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_large_group_id.out +++ b/src/test/isolation2/expected/resgroup/resgroup_large_group_id.out @@ -6,7 +6,7 @@ select gp_inject_fault('bump_oid', 'skip', dbid) from gp_segment_configuration w (1 row) create resource group rg_large_oid with (cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP select gp_inject_fault('bump_oid', 'reset', dbid) from gp_segment_configuration where role = 'p' and content = -1; gp_inject_fault @@ -28,4 +28,4 @@ select count(*) > 0 from pg_resgroup_get_status(NULL); (1 row) drop resource group rg_large_oid; -DROP +DROP RESOURCE GROUP diff --git a/src/test/isolation2/expected/resgroup/resgroup_memory_limit.out b/src/test/isolation2/expected/resgroup/resgroup_memory_limit.out index 41a568503e0..fb270001fd6 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_memory_limit.out +++ b/src/test/isolation2/expected/resgroup/resgroup_memory_limit.out @@ -7,28 +7,20 @@ DROP RESOURCE GROUP rg_memory_test; -- create a pl function to show the memory used by a process CREATE OR REPLACE FUNCTION func_memory_test (text) RETURNS text as /*in func*/ $$ /*in func*/ DECLARE /*in func*/ ln text; /*in func*/ tmp text[]; /*in func*/ match bool := false; /*in func*/ BEGIN /*in func*/ FOR ln IN execute format('explain analyze %s', $1) LOOP /*in func*/ IF NOT match THEN /*in func*/ tmp := regexp_match(ln, 'Memory used: (.*)'); /*in func*/ IF tmp IS NOT null THEN /*in func*/ match := true; /*in func*/ END IF; /*in func*/ END IF; /*in func*/ END LOOP; /*in func*/ RETURN tmp[1]; /*in func*/ END; /*in func*/ $$ /*in func*/ LANGUAGE plpgsql; -CREATE - --- memory_quota range is [0, INT_MAX] or equals to -1 -CREATE RESOURCE GROUP rg_memory_range WITH(memory_quota=-100, cpu_max_percent=20, concurrency=2); -ERROR: memory_quota range is [0, INT_MAX] or equals to -1 -CREATE RESOURCE GROUP rg_memory_range WITH(memory_quota=-1, cpu_max_percent=20, concurrency=2); -CREATE RESOURCE GROUP -DROP RESOURCE GROUP rg_memory_range; -DROP RESOURCE GROUP +CREATE FUNCTION -- create a resource group with memory limit 100 Mb -CREATE RESOURCE GROUP rg_memory_test WITH(memory_quota=100, cpu_max_percent=20, concurrency=2); -CREATE +CREATE RESOURCE GROUP rg_memory_test WITH(memory_limit=100, cpu_max_percent=20, concurrency=2); +CREATE RESOURCE GROUP CREATE ROLE role_memory_test RESOURCE GROUP rg_memory_test; -CREATE +CREATE ROLE -- session1: explain memory used by query -- user requests less than statement_mem, set query's memory limit to statement_mem 1: SET ROLE TO role_memory_test; SET 1: CREATE TABLE t_memory_limit(a int); -CREATE +CREATE TABLE 1: BEGIN; BEGIN 1: SHOW statement_mem; @@ -42,9 +34,9 @@ BEGIN 256000kB (1 row) --- session2: test alter resource group's memory quota -2: ALTER RESOURCE GROUP rg_memory_test SET memory_quota 1000; -ALTER +-- session2: test alter resource group's memory limit +2: ALTER RESOURCE GROUP rg_memory_test SET memory_limit 1000; +ALTER RESOURCE GROUP -- memory used will grow up to 500 Mb 1: SELECT func_memory_test('SELECT * FROM t_memory_limit'); @@ -53,7 +45,7 @@ ALTER 512000kB (1 row) 1: END; -END +COMMIT -- set gp_resgroup_memory_query_fixed_mem to 200MB 1: SET gp_resgroup_memory_query_fixed_mem to 204800; SET @@ -79,10 +71,10 @@ ERROR: Invalid input for gp_resgroup_memory_query_fixed_mem, must be less than -- clean DROP FUNCTION func_memory_test(text); -DROP +DROP FUNCTION DROP TABLE t_memory_limit; -DROP +DROP TABLE DROP ROLE IF EXISTS role_memory_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_memory_test; -DROP +DROP RESOURCE GROUP diff --git a/src/test/isolation2/expected/resgroup/resgroup_move_query.out b/src/test/isolation2/expected/resgroup/resgroup_move_query.out index 720f8491d6e..8fafc13449b 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_move_query.out +++ b/src/test/isolation2/expected/resgroup/resgroup_move_query.out @@ -21,9 +21,9 @@ CREATE -- end_ignore DROP ROLE IF EXISTS role_move_query; -DROP +DROP ROLE DROP ROLE IF EXISTS role_move_query_small; -DROP +DROP ROLE -- start_ignore DROP RESOURCE GROUP rg_move_query; ERROR: resource group "rg_move_query" does not exist @@ -32,16 +32,16 @@ ERROR: resource group "rg_move_query_small" does not exist -- end_ignore CREATE RESOURCE GROUP rg_move_query WITH (concurrency=1, cpu_max_percent=20); -CREATE +CREATE RESOURCE GROUP CREATE RESOURCE GROUP rg_move_query_small WITH (concurrency=1, cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_move_query RESOURCE GROUP rg_move_query; -CREATE +CREATE ROLE CREATE ROLE role_move_query_small RESOURCE GROUP rg_move_query_small; -CREATE +CREATE ROLE CREATE EXTENSION IF NOT EXISTS gp_inject_fault; -CREATE +CREATE EXTENSION @@ -74,11 +74,11 @@ SELECT is_session_in_group(pid, 'default_group') FROM pg_stat_activity WHERE wai f (1 row) 1: END; -END +COMMIT 2<: <... completed> BEGIN 2: END; -END +COMMIT -- test3: the destination group will wake up 'pg_resgroup_move_query' when a new slot become available 1: SET ROLE role_move_query; @@ -140,7 +140,7 @@ BEGIN (1 row) 2&: SELECT pg_resgroup_move_query(pid, 'rg_move_query') FROM pg_stat_activity WHERE query LIKE '%pg_class%' AND rsgname='rg_move_query_small'; 1: END; -END +COMMIT 1: SELECT gp_wait_until_triggered_fault('resource_group_give_away_begin', 1, dbid) FROM gp_segment_configuration where role = 'p' and content = -1; gp_wait_until_triggered_fault ------------------------------- @@ -185,7 +185,7 @@ BEGIN (1 row) 2&: SELECT pg_resgroup_move_query(pid, 'rg_move_query') FROM pg_stat_activity WHERE query LIKE '%pg_class%' AND rsgname='rg_move_query_small'; 1: END; -END +COMMIT 1q: ... 3: SELECT gp_wait_until_triggered_fault('resource_group_give_away_begin', 1, dbid) FROM gp_segment_configuration where role = 'p' and content = -1; gp_wait_until_triggered_fault @@ -289,7 +289,7 @@ ERROR: canceling statement due to user request 1 (1 row) 1: END; -END +COMMIT 2: SELECT num_running FROM gp_toolkit.gp_resgroup_status WHERE groupname='rg_move_query'; num_running ------------- @@ -386,7 +386,7 @@ RESET f (1 row) 1: END; -END +COMMIT 3: SELECT num_running FROM gp_toolkit.gp_resgroup_status WHERE groupname='rg_move_query'; num_running ------------- @@ -445,7 +445,7 @@ ERROR: cannot send signal to process t (1 row) 1: END; -END +COMMIT 3: SELECT num_running FROM gp_toolkit.gp_resgroup_status WHERE groupname='rg_move_query'; num_running ------------- @@ -496,7 +496,7 @@ RESET 0 (1 row) 1: END; -END +COMMIT -- Test10: check entrydb queries working -- Previously, we sent a signal to only one process - dispatcher or entrydb. @@ -547,13 +547,13 @@ BEGIN t (1 row) 1: END; -END +COMMIT DROP ROLE role_move_query; -DROP +DROP ROLE DROP RESOURCE GROUP rg_move_query; -DROP +DROP RESOURCE GROUP DROP ROLE role_move_query_small; -DROP +DROP ROLE DROP RESOURCE GROUP rg_move_query_small; -DROP +DROP RESOURCE GROUP diff --git a/src/test/isolation2/expected/resgroup/resgroup_name_convention.out b/src/test/isolation2/expected/resgroup/resgroup_name_convention.out index 9f200bb2beb..a54b7df8ff9 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_name_convention.out +++ b/src/test/isolation2/expected/resgroup/resgroup_name_convention.out @@ -19,7 +19,7 @@ -- CREATE OR REPLACE VIEW rg_name_view AS SELECT S.groupname, C.concurrency FROM gp_toolkit.gp_resgroup_config C, gp_toolkit.gp_resgroup_status S WHERE C.groupid = S.groupid AND C.groupname != 'default_group' AND C.groupname != 'admin_group' AND C.groupname != 'system_group' ORDER BY C.groupid; -CREATE +CREATE VIEW -- TODO: need to cleanup all existing resgroups @@ -29,65 +29,65 @@ CREATE -- by default resgroup names have the form of [_a-zA-Z][_a-zA-Z0-9]* CREATE RESOURCE GROUP rgNameTest01 WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP rgNameTest01 SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency --------------+------------- rgnametest01 | 2 (1 row) DROP RESOURCE GROUP rgNameTest01; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP __rg_name_test_01__ WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP __rg_name_test_01__ SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency ---------------------+------------- __rg_name_test_01__ | 2 (1 row) DROP RESOURCE GROUP __rg_name_test_01__; -DROP +DROP RESOURCE GROUP -- min length is 1 character CREATE RESOURCE GROUP Z WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP DROP RESOURCE GROUP Z; -DROP +DROP RESOURCE GROUP -- max length is 63 characters CREATE RESOURCE GROUP max012345678901234567890123456789012345678901234567890123456789 WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP max012345678901234567890123456789012345678901234567890123456789 SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency -----------------------------------------------------------------+------------- max012345678901234567890123456789012345678901234567890123456789 | 2 (1 row) DROP RESOURCE GROUP max012345678901234567890123456789012345678901234567890123456789; -DROP +DROP RESOURCE GROUP -- characters exceed the max length are ignored CREATE RESOURCE GROUP max012345678901234567890123456789012345678901234567890123456789further WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP max012345678901234567890123456789012345678901234567890123456789are SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency -----------------------------------------------------------------+------------- max012345678901234567890123456789012345678901234567890123456789 | 2 (1 row) DROP RESOURCE GROUP max012345678901234567890123456789012345678901234567890123456789ignored; -DROP +DROP RESOURCE GROUP -- special characters are allowed with double quotation marks -- white spaces CREATE RESOURCE GROUP "newlines s p a c e s t a b s" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP "newlines s p a c e s t a b s" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency ------------------------------+------------- @@ -96,92 +96,92 @@ s p a c e s t a b s | 2 (1 row) DROP RESOURCE GROUP "newlines s p a c e s t a b s"; -DROP +DROP RESOURCE GROUP -- punctuations CREATE RESOURCE GROUP "!#$%&`()*+,-./:;<=>?@[]^_{|}~" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP "!#$%&`()*+,-./:;<=>?@[]^_{|}~" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency -------------------------------+------------- !#$%&`()*+,-./:;<=>?@[]^_{|}~ | 2 (1 row) DROP RESOURCE GROUP "!#$%&`()*+,-./:;<=>?@[]^_{|}~"; -DROP +DROP RESOURCE GROUP -- quotation marks CREATE RESOURCE GROUP "'' are 2 single quotation marks" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP "'' are 2 single quotation marks" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency ---------------------------------+------------- '' are 2 single quotation marks | 2 (1 row) DROP RESOURCE GROUP "'' are 2 single quotation marks"; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP """ is 1 double quotation mark" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP """ is 1 double quotation mark" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency ------------------------------+------------- " is 1 double quotation mark | 2 (1 row) DROP RESOURCE GROUP """ is 1 double quotation mark"; -DROP +DROP RESOURCE GROUP -- nothing special with leading character CREATE RESOURCE GROUP "0 as prefix" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP "0 as prefix" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency -------------+------------- 0 as prefix | 2 (1 row) DROP RESOURCE GROUP "0 as prefix"; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP " leading space" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP " leading space" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency ----------------+------------- leading space | 2 (1 row) DROP RESOURCE GROUP " leading space"; -DROP +DROP RESOURCE GROUP -- backslash is not used as the escape character CREATE RESOURCE GROUP "\\ are two backslashes" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP "\\ are two backslashes" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency ------------------------+------------- \\ are two backslashes | 2 (1 row) DROP RESOURCE GROUP "\\ are two backslashes"; -DROP +DROP RESOURCE GROUP -- below are octal, hex and unicode representations of "rg1" CREATE RESOURCE GROUP "\o162\o147\o61" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP CREATE RESOURCE GROUP "\x72\x67\x31" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP CREATE RESOURCE GROUP "\u0072\u0067\u0031" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP "\o162\o147\o61" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP ALTER RESOURCE GROUP "\x72\x67\x31" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP ALTER RESOURCE GROUP "\u0072\u0067\u0031" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency --------------------+------------- @@ -195,84 +195,84 @@ SELECT * FROM rg_name_view; DROP RESOURCE GROUP "rg1"; ERROR: resource group "rg1" does not exist DROP RESOURCE GROUP "\o162\o147\o61"; -DROP +DROP RESOURCE GROUP DROP RESOURCE GROUP "\x72\x67\x31"; -DROP +DROP RESOURCE GROUP DROP RESOURCE GROUP "\u0072\u0067\u0031"; -DROP +DROP RESOURCE GROUP -- unicode escapes are supported CREATE RESOURCE GROUP U&"\0441\043B\043E\043D" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP U&"\0441\043B\043E\043D" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency -----------+------------- слон | 2 (1 row) DROP RESOURCE GROUP U&"\0441\043B\043E\043D"; -DROP +DROP RESOURCE GROUP -- unicode representation of "rg1" CREATE RESOURCE GROUP U&"\0072\0067\0031" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP "rg1" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency -----------+------------- rg1 | 2 (1 row) DROP RESOURCE GROUP "rg1"; -DROP +DROP RESOURCE GROUP -- CJK characters are allowed with or without double quotation marks CREATE RESOURCE GROUP 资源组 WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP "资源组" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency -----------+------------- 资源组 | 2 (1 row) DROP RESOURCE GROUP 资源组; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP リソース・グループ WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP "リソース・グループ" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency -----------+------------- リソース・グループ | 2 (1 row) DROP RESOURCE GROUP リソース・グループ; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP 자원그룹 WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP "자원그룹" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency -----------+------------- 자원그룹 | 2 (1 row) DROP RESOURCE GROUP 자원그룹; -DROP +DROP RESOURCE GROUP -- names are case sensitive, -- but are always converted to lower case unless around with quotation marks CREATE RESOURCE GROUP "RG_NAME_TEST" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP CREATE RESOURCE GROUP rg_Name_Test WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP CREATE RESOURCE GROUP "rg_name_test" WITH (cpu_max_percent=10); ERROR: resource group "rg_name_test" already exists ALTER RESOURCE GROUP Rg_NaMe_TeSt SET concurrency 2; -ALTER +ALTER RESOURCE GROUP ALTER RESOURCE GROUP "RG_NAME_TEST" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency --------------+------------- @@ -280,101 +280,101 @@ SELECT * FROM rg_name_view; rg_name_test | 2 (2 rows) DROP RESOURCE GROUP "RG_NAME_TEST"; -DROP +DROP RESOURCE GROUP DROP RESOURCE GROUP RG_nAME_tEST; -DROP +DROP RESOURCE GROUP -- reserved names are all lower case: "default_group", "admin_group", "none", -- they can be used by users with at least one upper case character. CREATE RESOURCE GROUP "None" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP "None" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency -----------+------------- None | 2 (1 row) DROP RESOURCE GROUP "None"; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP "NONE" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP "NONE" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency -----------+------------- NONE | 2 (1 row) DROP RESOURCE GROUP "NONE"; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP "DEFAULT_GROup" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP "DEFAULT_GROup" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency ---------------+------------- DEFAULT_GROup | 2 (1 row) DROP RESOURCE GROUP "DEFAULT_GROup"; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP "ADMIN_GROUP" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP "ADMIN_GROUP" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency -------------+------------- ADMIN_GROUP | 2 (1 row) DROP RESOURCE GROUP "ADMIN_GROUP"; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP "with" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP "with" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency -----------+------------- with | 2 (1 row) DROP RESOURCE GROUP "with"; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP "WITH" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP "WITH" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency -----------+------------- WITH | 2 (1 row) DROP RESOURCE GROUP "WITH"; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP "group" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP "group" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency -----------+------------- group | 2 (1 row) DROP RESOURCE GROUP "group"; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP "create" WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP "create" SET concurrency 2; -ALTER +ALTER RESOURCE GROUP SELECT * FROM rg_name_view; groupname | concurrency -----------+------------- create | 2 (1 row) DROP RESOURCE GROUP "create"; -DROP +DROP RESOURCE GROUP -- -- negative diff --git a/src/test/isolation2/expected/resgroup/resgroup_recreate.out b/src/test/isolation2/expected/resgroup/resgroup_recreate.out index 3c7ea9cb814..edd0dfbd024 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_recreate.out +++ b/src/test/isolation2/expected/resgroup/resgroup_recreate.out @@ -1,37 +1,37 @@ -- start_ignore DROP ROLE IF EXISTS r1; -DROP +DROP ROLE DROP RESOURCE GROUP rg1; ERROR: resource group "rg1" does not exist -- end_ignore CREATE RESOURCE GROUP rg1 WITH (concurrency=2, cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP CREATE ROLE r1 RESOURCE GROUP rg1; -CREATE +CREATE ROLE 1: SET ROLE r1; SET 1: BEGIN; BEGIN 1: END; -END +COMMIT ALTER ROLE r1 RESOURCE GROUP none; -ALTER +ALTER ROLE DROP RESOURCE GROUP rg1; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP rg1 WITH (concurrency=2, cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER ROLE r1 RESOURCE GROUP rg1; -ALTER +ALTER ROLE 1: BEGIN; BEGIN 1: END; -END +COMMIT DROP ROLE r1; -DROP +DROP ROLE DROP RESOURCE GROUP rg1; -DROP +DROP RESOURCE GROUP diff --git a/src/test/isolation2/expected/resgroup/resgroup_seg_down_2pc.out b/src/test/isolation2/expected/resgroup/resgroup_seg_down_2pc.out index 560444f0671..d657d9f37bd 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_seg_down_2pc.out +++ b/src/test/isolation2/expected/resgroup/resgroup_seg_down_2pc.out @@ -4,12 +4,15 @@ -- The expectation is "alter resource group" can run successfully since the mirror segment is UP. -- After recover the segment, there is no error or blocking. +create extension if not exists gp_inject_fault; +CREATE EXTENSION + -- set these values purely to cut down test time, as default fts trigger is -- every min and 5 retries alter system set gp_fts_probe_interval to 10; -ALTER +ALTER SYSTEM alter system set gp_fts_probe_retries to 0; -ALTER +ALTER SYSTEM select pg_reload_conf(); pg_reload_conf ---------------- @@ -17,7 +20,7 @@ select pg_reload_conf(); (1 row) 1:create resource group rgroup_seg_down with (cpu_max_percent=35, CONCURRENCY=10); -CREATE +CREATE RESOURCE GROUP -- inject an error in function dtm_broadcast_commit_prepared, that is before QD broadcasts commit prepared command to QEs 2:select gp_inject_fault_infinite('dtm_broadcast_commit_prepared', 'suspend', dbid) from gp_segment_configuration where role='p' and content=-1; @@ -58,7 +61,7 @@ CREATE Success: (2 rows) 1<: <... completed> -ALTER +ALTER RESOURCE GROUP -- make sure "alter resource group" has taken effect. 1:select concurrency from gp_toolkit.gp_resgroup_config where groupname = 'rgroup_seg_down'; concurrency @@ -105,12 +108,12 @@ ALTER 20 (1 row) 1:drop resource group rgroup_seg_down; -DROP +DROP RESOURCE GROUP 1:alter system reset gp_fts_probe_interval; -ALTER +ALTER SYSTEM 1:alter system reset gp_fts_probe_retries; -ALTER +ALTER SYSTEM 1:select pg_reload_conf(); pg_reload_conf ---------------- diff --git a/src/test/isolation2/expected/resgroup/resgroup_syntax.out b/src/test/isolation2/expected/resgroup/resgroup_syntax.out index 1b645564f2d..bd6bd8234df 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_syntax.out +++ b/src/test/isolation2/expected/resgroup/resgroup_syntax.out @@ -3,32 +3,32 @@ -- ---------------------------------------------------------------------- DROP ROLE IF EXISTS rg_test_role; -DROP +DROP ROLE -- positive CREATE ROLE rg_test_role; -CREATE +CREATE ROLE SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role'; rolresgroup ------------- 6437 (1 row) CREATE ROLE rg_test_role_super SUPERUSER; -CREATE +CREATE ROLE SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role_super'; rolresgroup ------------- 6438 (1 row) ALTER ROLE rg_test_role_super NOSUPERUSER; -ALTER +ALTER ROLE SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role_super'; rolresgroup ------------- 6437 (1 row) ALTER ROLE rg_test_role_super SUPERUSER; -ALTER +ALTER ROLE SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role_super'; rolresgroup ------------- @@ -36,14 +36,14 @@ SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role_super'; (1 row) ALTER ROLE rg_test_role RESOURCE GROUP none; -ALTER +ALTER ROLE SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role'; rolresgroup ------------- 6437 (1 row) ALTER ROLE rg_test_role_super RESOURCE GROUP none; -ALTER +ALTER ROLE SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role_super'; rolresgroup ------------- @@ -51,14 +51,14 @@ SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role_super'; (1 row) ALTER ROLE rg_test_role RESOURCE GROUP default_group; -ALTER +ALTER ROLE SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role'; rolresgroup ------------- 6437 (1 row) ALTER ROLE rg_test_role_super RESOURCE GROUP admin_group; -ALTER +ALTER ROLE SELECT rolresgroup FROM pg_authid WHERE rolname = 'rg_test_role_super'; rolresgroup ------------- @@ -76,7 +76,7 @@ ERROR: only superuser can be assigned to admin resgroup CREATE ROLE r_test_system_group RESOURCE GROUP system_group; ERROR: assigning to system resgroup is not allowed CREATE ROLE r_test_system_group; -CREATE +CREATE ROLE ALTER ROLE r_test_system_group RESOURCE GROUP system_group; ERROR: assigning to system resgroup is not allowed @@ -88,11 +88,11 @@ ERROR: only superuser can be assigned to admin resgroup -- cleanup DROP ROLE rg_test_role; -DROP +DROP ROLE DROP ROLE rg_test_role_super; -DROP +DROP ROLE DROP ROLE r_test_system_group; -DROP +DROP ROLE -- ---------------------------------------------------------------------- -- Test: create/drop a resource group @@ -123,11 +123,11 @@ ERROR: resource group name "none" is reserved -- multiple resource groups can't share the same name CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=10); ERROR: resource group "rg_test_group" already exists DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP -- can't specify the resource limit type multiple times CREATE RESOURCE GROUP rg_test_group WITH (concurrency=1, cpu_max_percent=5, concurrency=1); @@ -180,7 +180,7 @@ CREATE RESOURCE GROUP rg_test_group WITH (cpuset='0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, ERROR: the length of cpuset reached the upper limit 1024 -- can't alter to invalid cpuset CREATE RESOURCE GROUP rg_test_group WITH (cpuset='0'); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP rg_test_group set CPUSET ''; ERROR: cpuset invalid ALTER RESOURCE GROUP rg_test_group set CPUSET ','; @@ -219,7 +219,7 @@ ERROR: cpu cores 1024 are unavailable on the system ALTER RESOURCE GROUP rg_test_group set CPUSET '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'; ERROR: the length of cpuset reached the upper limit 1024 DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP -- can't drop non-exist resource group DROP RESOURCE GROUP non_exist_group; ERROR: resource group "non_exist_group" does not exist @@ -235,68 +235,68 @@ ERROR: resource group "none" does not exist -- positive CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP SELECT groupname,concurrency,cpu_max_percent, cpu_weight FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; groupname | concurrency | cpu_max_percent | cpu_weight ---------------+-------------+-----------------+------------ rg_test_group | 20 | 10 | 100 (1 row) DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP rg_test_group WITH (concurrency=1, cpuset='0'); -CREATE +CREATE RESOURCE GROUP SELECT groupname,concurrency,cpu_max_percent, cpu_weight FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; groupname | concurrency | cpu_max_percent | cpu_weight ---------------+-------------+-----------------+------------ rg_test_group | 1 | -1 | 100 (1 row) DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=10, cpu_weight=500); -CREATE +CREATE RESOURCE GROUP SELECT groupname,concurrency,cpu_max_percent, cpu_weight FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; groupname | concurrency | cpu_max_percent | cpu_weight ---------------+-------------+-----------------+------------ rg_test_group | 20 | 10 | 500 (1 row) DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=-1, cpu_weight=500); -CREATE +CREATE RESOURCE GROUP SELECT groupname,concurrency,cpu_max_percent, cpu_weight FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; groupname | concurrency | cpu_max_percent | cpu_weight ---------------+-------------+-----------------+------------ rg_test_group | 20 | -1 | 500 (1 row) DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP rg_test_group WITH (cpuset='0', cpu_weight=500); -CREATE +CREATE RESOURCE GROUP SELECT groupname,concurrency,cpu_max_percent, cpu_weight FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; groupname | concurrency | cpu_max_percent | cpu_weight ---------------+-------------+-----------------+------------ rg_test_group | 20 | -1 | 500 (1 row) DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP rg_test_group WITH (cpuset='0'); -CREATE +CREATE RESOURCE GROUP SELECT groupname,concurrency,cpu_max_percent,cpu_weight FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; groupname | concurrency | cpu_max_percent | cpu_weight ---------------+-------------+-----------------+------------ rg_test_group | 20 | -1 | 100 (1 row) DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP rg_test_group WITH (cpuset='0;0-1'); -CREATE +CREATE RESOURCE GROUP SELECT groupname,concurrency,cpu_max_percent,cpu_weight,cpuset FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; groupname | concurrency | cpu_max_percent | cpu_weight | cpuset ---------------+-------------+-----------------+------------+-------- rg_test_group | 20 | -1 | 100 | 0;0-1 (1 row) DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP -- ---------------------------------------------------------------------- -- Test: boundary check in create resource group syntax -- ---------------------------------------------------------------------- @@ -315,11 +315,11 @@ ERROR: concurrency range is [0, 'max_connections'] -- negative: the cores of cpuset in different groups mustn't overlap CREATE RESOURCE GROUP rg_test_group1 WITH (cpuset='0'); -CREATE +CREATE RESOURCE GROUP CREATE RESOURCE GROUP rg_test_group2 WITH (cpuset='0'); ERROR: cpu cores 0 are used by resource group rg_test_group1 DROP RESOURCE GROUP rg_test_group1; -DROP +DROP RESOURCE GROUP -- negative: cpu_weight should be in [1, 500] CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=10, cpu_weight=0); @@ -333,63 +333,63 @@ ERROR: cpu_weight range is [1, 500] -- positive: cpu_max_percent should be in [1, 100] CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=60); -CREATE +CREATE RESOURCE GROUP DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=1); -CREATE +CREATE RESOURCE GROUP DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP -- positive: cpu_weight should be in [1, 500] CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=10, cpu_weight=100); -CREATE +CREATE RESOURCE GROUP DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=10, cpu_weight=500); -CREATE +CREATE RESOURCE GROUP DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP -- positive: concurrency should be in [0, max_connections] CREATE RESOURCE GROUP rg_test_group WITH (concurrency=0, cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP rg_test_group WITH (concurrency=1, cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP rg_test_group WITH (concurrency=25, cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP rg1_test_group WITH (concurrency=1, cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP CREATE RESOURCE GROUP rg2_test_group WITH (concurrency=1, cpu_max_percent=500); ERROR: cpu_max_percent range is [1, 100] or equals to -1 DROP RESOURCE GROUP rg1_test_group; -DROP +DROP RESOURCE GROUP DROP RESOURCE GROUP rg2_test_group; ERROR: resource group "rg2_test_group" does not exist -- positive: min_cost should be in [0,INT32_MAX] CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=10, min_cost=0); -CREATE +CREATE RESOURCE GROUP CREATE RESOURCE GROUP rg1_test_group WITH (cpu_max_percent=10, min_cost=2147483647); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP rg_test_group SET min_cost 2147483647; -ALTER +ALTER RESOURCE GROUP ALTER RESOURCE GROUP rg1_test_group SET min_cost 0; -ALTER +ALTER RESOURCE GROUP DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP DROP RESOURCE GROUP rg1_test_group; -DROP +DROP RESOURCE GROUP -- negative: min_cost should be in [0,INT32_MAX] CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=10, min_cost=-1); @@ -397,7 +397,7 @@ ERROR: The min_cost value can't be less than 0. CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=10, min_cost=2147483648); ERROR: capability min_cost is out of range CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=10, min_cost=0); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP rg_test_group SET min_cost -1; ERROR: The min_cost value can't be less than 0. ALTER RESOURCE GROUP rg_test_group SET min_cost 2147483648; @@ -405,14 +405,14 @@ ERROR: syntax error at or near "2147483648" LINE 1: ALTER RESOURCE GROUP rg_test_group SET min_cost 2147483648; ^ DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP -- -- ---------------------------------------------------------------------- -- Test: alter a resource group -- ---------------------------------------------------------------------- CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=5); -CREATE +CREATE RESOURCE GROUP -- ALTER RESOURCE GROUP SET CONCURRENCY N -- negative: concurrency should be in [1, max_connections] @@ -444,13 +444,13 @@ LINE 1: ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY '1'; ^ -- positive: concurrency should be in [1, max_connections] ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 0; -ALTER +ALTER RESOURCE GROUP ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 1; -ALTER +ALTER RESOURCE GROUP ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 2; -ALTER +ALTER RESOURCE GROUP ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 25; -ALTER +ALTER RESOURCE GROUP -- ALTER RESOURCE GROUP SET cpu_max_percent VALUE -- negative: cpu_max_percent should be in [1, 100] @@ -459,7 +459,7 @@ ERROR: syntax error at or near "0.1" LINE 1: ALTER RESOURCE GROUP rg_test_group SET cpu_max_percent -0.1; ^ ALTER RESOURCE GROUP rg_test_group SET cpu_max_percent -1; -ALTER +ALTER RESOURCE GROUP ALTER RESOURCE GROUP rg_test_group SET cpu_max_percent 0; ERROR: cpu_max_percent range is [1, 100] or equals to -1 ALTER RESOURCE GROUP rg_test_group SET cpu_max_percent 0.7; @@ -471,7 +471,7 @@ ERROR: syntax error at or near "1.7" LINE 1: ALTER RESOURCE GROUP rg_test_group SET cpu_max_percent 1.7; ^ ALTER RESOURCE GROUP rg_test_group SET cpu_max_percent 61; -ALTER +ALTER RESOURCE GROUP ALTER RESOURCE GROUP rg_test_group SET cpu_max_percent a; ERROR: syntax error at or near "a" LINE 1: ALTER RESOURCE GROUP rg_test_group SET cpu_max_percent a; @@ -490,35 +490,35 @@ LINE 1: ALTER RESOURCE GROUP rg_test_group SET cpu_max_percent 0.2%; ^ -- positive: cpu_max_percent should be in [1, 100] ALTER RESOURCE GROUP rg_test_group SET cpu_max_percent 1; -ALTER +ALTER RESOURCE GROUP ALTER RESOURCE GROUP rg_test_group SET cpu_max_percent 2; -ALTER +ALTER RESOURCE GROUP ALTER RESOURCE GROUP rg_test_group SET cpu_max_percent 60; -ALTER +ALTER RESOURCE GROUP DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP -- positive: cpuset and cpu_max_percent are exclusive, -- if cpu_max_percent is set, cpuset is empty -- if cpuset is set, cpuset is -1 CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP ALTER RESOURCE GROUP rg_test_group SET CPUSET '0'; -ALTER +ALTER RESOURCE GROUP SELECT groupname,cpu_max_percent,cpuset FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; groupname | cpu_max_percent | cpuset ---------------+-----------------+-------- rg_test_group | -1 | 0 (1 row) ALTER RESOURCE GROUP rg_test_group SET cpu_max_percent 10; -ALTER +ALTER RESOURCE GROUP SELECT groupname,cpu_max_percent,cpuset FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; groupname | cpu_max_percent | cpuset ---------------+-----------------+-------- rg_test_group | 10 | -1 (1 row) DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=10, concurrency=5); CREATE @@ -569,11 +569,11 @@ DROP (exited with code 0) -- end_ignore 0: CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP 0: ALTER RESOURCE GROUP rg_test_group SET cpu_max_percent 100; -ALTER +ALTER RESOURCE GROUP 0: DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP -- start_ignore !\retcode gpconfig -c gp_resource_group_cpu_limit -v 1; -- start_ignore diff --git a/src/test/isolation2/expected/resgroup/resgroup_transaction.out b/src/test/isolation2/expected/resgroup/resgroup_transaction.out index baad66ef535..72555b37214 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_transaction.out +++ b/src/test/isolation2/expected/resgroup/resgroup_transaction.out @@ -9,7 +9,7 @@ ERROR: resource group "rg_test_group" does not exist -- helper view to check the resgroup status CREATE OR REPLACE VIEW rg_test_monitor AS SELECT groupname, concurrency, cpu_max_percent FROM gp_toolkit.gp_resgroup_config WHERE groupname='rg_test_group'; -CREATE +CREATE VIEW -- ---------------------------------------------------------------------- -- Test: create/alter/drop a resource group in transaction block @@ -21,7 +21,7 @@ BEGIN CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=5); ERROR: CREATE RESOURCE GROUP cannot run inside a transaction block END; -END +ROLLBACK SELECT * FROM rg_test_monitor; groupname | concurrency | cpu_max_percent -----------+-------------+----------------- @@ -29,13 +29,13 @@ SELECT * FROM rg_test_monitor; -- ALTER RESOURCE GROUP cannot run inside a transaction block CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=5); -CREATE +CREATE RESOURCE GROUP BEGIN; BEGIN ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 10; ERROR: ALTER RESOURCE GROUP cannot run inside a transaction block END; -END +ROLLBACK SELECT * FROM rg_test_monitor; groupname | concurrency | cpu_max_percent ---------------+-------------+----------------- @@ -48,7 +48,7 @@ BEGIN DROP RESOURCE GROUP rg_test_group; ERROR: DROP RESOURCE GROUP cannot run inside a transaction block END; -END +ROLLBACK SELECT * FROM rg_test_monitor; groupname | concurrency | cpu_max_percent ---------------+-------------+----------------- @@ -56,7 +56,7 @@ SELECT * FROM rg_test_monitor; (1 row) DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP -- ---------------------------------------------------------------------- @@ -74,7 +74,7 @@ SELECT 1; CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=5); ERROR: CREATE RESOURCE GROUP cannot run inside a transaction block END; -END +ROLLBACK SELECT * FROM rg_test_monitor; groupname | concurrency | cpu_max_percent -----------+-------------+----------------- @@ -82,7 +82,7 @@ SELECT * FROM rg_test_monitor; -- ALTER RESOURCE GROUP cannot run inside a transaction block CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=5); -CREATE +CREATE RESOURCE GROUP BEGIN; BEGIN SELECT 1; @@ -93,7 +93,7 @@ SELECT 1; ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 10; ERROR: ALTER RESOURCE GROUP cannot run inside a transaction block END; -END +ROLLBACK SELECT * FROM rg_test_monitor; groupname | concurrency | cpu_max_percent ---------------+-------------+----------------- @@ -111,7 +111,7 @@ SELECT 1; DROP RESOURCE GROUP rg_test_group; ERROR: DROP RESOURCE GROUP cannot run inside a transaction block END; -END +ROLLBACK SELECT * FROM rg_test_monitor; groupname | concurrency | cpu_max_percent ---------------+-------------+----------------- @@ -119,7 +119,7 @@ SELECT * FROM rg_test_monitor; (1 row) DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP -- ---------------------------------------------------------------------- @@ -136,7 +136,7 @@ ERROR: CREATE RESOURCE GROUP cannot run inside a transaction block ROLLBACK TO SAVEPOINT rg_savepoint; ROLLBACK ABORT; -ABORT +ROLLBACK SELECT * FROM rg_test_monitor; groupname | concurrency | cpu_max_percent -----------+-------------+----------------- @@ -144,7 +144,7 @@ SELECT * FROM rg_test_monitor; -- ALTER RESOURCE GROUP cannot run inside a subtransaction CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=5); -CREATE +CREATE RESOURCE GROUP BEGIN; BEGIN SAVEPOINT rg_savepoint; @@ -154,7 +154,7 @@ ERROR: ALTER RESOURCE GROUP cannot run inside a transaction block ROLLBACK TO SAVEPOINT rg_savepoint; ROLLBACK ABORT; -ABORT +ROLLBACK SELECT * FROM rg_test_monitor; groupname | concurrency | cpu_max_percent ---------------+-------------+----------------- @@ -171,7 +171,7 @@ ERROR: DROP RESOURCE GROUP cannot run inside a transaction block ROLLBACK TO SAVEPOINT rg_savepoint; ROLLBACK ABORT; -ABORT +ROLLBACK SELECT * FROM rg_test_monitor; groupname | concurrency | cpu_max_percent ---------------+-------------+----------------- @@ -179,20 +179,20 @@ SELECT * FROM rg_test_monitor; (1 row) DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP -- ---------------------------------------------------------------------- -- Test: create/alter/drop a resource group in function call -- ---------------------------------------------------------------------- CREATE OR REPLACE FUNCTION rg_create_func() RETURNS VOID AS $$ CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=5) $$ LANGUAGE SQL; -CREATE +CREATE FUNCTION CREATE OR REPLACE FUNCTION rg_alter_func() RETURNS VOID AS $$ ALTER RESOURCE GROUP rg_test_group SET CONCURRENCY 10 $$ LANGUAGE SQL; -CREATE +CREATE FUNCTION CREATE OR REPLACE FUNCTION rg_drop_func() RETURNS VOID AS $$ DROP RESOURCE GROUP rg_test_group $$ LANGUAGE SQL; -CREATE +CREATE FUNCTION -- CREATE RESOURCE GROUP cannot run inside a function call SELECT * FROM rg_create_func(); @@ -205,7 +205,7 @@ SELECT * FROM rg_test_monitor; -- ALTER RESOURCE GROUP cannot run inside a function call CREATE RESOURCE GROUP rg_test_group WITH (cpu_max_percent=5); -CREATE +CREATE RESOURCE GROUP SELECT * FROM rg_alter_func(); ERROR: ALTER RESOURCE GROUP cannot be executed from a function CONTEXT: SQL function "rg_alter_func" statement 1 @@ -226,14 +226,14 @@ SELECT * FROM rg_test_monitor; (1 row) DROP RESOURCE GROUP rg_test_group; -DROP +DROP RESOURCE GROUP DROP FUNCTION rg_create_func(); -DROP +DROP FUNCTION DROP FUNCTION rg_alter_func(); -DROP +DROP FUNCTION DROP FUNCTION rg_drop_func(); -DROP +DROP FUNCTION -- cleanup DROP VIEW rg_test_monitor; -DROP +DROP VIEW diff --git a/src/test/isolation2/expected/resgroup/resgroup_unassign_entrydb.out b/src/test/isolation2/expected/resgroup/resgroup_unassign_entrydb.out index 86eed429db8..b29443853a9 100644 --- a/src/test/isolation2/expected/resgroup/resgroup_unassign_entrydb.out +++ b/src/test/isolation2/expected/resgroup/resgroup_unassign_entrydb.out @@ -5,15 +5,15 @@ -- start_ignore DROP ROLE IF EXISTS role_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_test; ERROR: resource group "rg_test" does not exist -- end_ignore CREATE RESOURCE GROUP rg_test WITH (concurrency=2, cpu_max_percent=10); -CREATE +CREATE RESOURCE GROUP CREATE ROLE role_test RESOURCE GROUP rg_test; -CREATE +CREATE ROLE -- By pass this session, else this affects the testing session, i.e. 1: SET gp_resource_group_bypass = true; @@ -95,6 +95,6 @@ SET -- Clean up DROP ROLE role_test; -DROP +DROP ROLE DROP RESOURCE GROUP rg_test; -DROP +DROP RESOURCE GROUP diff --git a/src/test/isolation2/expected/resource_queue.out b/src/test/isolation2/expected/resource_queue.out index f52c6890dd0..bf90017eea2 100644 --- a/src/test/isolation2/expected/resource_queue.out +++ b/src/test/isolation2/expected/resource_queue.out @@ -1,14 +1,14 @@ 0:CREATE RESOURCE QUEUE rq_concurrency_test WITH (active_statements = 1); -CREATE +CREATE QUEUE 0:CREATE role role_concurrency_test RESOURCE QUEUE rq_concurrency_test; -CREATE +CREATE ROLE 1:SET role role_concurrency_test; SET 1:BEGIN; BEGIN 1:DECLARE c1 CURSOR FOR SELECT 1; -DECLARE +DECLARE CURSOR 2:SET role role_concurrency_test; SET @@ -55,7 +55,7 @@ PREPARE (3 rows) 1:END; -END +COMMIT 2<: <... completed> ?column? @@ -63,7 +63,7 @@ END 1 (1 row) 2:END; -END +COMMIT 3<: <... completed> ?column? @@ -71,7 +71,7 @@ END 1 (1 row) 3:END; -END +COMMIT -- Sanity check: Ensure that all locks were released. 0:SELECT granted, locktype, mode FROM pg_locks where locktype = 'resource queue' and pid != pg_backend_pid(); @@ -116,6 +116,6 @@ CLOSE (1 row) 0:DROP role role_concurrency_test; -DROP +DROP ROLE 0:DROP RESOURCE QUEUE rq_concurrency_test; -DROP +DROP QUEUE diff --git a/src/test/isolation2/expected/resource_queue_cancel.out b/src/test/isolation2/expected/resource_queue_cancel.out index 40343b36cc2..da67e99937a 100644 --- a/src/test/isolation2/expected/resource_queue_cancel.out +++ b/src/test/isolation2/expected/resource_queue_cancel.out @@ -2,9 +2,9 @@ -- active statements limit is reached. 0:CREATE RESOURCE QUEUE rq_cancel WITH (active_statements = 1); -CREATE +CREATE QUEUE 0:CREATE ROLE role_cancel RESOURCE QUEUE rq_cancel; -CREATE +CREATE ROLE -- Consume an active statement in session 1. 1:SET ROLE role_cancel; @@ -12,7 +12,7 @@ SET 1:BEGIN; BEGIN 1:DECLARE c CURSOR FOR SELECT 0; -DECLARE +DECLARE CURSOR -- Make session 2 wait on the resource queue lock. 2:SET ROLE role_cancel; @@ -29,19 +29,19 @@ SET -- Now once we end session 1's transaction, we should be able to consume the -- vacated active statement slot in session 2. 1:END; -END +COMMIT 2<: <... completed> ERROR: canceling statement due to user request 2:END; -END +COMMIT 2:BEGIN; BEGIN 2:DECLARE c CURSOR FOR SELECT 0; -DECLARE +DECLARE CURSOR 2:END; -END +COMMIT -- Sanity check: Ensure that the resource queue is now empty. 0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_cancel'; @@ -52,6 +52,6 @@ END -- Cleanup 0:DROP ROLE role_cancel; -DROP +DROP ROLE 0:DROP RESOURCE QUEUE rq_cancel; -DROP +DROP QUEUE diff --git a/src/test/isolation2/expected/resource_queue_deadlock.out b/src/test/isolation2/expected/resource_queue_deadlock.out index 06309f34b6d..b78976d91a3 100644 --- a/src/test/isolation2/expected/resource_queue_deadlock.out +++ b/src/test/isolation2/expected/resource_queue_deadlock.out @@ -2,11 +2,9 @@ -- trigger a local deadlock detection. 0: CREATE RESOURCE QUEUE rq_deadlock_test WITH (active_statements = 1); -CREATE +CREATE QUEUE 0: CREATE role role_deadlock_test RESOURCE QUEUE rq_deadlock_test; -CREATE -0: SET gp_autostats_lock_wait TO ON; -SET +CREATE ROLE 0: SELECT gp_inject_fault_infinite('before_auto_stats', 'suspend', dbid) FROM gp_segment_configuration WHERE content = -1 AND role = 'p'; gp_inject_fault_infinite @@ -28,7 +26,7 @@ SET on_no_stats (1 row) 1: CREATE TABLE t_deadlock_test(c1 int); -CREATE +CREATE TABLE 1&: INSERT INTO t_deadlock_test VALUES (1); 2: SET role role_deadlock_test; SET @@ -56,7 +54,7 @@ HINT: See server log for query details. 2: ROLLBACK; ROLLBACK 1<: <... completed> -INSERT 1 +INSERT 0 1 -- Sanity check: Ensure that the resource queue is now empty. 0: SELECT rsqcountlimit, rsqcountvalue from pg_resqueue_status WHERE rsqname = 'rq_deadlock_test'; @@ -67,8 +65,8 @@ INSERT 1 -- Clean up the test 0: DROP TABLE t_deadlock_test; -DROP +DROP TABLE 0: DROP ROLE role_deadlock_test; -DROP +DROP ROLE 0: DROP RESOURCE QUEUE rq_deadlock_test; -DROP +DROP QUEUE diff --git a/src/test/isolation2/expected/resource_queue_multi_portal.out b/src/test/isolation2/expected/resource_queue_multi_portal.out index 5fe141ccc9c..3bb74f1b87d 100644 --- a/src/test/isolation2/expected/resource_queue_multi_portal.out +++ b/src/test/isolation2/expected/resource_queue_multi_portal.out @@ -2,9 +2,9 @@ -- in the face of deadlocks and statement cancellations, when there is more than -- one active portal in the session. 0:CREATE RESOURCE QUEUE rq_multi_portal WITH (active_statements = 2); -CREATE +CREATE QUEUE 0:CREATE ROLE role_multi_portal RESOURCE QUEUE rq_multi_portal; -CREATE +CREATE ROLE 1:SET ROLE role_multi_portal; SET @@ -49,12 +49,12 @@ END 1:BEGIN; BEGIN 1:DECLARE c1 CURSOR FOR SELECT 1; -DECLARE +DECLARE CURSOR 2:BEGIN; BEGIN 2:DECLARE c2 CURSOR FOR SELECT 1; -DECLARE +DECLARE CURSOR -- There should be 2 active statements. 0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; @@ -75,7 +75,7 @@ DECLARE -- This should cause a deadlock. 2:DECLARE c4 CURSOR FOR SELECT 1; -DECLARE +DECLARE CURSOR -- After the deadlock report, one session should have ERRORed out with the -- deadlock report and aborted, while the other session should remain active @@ -104,9 +104,9 @@ DETAIL: Process 738539 waits for ExclusiveLock on resource queue 90366; blocked Process 738548 waits for ExclusiveLock on resource queue 90366; blocked by process 738539. HINT: See server log for query details. 1:END; -END +ROLLBACK 2:END; -END +COMMIT 0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; rsqcountlimit | rsqcountvalue ---------------+--------------- @@ -120,9 +120,9 @@ END 1:BEGIN; BEGIN 1:DECLARE c1 CURSOR FOR SELECT 1; -DECLARE +DECLARE CURSOR 1:DECLARE c2 CURSOR FOR SELECT 1; -DECLARE +DECLARE CURSOR -- There should be 2 active statements. 0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; @@ -145,7 +145,7 @@ DETAIL: resource queue id: 585193, portal id: 3 (1 row) 1:END; -END +ROLLBACK -- -- Scenario 3: @@ -154,12 +154,12 @@ END 1:BEGIN; BEGIN 1:DECLARE c1 CURSOR FOR SELECT 1; -DECLARE +DECLARE CURSOR 2:BEGIN; BEGIN 2:DECLARE c2 CURSOR FOR SELECT 1; -DECLARE +DECLARE CURSOR -- This should block as it will exceed the active statements limit. 1&:DECLARE c3 CURSOR FOR SELECT 1; @@ -195,9 +195,9 @@ ERROR: canceling statement due to user request -- After ending the transactions, there should be 0 active statements. 1:END; -END +ROLLBACK 2:END; -END +COMMIT 0:SELECT rsqcountlimit, rsqcountvalue FROM pg_resqueue_status WHERE rsqname = 'rq_multi_portal'; rsqcountlimit | rsqcountvalue ---------------+--------------- @@ -206,6 +206,6 @@ END -- Cleanup 0:DROP ROLE role_multi_portal; -DROP +DROP ROLE 0:DROP RESOURCE QUEUE rq_multi_portal; -DROP +DROP QUEUE diff --git a/src/test/isolation2/expected/runaway_query.out b/src/test/isolation2/expected/runaway_query.out index ab550bc3315..c02cacb5b9e 100644 --- a/src/test/isolation2/expected/runaway_query.out +++ b/src/test/isolation2/expected/runaway_query.out @@ -1,10 +1,10 @@ CREATE EXTENSION IF NOT EXISTS gp_inject_fault; -CREATE +CREATE EXTENSION CREATE OR REPLACE LANGUAGE plpgsql; -CREATE +CREATE LANGUAGE CREATE TABLE runaway_query_test_table(a bigint NOT NULL) DISTRIBUTED BY (a); -CREATE +CREATE TABLE -- Use error fault to simulate vmem protect error and force cancel query. SELECT gp_inject_fault_infinite('gpdbwrappers_get_comparison_operator', 'error', 1); diff --git a/src/test/isolation2/expected/runaway_query_optimizer.out b/src/test/isolation2/expected/runaway_query_optimizer.out index 35b6b069cd1..3651ef4fc89 100644 --- a/src/test/isolation2/expected/runaway_query_optimizer.out +++ b/src/test/isolation2/expected/runaway_query_optimizer.out @@ -1,10 +1,10 @@ CREATE EXTENSION IF NOT EXISTS gp_inject_fault; -CREATE +CREATE EXTENSION CREATE OR REPLACE LANGUAGE plpgsql; -CREATE +CREATE LANGUAGE CREATE TABLE runaway_query_test_table(a bigint NOT NULL) DISTRIBUTED BY (a); -CREATE +CREATE TABLE -- Use error fault to simulate vmem protect error and force cancel query. SELECT gp_inject_fault_infinite('gpdbwrappers_get_comparison_operator', 'error', 1); diff --git a/src/test/isolation2/expected/segwalrep/cancel_commit_pending_replication.out b/src/test/isolation2/expected/segwalrep/cancel_commit_pending_replication.out index ed5e3d201b8..377d5054afd 100644 --- a/src/test/isolation2/expected/segwalrep/cancel_commit_pending_replication.out +++ b/src/test/isolation2/expected/segwalrep/cancel_commit_pending_replication.out @@ -10,7 +10,7 @@ select gp_inject_fault('wal_sender_loop', 'reset', 2); (1 row) create or replace function wait_for_replication(iterations int) returns bool as $$ begin /* in func */ for i in 1 .. iterations loop /* in func */ if exists (select wait_event from pg_stat_activity where sess_id in (select sess_id from store_session_id) and wait_event = 'SyncRep') then /* in func */ return true; /* in func */ end if; /* in func */ perform pg_sleep(0.1); /* in func */ perform pg_stat_clear_snapshot(); /* in func */ end loop; /* in func */ return false; /* in func */ end; /* in func */ $$ language plpgsql VOLATILE; -CREATE +CREATE FUNCTION SELECT role, preferred_role, content, status FROM gp_segment_configuration; role | preferred_role | content | status @@ -25,10 +25,10 @@ SELECT role, preferred_role, content, status FROM gp_segment_configuration; m | m | 0 | u (8 rows) create table store_session_id(a int, sess_id int); -CREATE +CREATE TABLE -- adding `2` as first column as the distribution column and add this tuple to segment 0 1: insert into store_session_id select 2, sess_id from pg_stat_activity where pid = pg_backend_pid(); -INSERT 1 +INSERT 0 1 -- suspend to hit commit-prepared point on segment (as we are -- interested in testing Commit here and not really Prepare) select gp_inject_fault_infinite('finish_prepared_start_of_function', 'suspend', 2); @@ -93,7 +93,7 @@ select gp_inject_fault('wal_sender_loop', 'reset', 2); Success: (1 row) 1<: <... completed> -CREATE +CREATE TABLE -- cleanup select gp_inject_fault('sync_rep_query_cancel', 'reset', 2); gp_inject_fault diff --git a/src/test/isolation2/expected/segwalrep/commit_blocking.out b/src/test/isolation2/expected/segwalrep/commit_blocking.out index 5edac6d59f5..8ea8a0cd1da 100644 --- a/src/test/isolation2/expected/segwalrep/commit_blocking.out +++ b/src/test/isolation2/expected/segwalrep/commit_blocking.out @@ -23,9 +23,9 @@ select content, role, preferred_role, status from gp_segment_configuration; -- create table and show commits are not blocked create table segwalrep_commit_blocking (a int) distributed by (a); -CREATE +CREATE TABLE insert into segwalrep_commit_blocking values (5); -INSERT 1 +INSERT 0 1 -- skip FTS probes always select gp_inject_fault('fts_probe', 'reset', 1); @@ -86,20 +86,20 @@ server closed the connection unexpectedly 3: begin; BEGIN 3: insert into segwalrep_commit_blocking values (4); -INSERT 1 +INSERT 0 1 3&: commit; -- this should not block due to direct dispatch to primary with active synced mirror 4: insert into segwalrep_commit_blocking values (6); -INSERT 1 +INSERT 0 1 -- bring the mirror back up -1U: select pg_ctl_start(datadir, port) from gp_segment_configuration where role = 'm' and content = 0; pg_ctl_start -------------------------------------------------- - waiting for server to start done server started + (1 row) -- should unblock and commit now that mirror is back up and in-sync @@ -115,7 +115,7 @@ select gp_inject_fault('fts_probe', 'reset', 1); -- everything should be back to normal 4: insert into segwalrep_commit_blocking select i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 4: select * from segwalrep_commit_blocking order by a; a ---- diff --git a/src/test/isolation2/expected/segwalrep/commit_blocking_on_standby.out b/src/test/isolation2/expected/segwalrep/commit_blocking_on_standby.out index c5eb5f674b8..2052f9fd42f 100644 --- a/src/test/isolation2/expected/segwalrep/commit_blocking_on_standby.out +++ b/src/test/isolation2/expected/segwalrep/commit_blocking_on_standby.out @@ -25,7 +25,7 @@ select gp_inject_fault_infinite('walrecv_skip_flush', 'skip', dbid) from gp_segm begin; BEGIN create or replace function wait_for_pg_stat_activity(timeout_secs int) returns void as $$ declare c int; /* in func */ i int; /* in func */ begin c := 0; /* in func */ i := 0; /* in func */ while c < 1 and i < timeout_secs*2 loop select count(*) into c from pg_stat_activity where wait_event = 'SyncRep'; /* in func */ perform pg_sleep(0.5); /* in func */ perform pg_stat_clear_snapshot(); /* in func */ i := i + 1; /* in func */ end loop; /* in func */ if c < 1 then raise exception 'timeout waiting for command to get blocked'; /* in func */ end if; /* in func */ end; /* in func */ $$ language plpgsql; -CREATE +CREATE FUNCTION -- Flush WAL to trigger the fault on standby. checkpoint; @@ -65,12 +65,12 @@ commit; COMMIT 1<: <... completed> -CREATE +CREATE TABLE -- The blocked commit must have finished and the table should be ready -- for insert. insert into commit_blocking_on_standby_t1 values (1); -INSERT 1 +INSERT 0 1 -- Scenario2: In CATCHUP phase, commits should not block until standby @@ -193,12 +193,12 @@ select gp_inject_fault('all', 'reset', dbid) from gp_segment_configuration where (2 rows) 1<: <... completed> -CREATE +CREATE TABLE -- Create table transaction must have committed and the table should -- be ready for insert. insert into commit_blocking_on_standby_t2 values (1); -INSERT 1 +INSERT 0 1 select wait_until_standby_in_state('streaming'); wait_until_standby_in_state @@ -296,10 +296,10 @@ select gp_inject_fault('all', 'reset', dbid) from gp_segment_configuration where (2 rows) 1<: <... completed> -CREATE +CREATE TABLE insert into commit_blocking_on_mirror_tbl values (2, 1); -INSERT 1 +INSERT 0 1 0U: select wait_until_standby_in_state('streaming'); wait_until_standby_in_state ----------------------------- diff --git a/src/test/isolation2/expected/segwalrep/die_commit_pending_replication.out b/src/test/isolation2/expected/segwalrep/die_commit_pending_replication.out index bc706f16321..650ea3dac9a 100644 --- a/src/test/isolation2/expected/segwalrep/die_commit_pending_replication.out +++ b/src/test/isolation2/expected/segwalrep/die_commit_pending_replication.out @@ -1,9 +1,9 @@ -- Adding `2` as first column as the distribution column. -- `2` should be on the first segment. let's double check here. create table store_session_id(a int, sess_id int); -CREATE +CREATE TABLE 1: insert into store_session_id select 2, sess_id from pg_stat_activity where pid = pg_backend_pid(); -INSERT 1 +INSERT 0 1 1: select gp_segment_id, a from store_session_id; gp_segment_id | a ---------------+--- @@ -11,7 +11,7 @@ INSERT 1 (1 row) 1: create table die_commit_pending_replication(a int, b int); -CREATE +CREATE TABLE -- Suspend to hit commit-prepared point on segment (as we are -- interested in testing Commit here and not really Prepare) @@ -90,7 +90,7 @@ select gp_inject_fault('sync_rep_query_die', 'reset', dbid) from gp_segment_conf (1 row) 1<: <... completed> -INSERT 2 +INSERT 0 2 -- check if the insert fails or not. select gp_segment_id, * from die_commit_pending_replication; @@ -110,9 +110,9 @@ select gp_segment_id, * from die_commit_pending_replication; -- 2: create temp table die_commit_pending_replication2(a int); -CREATE +CREATE TABLE 2: insert into die_commit_pending_replication2 values(2),(1); -INSERT 2 +INSERT 0 2 -- Insert fault before the "notification" code on QE and susped there. select gp_inject_fault_infinite('start_performDtxProtocolCommitOnePhase', 'error', dbid) from gp_segment_configuration where role='p' and content = 0; @@ -134,6 +134,6 @@ select gp_inject_fault_infinite('start_performDtxProtocolCommitOnePhase', 'reset -- cleanup drop table die_commit_pending_replication; -DROP +DROP TABLE drop table store_session_id; -DROP +DROP TABLE diff --git a/src/test/isolation2/expected/segwalrep/dtm_recovery_on_standby.out b/src/test/isolation2/expected/segwalrep/dtm_recovery_on_standby.out index 76f12f54a10..dc9b4dfc32d 100644 --- a/src/test/isolation2/expected/segwalrep/dtm_recovery_on_standby.out +++ b/src/test/isolation2/expected/segwalrep/dtm_recovery_on_standby.out @@ -90,7 +90,7 @@ select gp_inject_fault('all', 'reset', dbid) from gp_segment_configuration where Success: (1 row) 1<: <... completed> -CREATE +CREATE TABLE 2<: <... completed> ERROR: fault triggered, fault name:'transaction_abort_after_distributed_prepared' fault type:'error' @@ -123,12 +123,12 @@ select count(*) from committed_by_standby; ERROR: terminating connection due to administrator command (seg0 slice1 192.168.235.128:7002 pid=24473) -- end_ignore create table standby_config as (select hostname, datadir, port, role from gp_segment_configuration where content = -1) distributed by (hostname); -CREATE 2 +SELECT 2 create or replace function reinitialize_standby() returns text as $$ import subprocess rv = plpy.execute("select hostname, datadir, port from standby_config order by role", 2) standby = rv[0] # role = 'm' master = rv[1] # role = 'p' try: cmd = 'rm -rf %s.dtm_recovery && cp -R %s %s.dtm_recovery' % (standby['datadir'], standby['datadir'], standby['datadir']) remove_output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT).decode('ascii') cmd = 'gpinitstandby -ar -P %d' % master['port'] remove_output += subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT).decode('ascii') cmd = 'gpfts -A -D;' remove_output += subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT).decode('ascii') cmd = 'export PGPORT=%d; gpinitstandby -a -s %s -S %s -P %d' % (master['port'], standby['hostname'], standby['datadir'], standby['port']) init_output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT).decode('ascii') except subprocess.CalledProcessError as e: plpy.info(e.output) raise if "ERROR" not in remove_output and "FATAL" not in remove_output and \ "ERROR" not in init_output and "FATAL" not in init_output: return "standby initialized" return remove_output + "\n" + init_output $$ language plpython3u; -CREATE +CREATE FUNCTION select reinitialize_standby(); reinitialize_standby diff --git a/src/test/isolation2/expected/segwalrep/dtx_recovery_wait_lsn.out b/src/test/isolation2/expected/segwalrep/dtx_recovery_wait_lsn.out index ce415fc5f96..50045da32c2 100644 --- a/src/test/isolation2/expected/segwalrep/dtx_recovery_wait_lsn.out +++ b/src/test/isolation2/expected/segwalrep/dtx_recovery_wait_lsn.out @@ -5,10 +5,19 @@ -- The FTS process should be able to continue probe and 'sync off' the mirror -- while the 'dtx recovery' process is hanging recovering distributed transactions. +-- modify fts gucs to speed up the test. +1: alter system set gp_fts_probe_interval to 10; +ALTER SYSTEM +1: alter system set gp_fts_probe_retries to 1; +ALTER SYSTEM +1: select pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) + 1: create table t_wait_lsn(a int); -CREATE -5: create table t_wait_lsn2(a int); -CREATE +CREATE TABLE -- suspend segment 0 before performing 'COMMIT PREPARED' 2: select gp_inject_fault_infinite('finish_prepared_start_of_function', 'suspend', dbid) from gp_segment_configuration where content=0 and role='p'; @@ -149,13 +158,14 @@ server closed the connection unexpectedly 2 (1 row) 4: drop table t_wait_lsn; -DROP -4: drop table t_wait_lsn2; -DROP +DROP TABLE -4: select gp_inject_fault('walrecv_skip_flush', 'reset', dbid) from gp_segment_configuration where content=0; - gp_inject_fault ------------------ - Success: - Success: -(2 rows) +4: alter system reset gp_fts_probe_interval; +ALTER SYSTEM +4: alter system reset gp_fts_probe_retries; +ALTER SYSTEM +4: select pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) diff --git a/src/test/isolation2/expected/segwalrep/failover_with_many_records.out b/src/test/isolation2/expected/segwalrep/failover_with_many_records.out index 47a4f4f6140..e41922fcd99 100644 --- a/src/test/isolation2/expected/segwalrep/failover_with_many_records.out +++ b/src/test/isolation2/expected/segwalrep/failover_with_many_records.out @@ -16,7 +16,7 @@ (exited with code 0) 1:CREATE TABLE t(a int, b int); -CREATE +CREATE TABLE 1:SELECT gp_inject_fault_infinite('checkpoint_after_redo_calculated', 'suspend', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content = 1; gp_inject_fault_infinite @@ -25,14 +25,14 @@ CREATE (1 row) 2&:CHECKPOINT; 3:INSERT INTO t VALUES (1, 0); -INSERT 1 +INSERT 0 1 -- Force WAL to switch wal files explicitly -- start_ignore 1U:SELECT pg_switch_wal(); -- end_ignore 3:INSERT INTO t SELECT 0, i FROM generate_series(1, 25)i; -INSERT 25 +INSERT 0 25 1:SELECT gp_inject_fault_infinite('checkpoint_after_redo_calculated', 'reset', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content = 1; gp_inject_fault_infinite diff --git a/src/test/isolation2/expected/segwalrep/fts_unblock_primary.out b/src/test/isolation2/expected/segwalrep/fts_unblock_primary.out index 5f1afd5134a..a632c85069f 100644 --- a/src/test/isolation2/expected/segwalrep/fts_unblock_primary.out +++ b/src/test/isolation2/expected/segwalrep/fts_unblock_primary.out @@ -38,12 +38,12 @@ select content, role, preferred_role, status from gp_segment_configuration; -- create table and show commits are not blocked create table fts_unblock_primary (a int) distributed by (a); -CREATE +CREATE TABLE -- This case aims to insert a tuple to seg0. -- Under jump consistent hash, int value 4 should -- be on seg0. insert into fts_unblock_primary values (4); -INSERT 1 +INSERT 0 1 -- skip FTS probes always select gp_inject_fault('fts_probe', 'reset', 1); @@ -74,12 +74,12 @@ select gp_request_fts_probe_scan(); 2: begin; BEGIN 2: insert into fts_unblock_primary values (5); -INSERT 1 +INSERT 0 1 2&: commit; -- this should not block due to direct dispatch to primary with active synced mirror insert into fts_unblock_primary values (2); -INSERT 1 +INSERT 0 1 -- resume FTS probes select gp_inject_fault('fts_probe', 'reset', 1); @@ -159,9 +159,9 @@ select gp_inject_fault_infinite('initialize_wal_sender', 'suspend', dbid) from g -1U: select pg_ctl_start((select datadir from gp_segment_configuration c where c.role='m' and c.content=2), (select port from gp_segment_configuration where content = 2 and preferred_role = 'm')); pg_ctl_start -------------------------------------------------- - waiting for server to start done server started + (1 row) select gp_wait_until_triggered_fault('initialize_wal_sender', 1, dbid) from gp_segment_configuration where role='p' and content=2; gp_wait_until_triggered_fault @@ -212,7 +212,7 @@ select content, role, preferred_role, mode, status from gp_segment_configuration -- everything is back to normal insert into fts_unblock_primary select i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 -- synchronous_standby_names should be back to its original value on the primary 2U: show synchronous_standby_names; diff --git a/src/test/isolation2/expected/segwalrep/master_wal_switch.out b/src/test/isolation2/expected/segwalrep/master_wal_switch.out index 1247ccfe028..dbbcaec01cd 100644 --- a/src/test/isolation2/expected/segwalrep/master_wal_switch.out +++ b/src/test/isolation2/expected/segwalrep/master_wal_switch.out @@ -30,11 +30,11 @@ SELECT application_name, state FROM pg_stat_replication; -- with a command that generates WAL in between the invocations are -- suffice to generate new WAL file. CREATE TEMP TABLE walfile(fname text) DISTRIBUTED BY (fname); -CREATE +CREATE TABLE INSERT INTO walfile SELECT pg_walfile_name(pg_switch_wal()); -INSERT 1 -CREATE TABLE master_wal_dummy(); -CREATE +INSERT 0 1 +CREATE TABLE coordinator_wal_dummy(); +CREATE TABLE -- This should return false, indicating current WAL segment is -- different than what was previously recorded walfile table. SELECT fname = pg_walfile_name(pg_switch_wal()) FROM walfile; diff --git a/src/test/isolation2/expected/segwalrep/mirror_promotion.out b/src/test/isolation2/expected/segwalrep/mirror_promotion.out index 7cf2f7df8d3..d1b04138291 100644 --- a/src/test/isolation2/expected/segwalrep/mirror_promotion.out +++ b/src/test/isolation2/expected/segwalrep/mirror_promotion.out @@ -88,6 +88,17 @@ select content, preferred_role, role, status, mode from gp_segment_configuration 0 | p | m | u | s (2 rows) +-- set GUCs to speed-up the test +alter system set gp_fts_probe_retries to 2; +ALTER SYSTEM +alter system set gp_fts_probe_timeout to 5; +ALTER SYSTEM +select pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) + -- start_ignore select dbid from gp_segment_configuration where content = 0 and role = 'p'; dbid @@ -139,9 +150,9 @@ select pg_sleep(2); -- start_ignore -- reset GUCs alter system set gp_fts_probe_retries to default; -ALTER +ALTER SYSTEM alter system set gp_fts_probe_timeout to default; -ALTER +ALTER SYSTEM select pg_reload_conf(); pg_reload_conf ---------------- @@ -169,9 +180,9 @@ select pg_sleep(2); -- end_ignore (exited with code 0) create tablespace mirror_promotion_tablespace location '/tmp/mirror_promotion_tablespace_loc'; -CREATE +CREATE TABLESPACE create table mirror_promotion_tblspc_heap_table (a int) tablespace mirror_promotion_tablespace; -CREATE +CREATE TABLE -- -- now, let's fully recover the mirror !\retcode gprecoverseg -aF --no-progress; @@ -180,9 +191,9 @@ CREATE (exited with code 0) drop table mirror_promotion_tblspc_heap_table; -DROP +DROP TABLE drop tablespace mirror_promotion_tablespace; -DROP +DROP TABLESPACE -- loop while segments come in sync select wait_until_all_segments_synchronized(); diff --git a/src/test/isolation2/expected/segwalrep/recoverseg_from_file.out b/src/test/isolation2/expected/segwalrep/recoverseg_from_file.out index 00921bb1b3e..265e8f0d46a 100644 --- a/src/test/isolation2/expected/segwalrep/recoverseg_from_file.out +++ b/src/test/isolation2/expected/segwalrep/recoverseg_from_file.out @@ -15,7 +15,7 @@ -- create or replace function generate_recover_config_file(datadir text, port text) returns void as $$ import io import os myhost = os.uname()[1] srcConfig = myhost + '|' + port + '|' + datadir dstConfig = myhost + '|' + port + '|' + datadir + 'temp' configStr = srcConfig + ' ' + dstConfig f = open("/tmp/recover_config_file1", "w") f.write(configStr) f.close() configStr = dstConfig + ' ' + srcConfig f = open("/tmp/recover_config_file2", "w") f.write(configStr) f.close() $$ language plpython3u; -CREATE +CREATE FUNCTION SELECT dbid, role, preferred_role, content, status FROM gp_segment_configuration order by dbid; dbid | role | preferred_role | content | status diff --git a/src/test/isolation2/expected/segwalrep/replication_keeps_crash.out b/src/test/isolation2/expected/segwalrep/replication_keeps_crash.out index ae4e4c9f290..b5bc15f9bef 100644 --- a/src/test/isolation2/expected/segwalrep/replication_keeps_crash.out +++ b/src/test/isolation2/expected/segwalrep/replication_keeps_crash.out @@ -10,6 +10,10 @@ -- More details please refer to FTSGetReplicationDisconnectTime. -- modify fts gucs to speed up the test. +1: alter system set gp_fts_probe_interval to 10; +ALTER SYSTEM +1: alter system set gp_fts_replication_attempt_count to 3; +ALTER SYSTEM 1: select pg_reload_conf(); pg_reload_conf ---------------- @@ -63,7 +67,7 @@ select gp_request_fts_probe_scan(); -- Without gp_fts_replication_attempt_count mirror will continuously connect and re-connect and -- be in grace period to not be marked down. 1<: <... completed> -CREATE +CREATE TABLE -- expect: to see the content 0, mirror is mark down select content, preferred_role, role, status, mode from gp_segment_configuration where content = 0; @@ -106,8 +110,12 @@ SELECT role, preferred_role, content, status FROM gp_segment_configuration; (8 rows) drop table mirror_block_t1; -DROP +DROP TABLE +1: alter system reset gp_fts_probe_interval; +ALTER SYSTEM +1: alter system reset gp_fts_replication_attempt_count; +ALTER SYSTEM 1: select pg_reload_conf(); pg_reload_conf ---------------- diff --git a/src/test/isolation2/expected/segwalrep/select_throttle.out b/src/test/isolation2/expected/segwalrep/select_throttle.out index 1d722085938..6c3bddd4050 100644 --- a/src/test/isolation2/expected/segwalrep/select_throttle.out +++ b/src/test/isolation2/expected/segwalrep/select_throttle.out @@ -13,7 +13,7 @@ -- set wait_for_replication_threshold to 1kB for quicker test ALTER SYSTEM SET wait_for_replication_threshold = 1; -ALTER +ALTER SYSTEM SELECT pg_reload_conf(); pg_reload_conf ---------------- @@ -21,13 +21,13 @@ SELECT pg_reload_conf(); (1 row) CREATE TABLE select_no_throttle(a int) DISTRIBUTED BY (a); -CREATE +CREATE TABLE INSERT INTO select_no_throttle SELECT generate_series (1, 10); -INSERT 10 +INSERT 0 10 CREATE TABLE select_throttle(a int) DISTRIBUTED BY (a); -CREATE +CREATE TABLE INSERT INTO select_throttle SELECT generate_series (1, 900000); -INSERT 900000 +INSERT 0 900000 -- Enable tuple hints so that buffer will be marked dirty upon a hint bit change -- (so that we don't have to wait for the tuple to age. See logic in markDirty) @@ -134,9 +134,9 @@ SELECT wait_until_all_segments_synchronized(); 1U: SET gp_disable_tuple_hints=off; SET Truncate select_throttle; -TRUNCATE -INSERT INTO select_throttle SELECT generate_series (1, 100000); -INSERT 100000 +TRUNCATE TABLE +INSERT INTO select_throttle SELECT generate_series (1, 900000); +INSERT 0 900000 -- flush the data to disk checkpoint; CHECKPOINT @@ -234,7 +234,7 @@ RESET (1 row) ALTER SYSTEM RESET wait_for_replication_threshold; -ALTER +ALTER SYSTEM SELECT pg_reload_conf(); pg_reload_conf ---------------- diff --git a/src/test/isolation2/expected/segwalrep/twophase_tolerance_with_mirror_promotion.out b/src/test/isolation2/expected/segwalrep/twophase_tolerance_with_mirror_promotion.out index d27c4bbae4e..b48865ca370 100644 --- a/src/test/isolation2/expected/segwalrep/twophase_tolerance_with_mirror_promotion.out +++ b/src/test/isolation2/expected/segwalrep/twophase_tolerance_with_mirror_promotion.out @@ -159,7 +159,7 @@ LINE 1: INSERT INTO tolerance_test_table VALUES(42); Success: (1 row) 1<: <... completed> -CREATE +CREATE TABLE 1:SELECT gp_inject_fault('transaction_abort_after_distributed_prepared', 'reset', dbid) FROM gp_segment_configuration WHERE content = -1 AND role = 'p'; gp_inject_fault @@ -178,7 +178,7 @@ CREATE p | m (2 rows) 1:INSERT INTO tolerance_test_table VALUES(42); -INSERT 1 +INSERT 0 1 -- Scenario 3: Commit-Prepare received on primary but not acknowledged to master -- NOTICE: Don't use session 2 again because it's cached gang is invalid @@ -220,7 +220,7 @@ INSERT 1 -- end_ignore (exited with code 0) 1<: <... completed> -DROP +DROP TABLE -- Use new connection session. This helps is to make sure master is up and -- running, even if in worst case the above Drop command commit-prepared retries diff --git a/src/test/isolation2/expected/select_dropped_table.out b/src/test/isolation2/expected/select_dropped_table.out index 1de5825b246..402f8ea4ac8 100644 --- a/src/test/isolation2/expected/select_dropped_table.out +++ b/src/test/isolation2/expected/select_dropped_table.out @@ -18,16 +18,16 @@ -- This test is used to confirm the fix. 1: create table tab_select_dropped_table (c int); -CREATE +CREATE TABLE 1: begin; BEGIN 1: drop table tab_select_dropped_table; -DROP +DROP TABLE 2&: select * from tab_select_dropped_table; 1: end; -END +COMMIT 2<: <... completed> ERROR: relation "tab_select_dropped_table" does not exist LINE 1: select * from tab_select_dropped_table; diff --git a/src/test/isolation2/expected/setup.out b/src/test/isolation2/expected/setup.out index 0c9c28cea9e..3be43dcb0eb 100644 --- a/src/test/isolation2/expected/setup.out +++ b/src/test/isolation2/expected/setup.out @@ -1,5 +1,5 @@ create or replace language plpython3u; -CREATE +CREATE LANGUAGE -- Helper function, to call either __gp_aoseg, or gp_aocsseg, depending -- on whether the table is row- or column-oriented. This allows us to @@ -9,7 +9,7 @@ CREATE -- and thinks that a ';' at end of line ends the command. The /* in func */ -- comments at the end of each line thwarts that. CREATE OR REPLACE FUNCTION gp_ao_or_aocs_seg(rel regclass, segment_id OUT integer, segno OUT integer, tupcount OUT bigint, modcount OUT bigint, formatversion OUT smallint, state OUT smallint) RETURNS SETOF record as $$ declare amname_var text; /* in func */ begin /* in func */ select amname into amname_var from pg_class c, pg_am am where c.relam = am.oid and c.oid = rel; /* in func */ if amname_var = 'ao_column' then /* in func */ for segment_id, segno, tupcount, modcount, formatversion, state in SELECT DISTINCT x.segment_id, x.segno, x.tupcount, x.modcount, x.formatversion, x.state FROM gp_toolkit.__gp_aocsseg(rel) x loop /* in func */ return next; /* in func */ end loop; /* in func */ elsif amname_var = 'ao_row' then /* in func */ for segment_id, segno, tupcount, modcount, formatversion, state in SELECT x.segment_id, x.segno, x.tupcount, x.modcount, x.formatversion, x.state FROM gp_toolkit.__gp_aoseg(rel) x loop /* in func */ return next; /* in func */ end loop; /* in func */ else /* in func */ raise '% is not an AO_ROW or AO_COLUMN table', rel::text; /* in func */ end if; /* in func */ end; /* in func */ $$ LANGUAGE plpgsql; -CREATE +CREATE FUNCTION -- Show locks in master and in segments. Because the number of segments -- in the cluster depends on configuration, we print only summary information @@ -17,17 +17,17 @@ CREATE -- we print that as a special case, but otherwise we just print "n segments", -- meaning the relation is locked on more than one segment. create or replace view locktest_master as select coalesce( case when relname like 'pg_toast%index' then 'toast index' when relname like 'pg_toast%' then 'toast table' when relname like 'pg_aoseg%' then 'aoseg table' when relname like 'pg_aovisimap%index' then 'aovisimap index' when relname like 'pg_aovisimap%' then 'aovisimap table' else relname end, 'dropped table'), mode, locktype, 'master'::text as node from pg_locks l left outer join pg_class c on ((l.locktype = 'append-only segment file' and l.relation = c.relfilenode) or (l.locktype != 'append-only segment file' and l.relation = c.oid)), pg_database d where relation is not null and l.database = d.oid and (relname <> 'gp_fault_strategy' and relname != 'locktest_master' or relname is NULL) and d.datname = current_database() and l.gp_segment_id = -1 group by l.gp_segment_id, relation, relname, locktype, mode order by 1, 3, 2; -CREATE +CREATE VIEW create or replace view locktest_segments_dist as select relname, mode, locktype, l.gp_segment_id as node, relation from pg_locks l left outer join pg_class c on ((l.locktype = 'append-only segment file' and l.relation = c.relfilenode) or (l.locktype != 'append-only segment file' and l.relation = c.oid)), pg_database d where relation is not null and l.database = d.oid and (relname <> 'gp_fault_strategy' and relname != 'locktest_segments_dist' or relname is NULL) and d.datname = current_database() and l.gp_segment_id > -1 group by l.gp_segment_id, relation, relname, locktype, mode; -CREATE +CREATE VIEW create or replace view locktest_segments as SELECT coalesce( case when relname like 'pg_toast%index' then 'toast index' when relname like 'pg_toast%' then 'toast table' when relname like 'pg_aoseg%' then 'aoseg table' when relname like 'pg_aovisimap%index' then 'aovisimap index' when relname like 'pg_aovisimap%' then 'aovisimap table' else relname end, 'dropped table'), mode, locktype, case when count(*) = 1 then '1 segment' else 'n segments' end as node FROM gp_dist_random('locktest_segments_dist') group by relname, relation, mode, locktype; -CREATE +CREATE VIEW -- Helper function CREATE or REPLACE FUNCTION wait_until_waiting_for_required_lock (rel_name text, lmode text, segment_id integer) /*in func*/ RETURNS bool AS $$ declare retries int; /* in func */ begin /* in func */ retries := 1200; /* in func */ loop /* in func */ if (select not granted from pg_locks l where granted='f' and l.relation::regclass = rel_name::regclass and l.mode=lmode and l.gp_segment_id=segment_id) then /* in func */ return true; /* in func */ end if; /* in func */ if retries <= 0 then /* in func */ return false; /* in func */ end if; /* in func */ perform pg_sleep(0.1); /* in func */ retries := retries - 1; /* in func */ end loop; /* in func */ end; /* in func */ $$ language plpgsql; -CREATE +CREATE FUNCTION -- @@ -40,7 +40,7 @@ create or replace function pg_ctl(datadir text, command text, command_mode text import subprocess if command == 'promote': cmd = 'pg_ctl promote -D %s' % datadir elif command in ('stop', 'restart'): cmd = 'pg_ctl -l postmaster.log -D %s ' % datadir cmd = cmd + '-w -t 600 -m %s %s' % (command_mode, command) else: return 'Invalid command input' proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) stdout, stderr = proc.communicate() if proc.returncode == 0: return 'OK' else: raise PgCtlError(stdout.decode()+'|'+stderr.decode()) $$ language plpython3u; -CREATE +CREATE FUNCTION -- -- pg_ctl_start: @@ -52,8 +52,8 @@ CREATE -- datadir: data directory of process to target with `pg_ctl` -- port: which port the server should start on -- -create or replace function pg_ctl_start(datadir text, port bigint) returns text as $$ import subprocess cmd = 'pg_ctl -l postmaster.log -D %s ' % datadir opts = '-p %d' % (port) opts = opts + ' -c gp_role=execute' cmd = cmd + '-o "%s" start' % opts return subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).decode().replace('.', '') $$ language plpython3u; -CREATE +create or replace function pg_ctl_start(datadir text, port int) returns text as $$ import subprocess cmd = 'pg_ctl -l postmaster.log -D %s ' % datadir opts = '-p %d' % (port) opts = opts + ' -c gp_role=execute' cmd = cmd + '-o "%s" start' % opts return subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).decode().replace('.', '') $$ language plpython3u; +CREATE FUNCTION -- -- restart_primary_segments_containing_data_for(table_name text): @@ -62,7 +62,7 @@ CREATE -- Note: this does an immediate restart, which forces recovery -- create or replace function restart_primary_segments_containing_data_for(table_name text) returns setof integer as $$ declare segment_id integer; /* in func */ begin for segment_id in select * from primary_segments_containing_data_for(table_name) loop perform pg_ctl( (select get_data_directory_for(segment_id)), 'restart', 'immediate' ); /* in func */ end loop; /* in func */ end; /* in func */ $$ language plpgsql; -CREATE +CREATE FUNCTION -- -- clean_restart_primary_segments_containing_data_for(table_name text): @@ -71,33 +71,33 @@ CREATE -- Note: this does a fast restart, which does not require recovery -- create or replace function clean_restart_primary_segments_containing_data_for(table_name text) returns setof integer as $$ declare segment_id integer; /* in func */ begin for segment_id in select * from primary_segments_containing_data_for(table_name) loop perform pg_ctl( (select get_data_directory_for(segment_id)), 'restart', 'fast' ); /* in func */ end loop; /* in func */ end; /* in func */ $$ language plpgsql; -CREATE +CREATE FUNCTION create or replace function primary_segments_containing_data_for(table_name text) returns setof integer as $$ begin return query execute 'select distinct gp_segment_id from ' || table_name; /* in func */ end; /* in func */ $$ language plpgsql; -CREATE +CREATE FUNCTION create or replace function get_data_directory_for(segment_number int, segment_role text default 'p') returns text as $$ BEGIN return ( select datadir from gp_segment_configuration where role=segment_role and content=segment_number ); /* in func */ END; /* in func */ $$ language plpgsql; -CREATE +CREATE FUNCTION create or replace function master() returns setof gp_segment_configuration as $$ select * from gp_segment_configuration where role='p' and content=-1; /* in func */ $$ language sql; -CREATE +CREATE FUNCTION -create or replace function wait_until_segment_synchronized(segment_number int) returns text as $$ begin for i in 1..6000 loop if (select count(*) = 0 from gp_segment_configuration where content = segment_number and mode != 's') then return 'OK'; /* in func */ end if; /* in func */ perform pg_sleep(0.1); /* in func */ perform gp_request_fts_probe_scan(); /* in func */ end loop; /* in func */ return 'Fail'; /* in func */ end; /* in func */ $$ language plpgsql; -CREATE +create or replace function wait_until_segment_synchronized(segment_number int) returns text as $$ begin for i in 1..1200 loop if (select count(*) = 0 from gp_segment_configuration where content = segment_number and mode != 's') then return 'OK'; /* in func */ end if; /* in func */ perform pg_sleep(0.1); /* in func */ perform gp_request_fts_probe_scan(); /* in func */ end loop; /* in func */ return 'Fail'; /* in func */ end; /* in func */ $$ language plpgsql; +CREATE FUNCTION -create or replace function wait_until_all_segments_synchronized() returns text as $$ begin for i in 1..6000 loop if (select count(*) = 0 from gp_segment_configuration where content != -1 and mode != 's') then return 'OK'; /* in func */ end if; /* in func */ perform pg_sleep(0.1); /* in func */ perform gp_request_fts_probe_scan(); /* in func */ end loop; /* in func */ return 'Fail'; /* in func */ end; /* in func */ $$ language plpgsql; -CREATE +create or replace function wait_until_all_segments_synchronized() returns text as $$ begin /* no-op for a mirrorless cluster */ if (select count(*) = 0 from gp_segment_configuration where role = 'm') then return 'OK'; /* in func */ end if; /* in func */ for i in 1..1200 loop if (select count(*) = 0 from gp_segment_configuration where content != -1 and mode != 's') then return 'OK'; /* in func */ end if; /* in func */ perform pg_sleep(0.1); /* in func */ perform gp_request_fts_probe_scan(); /* in func */ end loop; /* in func */ return 'Fail'; /* in func */ end; /* in func */ $$ language plpgsql; +CREATE FUNCTION CREATE OR REPLACE FUNCTION is_query_waiting_for_syncrep(iterations int, check_query text) RETURNS bool AS $$ for i in range(iterations): results = plpy.execute("SELECT gp_execution_segment() AS content, query, wait_event\ FROM gp_dist_random('pg_stat_activity')\ WHERE gp_execution_segment() = 1 AND\ query = '%s' AND\ wait_event = 'SyncRep'" % check_query ) if results: return True return False $$ LANGUAGE plpython3u VOLATILE; -CREATE +CREATE FUNCTION create or replace function wait_for_replication_replay (segid int, retries int) returns bool as $$ declare i int; /* in func */ result bool; /* in func */ begin i := 0; /* in func */ -- Wait until the mirror/standby has replayed up to flush location loop SELECT flush_lsn = replay_lsn INTO result from gp_stat_replication where gp_segment_id = segid; /* in func */ if result then return true; /* in func */ end if; /* in func */ if i >= retries then return false; /* in func */ end if; /* in func */ perform pg_sleep(0.1); /* in func */ perform pg_stat_clear_snapshot(); /* in func */ i := i + 1; /* in func */ end loop; /* in func */ end; /* in func */ $$ language plpgsql; -CREATE +CREATE FUNCTION create or replace function wait_until_standby_in_state(targetstate text) returns text as $$ declare replstate text; /* in func */ i int; /* in func */ begin i := 0; /* in func */ while i < 1200 loop select state into replstate from pg_stat_replication; /* in func */ if replstate = targetstate then return replstate; /* in func */ end if; /* in func */ perform pg_sleep(0.1); /* in func */ perform pg_stat_clear_snapshot(); /* in func */ i := i + 1; /* in func */ end loop; /* in func */ return replstate; /* in func */ end; /* in func */ $$ language plpgsql; -CREATE +CREATE FUNCTION -- -- pg_basebackup: @@ -118,39 +118,39 @@ if xlog_method == 'stream': cmd += ' --wal-method stream' elif xlog_method == 'f cmd += ' --no-verify-checksums' try: # Unset PGAPPNAME so that the pg_stat_replication.application_name is not affected if os.getenv('PGAPPNAME') is not None: os.environ.pop('PGAPPNAME') results = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).replace(b'.', b'').decode() except subprocess.CalledProcessError as e: results = str(e) + "\ncommand output: " + (e.output.decode()) return results $$ language plpython3u; -CREATE +CREATE FUNCTION create or replace function count_of_items_in_directory(user_path text) returns text as $$ import subprocess cmd = 'ls {user_path}'.format(user_path=user_path) results = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).replace(b'.', b'').decode() return len([result for result in results.splitlines() if result != '']) $$ language plpython3u; -CREATE +CREATE FUNCTION create or replace function count_of_items_in_database_directory(user_path text, database_oid oid) returns int as $$ import subprocess import os directory = os.path.join(user_path, str(database_oid)) cmd = 'ls ' + directory results = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).replace(b'.', b'').decode() return len([result for result in results.splitlines() if result != '']) $$ language plpython3u; -CREATE +CREATE FUNCTION create or replace function validate_tablespace_symlink(datadir text, tablespacedir text, dbid int, tablespace_oid oid) returns boolean as $$ import os return os.readlink('%s/pg_tblspc/%d' % (datadir, tablespace_oid)) == ('%s/%d' % (tablespacedir, dbid)) $$ language plpython3u; -CREATE +CREATE FUNCTION -- This function is used to loop until master shutsdown, to make sure -- next command executed is only after restart and doesn't go through -- while PANIC is still being processed by master, as master continues -- to accept connections for a while despite undergoing PANIC. CREATE OR REPLACE FUNCTION wait_till_master_shutsdown() RETURNS void AS $$ DECLARE i int; /* in func */ BEGIN i := 0; /* in func */ while i < 120 loop i := i + 1; /* in func */ PERFORM pg_sleep(.5); /* in func */ end loop; /* in func */ END; /* in func */ $$ LANGUAGE plpgsql; -CREATE +CREATE FUNCTION -- Helper function that ensures stats collector receives stat from the latest operation. create or replace function wait_until_dead_tup_change_to(relid oid, stat_val_expected bigint) returns text as $$ declare stat_val int; /* in func */ i int; /* in func */ begin i := 0; /* in func */ while i < 1200 loop select pg_stat_get_dead_tuples(relid) into stat_val; /* in func */ if stat_val = stat_val_expected then /* in func */ return 'OK'; /* in func */ end if; /* in func */ perform pg_sleep(0.1); /* in func */ perform pg_stat_clear_snapshot(); /* in func */ i := i + 1; /* in func */ end loop; /* in func */ return 'Fail'; /* in func */ end; /* in func */ $$ language plpgsql; -CREATE +CREATE FUNCTION -- Helper function that ensures mirror of the specified contentid is down. create or replace function wait_for_mirror_down(contentid smallint, timeout_sec integer) returns bool as $$ declare i int; /* in func */ begin /* in func */ i := 0; /* in func */ loop /* in func */ perform gp_request_fts_probe_scan(); /* in func */ if (select count(1) from gp_segment_configuration where role='m' and content=$1 and status='d') = 1 then /* in func */ return true; /* in func */ end if; /* in func */ if i >= 2 * $2 then /* in func */ return false; /* in func */ end if; /* in func */ perform pg_sleep(0.5); /* in func */ i = i + 1; /* in func */ end loop; /* in func */ end; /* in func */ $$ language plpgsql; -CREATE +CREATE FUNCTION -- Helper function that ensures stats collector receives stat from the latest operation. create or replace function wait_until_vacuum_count_change_to(relid oid, stat_val_expected bigint) returns text as $$ declare stat_val int; /* in func */ i int; /* in func */ begin i := 0; /* in func */ while i < 1200 loop select pg_stat_get_vacuum_count(relid) into stat_val; /* in func */ if stat_val = stat_val_expected then /* in func */ return 'OK'; /* in func */ end if; /* in func */ perform pg_sleep(0.1); /* in func */ perform pg_stat_clear_snapshot(); /* in func */ i := i + 1; /* in func */ end loop; /* in func */ return 'Fail'; /* in func */ end; /* in func */ $$ language plpgsql; -CREATE +CREATE FUNCTION -- Helper function to get the number of blocks in a relation. CREATE OR REPLACE FUNCTION nblocks(rel regclass) RETURNS int AS $$ /* in func */ BEGIN /* in func */ RETURN pg_relation_size(rel) / current_setting('block_size')::int; /* in func */ END; $$ /* in func */ LANGUAGE PLPGSQL; -CREATE +CREATE FUNCTION -- Helper function to populate logical heap pages in a certain block sequence. -- Can be used for both heap and AO/CO tables. The target block sequence into @@ -165,4 +165,4 @@ CREATE -- Note: while using this with AO/CO tables, please account for how the block -- sequences start/end based on the concurrency level (see AOSegmentGet_startHeapBlock()) CREATE OR REPLACE FUNCTION populate_pages(relname text, value int, upto tid) RETURNS VOID AS $$ /* in func */ DECLARE curtid tid; /* in func */ BEGIN /* in func */ LOOP /* in func */ EXECUTE format('INSERT INTO %I VALUES($1) RETURNING ctid', relname) INTO curtid USING value; /* in func */ EXIT WHEN curtid > upto; /* in func */ END LOOP; /* in func */ END; $$ /* in func */ LANGUAGE PLPGSQL; -CREATE +CREATE FUNCTION diff --git a/src/test/isolation2/expected/spilling_hashagg.out b/src/test/isolation2/expected/spilling_hashagg.out index 8f01e1e2416..a7311914d28 100644 --- a/src/test/isolation2/expected/spilling_hashagg.out +++ b/src/test/isolation2/expected/spilling_hashagg.out @@ -9,7 +9,7 @@ -- Until then this test doesn't actually test spilling. CREATE TABLE test_src_tbl AS WITH cte1 AS ( SELECT field5 from generate_series(1,1000) field5 ) SELECT field5 % 100 AS a, field5 % 100 + 1 AS b FROM cte1 DISTRIBUTED BY (a); -CREATE 1000 +SELECT 1000 ANALYZE test_src_tbl; ANALYZE @@ -26,7 +26,7 @@ SELECT gp_inject_fault('force_hashagg_stream_hashtable', 'skip', '', '', '', 100 Success: (4 rows) CREATE TABLE test_hashagg_on AS SELECT a, COUNT(DISTINCT b) AS b FROM test_src_tbl GROUP BY a; -CREATE 100 +SELECT 100 EXPLAIN (costs off) SELECT a, COUNT(DISTINCT b) AS b FROM test_src_tbl GROUP BY a; QUERY PLAN -------------------------------------------- @@ -43,7 +43,7 @@ EXPLAIN (costs off) SELECT a, COUNT(DISTINCT b) AS b FROM test_src_tbl GROUP BY set optimizer_enable_hashagg=off; SET CREATE TABLE test_hashagg_off AS SELECT a, COUNT(DISTINCT b) AS b FROM test_src_tbl GROUP BY a; -CREATE 100 +SELECT 100 EXPLAIN (costs off) SELECT a, COUNT(DISTINCT b) AS b FROM test_src_tbl GROUP BY a; QUERY PLAN -------------------------------------------- diff --git a/src/test/isolation2/expected/spilling_hashagg_optimizer.out b/src/test/isolation2/expected/spilling_hashagg_optimizer.out index 8f0f54e200a..fcafcdd58e1 100644 --- a/src/test/isolation2/expected/spilling_hashagg_optimizer.out +++ b/src/test/isolation2/expected/spilling_hashagg_optimizer.out @@ -9,7 +9,7 @@ -- Until then this test doesn't actually test spilling. CREATE TABLE test_src_tbl AS WITH cte1 AS ( SELECT field5 from generate_series(1,1000) field5 ) SELECT field5 % 100 AS a, field5 % 100 + 1 AS b FROM cte1 DISTRIBUTED BY (a); -CREATE 1000 +SELECT 1000 ANALYZE test_src_tbl; ANALYZE @@ -26,7 +26,7 @@ SELECT gp_inject_fault('force_hashagg_stream_hashtable', 'skip', '', '', '', 100 Success: (4 rows) CREATE TABLE test_hashagg_on AS SELECT a, COUNT(DISTINCT b) AS b FROM test_src_tbl GROUP BY a; -CREATE 100 +SELECT 100 EXPLAIN (costs off) SELECT a, COUNT(DISTINCT b) AS b FROM test_src_tbl GROUP BY a; QUERY PLAN -------------------------------------------- @@ -43,7 +43,7 @@ EXPLAIN (costs off) SELECT a, COUNT(DISTINCT b) AS b FROM test_src_tbl GROUP BY set optimizer_enable_hashagg=off; SET CREATE TABLE test_hashagg_off AS SELECT a, COUNT(DISTINCT b) AS b FROM test_src_tbl GROUP BY a; -CREATE 100 +SELECT 100 EXPLAIN (costs off) SELECT a, COUNT(DISTINCT b) AS b FROM test_src_tbl GROUP BY a; QUERY PLAN -------------------------------------------- diff --git a/src/test/isolation2/expected/standby_replay_dtx_info.out b/src/test/isolation2/expected/standby_replay_dtx_info.out index 3d8cfc26dd9..9782a3fa612 100644 --- a/src/test/isolation2/expected/standby_replay_dtx_info.out +++ b/src/test/isolation2/expected/standby_replay_dtx_info.out @@ -8,7 +8,7 @@ create or replace function wait_for_standby_replay (retries int) returns bool as $$ declare i int; /* in func */ standby_is_up bool; /* in func */ result bool; /* in func */ begin i := 0; /* in func */ -- Wait until the mirror/standby has replayed up to flush location loop SELECT flush_lsn = replay_lsn INTO result from pg_stat_replication; /* in func */ if not found then return false; /* in func */ end if; /* in func */ if result then return true; /* in func */ end if; /* in func */ if i >= retries then return false; /* in func */ end if; /* in func */ perform pg_sleep(0.1); /* in func */ perform pg_stat_clear_snapshot(); /* in func */ i := i + 1; /* in func */ end loop; /* in func */ end; /* in func */ $$ language plpgsql; -CREATE +CREATE FUNCTION select wait_for_standby_replay(1200); wait_for_standby_replay @@ -16,7 +16,7 @@ select wait_for_standby_replay(1200); t (1 row) create table test_dtx_standby_tbl(c1 int); -CREATE +CREATE TABLE -- We have just created a checkpoint. The next automatic checkpoint -- will be triggered only after 5 minutes or after CheckPointSegments @@ -58,7 +58,7 @@ CHECKPOINT Success: (1 row) 2<: <... completed> -INSERT 10 +INSERT 0 10 1: select gp_inject_fault_infinite('checkpoint_after_redo_calculated', 'reset', dbid) from gp_segment_configuration where content = -1 and role = 'p'; gp_inject_fault_infinite -------------------------- @@ -76,7 +76,7 @@ CHECKPOINT -- this DTX might overflow gxacts array 2: insert into test_dtx_standby_tbl select generate_series(11,20); -INSERT 10 +INSERT 0 10 -- Wait standby to replay all XLOG select wait_for_standby_replay(1200); @@ -91,6 +91,6 @@ select gp_inject_fault_infinite('standby_gxacts_overflow', 'reset', dbid) from g Success: (1 row) drop table test_dtx_standby_tbl; -DROP +DROP TABLE drop function wait_for_standby_replay(int); -DROP +DROP FUNCTION diff --git a/src/test/isolation2/expected/starve_case.out b/src/test/isolation2/expected/starve_case.out index 51b9db4051d..265076d622a 100644 --- a/src/test/isolation2/expected/starve_case.out +++ b/src/test/isolation2/expected/starve_case.out @@ -7,9 +7,9 @@ -- create table starve (c int); -CREATE +CREATE TABLE create table starve_helper (name varchar, sessionid int); -CREATE +CREATE TABLE -- Function to access a table so that AccessShare lock is requested on -- the table. Use a non-SQL language for this function so that parser @@ -19,13 +19,13 @@ CREATE -- ENTRY_DB_SINGLETON reader that executes this function won't go -- through the waitMask conflict check in LockAcquire(). CREATE OR REPLACE FUNCTION function_starve_volatile(x int) /*in func*/ RETURNS int AS $$ /*in func*/ declare /*in func*/ v int; /*in func*/ BEGIN /*in func*/ SELECT count(c) into v FROM starve; /*in func*/ RETURN $1 + 1; /*in func*/ END $$ /*in func*/ LANGUAGE plpgsql VOLATILE MODIFIES SQL DATA; -CREATE +CREATE FUNCTION -- Function to wait until a specific session is reported as waiting on -- a lock. The session's mppsessionid is obtained from starve_helper -- table. Timeout if no locks are awaited within 2 seconds. CREATE OR REPLACE FUNCTION wait_until_locks_awaited(sess_name varchar) /*in func*/ RETURNS bool AS $$ /*in func*/ declare /*in func*/ num_awaited int := 0; /*in func*/ iterations int := 0; /*in func*/ sessions_waiting_for_locks int[]; /*in func*/ begin /*in func*/ while num_awaited = 0 and iterations < 20 loop /*in func*/ select array_agg(mppsessionid) into sessions_waiting_for_locks from pg_locks where granted = false and gp_segment_id = -1; /*in func*/ select count(*) into num_awaited from starve_helper s where /*in func*/ s.name = sess_name and s.sessionid = ANY (sessions_waiting_for_locks); /*in func*/ perform pg_sleep(.1); /*in func*/ iterations := iterations + 1; /*in func*/ end loop; /*in func*/ return num_awaited > 0; /*in func*/ end $$ /*in func*/ LANGUAGE plpgsql STABLE; -CREATE +CREATE FUNCTION -- Hold access shared lock, so that session2 must wait. 1: begin; @@ -36,7 +36,7 @@ BEGIN (0 rows) 2: insert into starve_helper select 'session2', setting::int from pg_settings where name = 'gp_session_id'; -INSERT 1 +INSERT 0 1 -- Wait on access exclusive lock. 2: begin; BEGIN @@ -49,7 +49,7 @@ select wait_until_locks_awaited('session2'); (1 row) 3: insert into starve_helper select 'session3', setting::int from pg_settings where name = 'gp_session_id'; -INSERT 1 +INSERT 0 1 -- ENTRY_DB_SINGLETON reader requests access share lock on table -- starve. The lockmode conflicts with already existing waiter's -- lockmode (access exclusive). And the writer is not holding any @@ -79,7 +79,7 @@ COMMIT -- session2 is granted the lock on starve table first. 2<: <... completed> -ALTER +ALTER TABLE 2: select mode from pg_locks where granted=false and relation='starve'::regclass and gp_segment_id=-1; mode ----------------- @@ -94,7 +94,7 @@ COMMIT ERROR: column "c" does not exist (entry db 127.0.0.1:15432 pid=94829) CONTEXT: PL/pgSQL function "function_starve_volatile" line 5 at SQL statement 3: commit; -COMMIT +ROLLBACK -- @@ -102,7 +102,7 @@ COMMIT -- on a lock in case of waitMask conflict. -- truncate table starve_helper; -TRUNCATE +TRUNCATE TABLE -- Hold access shared lock, so that session2 must wait. 1: begin; @@ -113,7 +113,7 @@ BEGIN (0 rows) 2: insert into starve_helper select 'session2', setting::int from pg_settings where name = 'gp_session_id'; -INSERT 1 +INSERT 0 1 -- Wait on access exclusive lock. 2: begin; BEGIN @@ -126,7 +126,7 @@ select wait_until_locks_awaited('session2'); (1 row) 3: insert into starve_helper select 'session3', setting::int from pg_settings where name = 'gp_session_id'; -INSERT 1 +INSERT 0 1 3: begin; BEGIN -- Wait on RowExclusiveLock on table starve because session2 is @@ -143,7 +143,7 @@ select wait_until_locks_awaited('session3'); COMMIT -- Session2 must go first. 2<: <... completed> -ALTER +ALTER TABLE -- Ensure that session3 is still waiting. 2: select mode from pg_locks where granted=false and relation='starve'::regclass and gp_segment_id=-1; mode @@ -155,6 +155,6 @@ COMMIT -- Session3 gets the lock only after session2 commits. 3<: <... completed> -INSERT 2 +INSERT 0 2 3: commit; COMMIT diff --git a/src/test/isolation2/expected/sync_guc.out b/src/test/isolation2/expected/sync_guc.out index b0d042fc8e6..6e87ca588e9 100644 --- a/src/test/isolation2/expected/sync_guc.out +++ b/src/test/isolation2/expected/sync_guc.out @@ -1,10 +1,10 @@ -- TEST 1: Fix Github issue https://github.com/greenplum-db/gpdb/issues/9208 1: create schema sync_np1; -CREATE +CREATE SCHEMA 1: create schema sync_np2; -CREATE +CREATE SCHEMA 1: CREATE OR REPLACE FUNCTION public.segment_setting(guc text) RETURNS SETOF text EXECUTE ON ALL SEGMENTS AS $$ BEGIN RETURN NEXT pg_catalog.current_setting(guc); END $$ LANGUAGE plpgsql; -CREATE +CREATE FUNCTION 1q: ... -- The SET command will create a Gang on the primaries, and the GUC -- values should be the same on all QD/QEs. @@ -30,18 +30,18 @@ RESET "$user", public (3 rows) 2: create or replace function sync_f1() returns int as $$ select 1234; $$language sql; -CREATE +CREATE FUNCTION 2: select sync_f1(); sync_f1 --------- 1234 (1 row) 2: drop function sync_f1(); -DROP +DROP FUNCTION 2: drop schema sync_np1; -DROP +DROP SCHEMA 2: drop schema sync_np2; -DROP +DROP SCHEMA 2q: ... -- TEST 2: Fix Github issue https://github.com/greenplum-db/gpdb/issues/685 @@ -66,9 +66,9 @@ RESET off (3 rows) 3: create table sync_t1(i int); -CREATE +CREATE TABLE 3: insert into sync_t1 select i from generate_series(1,10)i; -INSERT 10 +INSERT 0 10 3: delete from sync_t1; DELETE 10 3: select * from sync_t1; @@ -76,19 +76,19 @@ DELETE 10 --- (0 rows) 3: drop table sync_t1; -DROP +DROP TABLE 3q: ... 1: drop function public.segment_setting(guc text); -DROP +DROP FUNCTION 1q: ... -- TEST 3: make sure all QEs call RESET if there are more than 1 QE of the session -- in the primary 4: create temp table sync_t11(a int, b int) distributed by(b); -CREATE +CREATE TABLE 4: create temp table sync_t12(a int, b int) distributed by(a); -CREATE +CREATE TABLE -- The join will create 2 slices on each primary, and 1 entrydb on the coordinator. -- So, every primary and the coordinator should trigger 2 SET/RESET diff --git a/src/test/isolation2/expected/tcp_ic_teardown.out b/src/test/isolation2/expected/tcp_ic_teardown.out index 6b6d3ac8d2d..2610999fbdb 100644 --- a/src/test/isolation2/expected/tcp_ic_teardown.out +++ b/src/test/isolation2/expected/tcp_ic_teardown.out @@ -6,9 +6,9 @@ CREATE FUNCTION set_gp_ic_type(ic_type text) RETURNS VOID as $$ import os cmd = CREATE CREATE TABLE tcp_ic_teardown(i int); -CREATE +CREATE TABLE INSERT INTO tcp_ic_teardown SELECT generate_series(1, 5); -INSERT 5 +INSERT 0 5 -- Save current IC type before we set it to 'tcp', so we can revert it at the -- end of the test. diff --git a/src/test/isolation2/expected/terminate_in_gang_creation.out b/src/test/isolation2/expected/terminate_in_gang_creation.out index a45558c9439..f430bab0f32 100644 --- a/src/test/isolation2/expected/terminate_in_gang_creation.out +++ b/src/test/isolation2/expected/terminate_in_gang_creation.out @@ -14,7 +14,7 @@ SELECT gp_inject_fault_infinite('before_orphaned_check', 'skip', dbid) FROM gp_s Success: (1 row) ALTER SYSTEM SET gp_dtx_recovery_interval to 5; -ALTER +ALTER SYSTEM SELECT pg_reload_conf(); pg_reload_conf ---------------- @@ -46,9 +46,9 @@ SELECT gp_wait_until_triggered_fault('before_orphaned_check', 1, dbid) FROM gp_s -- #17 AllocateWriterGang DROP TABLE IF EXISTS foo; -DROP +DROP TABLE CREATE TABLE foo (c1 int, c2 int) DISTRIBUTED BY (c1); -CREATE +CREATE TABLE 10: BEGIN; BEGIN @@ -92,7 +92,7 @@ server closed the connection unexpectedly 10q: ... DROP TABLE foo; -DROP +DROP TABLE -- Test a bug that if cached idle primary QE is gone (e.g. after kill-9, pg_ctl -- restart, etc), a new query needs a new created reader gang might fail with @@ -127,7 +127,7 @@ CHECKPOINT 11: SET gp_vmem_idle_resource_timeout TO 0; SET 11: CREATE TABLE foo (c1 int, c2 int) DISTRIBUTED BY (c1); -CREATE +CREATE TABLE -- ORCA optimizes value scan so there is no additional reader gang in below INSERT. 11: SET optimizer = off; SET @@ -145,9 +145,9 @@ DETAIL: FATAL: reader could not find writer proc entry DETAIL: lock [0,1260] AccessShareLock 0. Probably because writer gang is gone somehow. Maybe try rerunning. (seg1 127.0.0.1:7004) 11: INSERT INTO foo values(2),(1); -INSERT 2 +INSERT 0 2 11: DROP TABLE foo; -DROP +DROP TABLE 11: RESET gp_vmem_idle_resource_timeout; RESET @@ -162,7 +162,7 @@ SELECT gp_inject_fault_infinite('before_orphaned_check', 'reset', dbid) FROM gp_ Success: (1 row) 2: ALTER SYSTEM RESET gp_dtx_recovery_interval; -ALTER +ALTER SYSTEM 2: SELECT pg_reload_conf(); pg_reload_conf ---------------- diff --git a/src/test/isolation2/expected/truncate_after_ao_vacuum_skip_drop.out b/src/test/isolation2/expected/truncate_after_ao_vacuum_skip_drop.out index 3ca27f0390d..01aa4f3a9a2 100644 --- a/src/test/isolation2/expected/truncate_after_ao_vacuum_skip_drop.out +++ b/src/test/isolation2/expected/truncate_after_ao_vacuum_skip_drop.out @@ -2,9 +2,9 @@ -- AppendOnlyHash after doing a TRUNCATE. CREATE TABLE truncate_after_ao_vacuum_skip_drop (a INT, b INT) WITH (appendonly=true); -CREATE +CREATE TABLE INSERT INTO truncate_after_ao_vacuum_skip_drop SELECT i as a, i as b FROM generate_series(1, 10) AS i; -INSERT 10 +INSERT 0 10 DELETE FROM truncate_after_ao_vacuum_skip_drop; DELETE 10 @@ -27,7 +27,7 @@ BEGIN 2: VACUUM truncate_after_ao_vacuum_skip_drop; VACUUM 1: END; -END +COMMIT -- We should see an aoseg in state 2 (AOSEG_STATE_AWAITING_DROP) 0U: SELECT segno, state FROM gp_toolkit.__gp_aoseg('truncate_after_ao_vacuum_skip_drop'); @@ -39,7 +39,7 @@ END -- The AO relation should be rewritten and AppendOnlyHash entry invalidated 1: TRUNCATE truncate_after_ao_vacuum_skip_drop; -TRUNCATE +TRUNCATE TABLE 0U: SELECT segno, state FROM gp_toolkit.__gp_aoseg('truncate_after_ao_vacuum_skip_drop'); segno | state -------+------- @@ -48,7 +48,7 @@ TRUNCATE -- Check if insert goes into segno 1 instead of segno 2. If it did not -- go into segno 1, there was a leak in the AppendOnlyHash entry. 1: INSERT INTO truncate_after_ao_vacuum_skip_drop SELECT i as a, i as b FROM generate_series(1, 100) AS i; -INSERT 100 +INSERT 0 100 0U: SELECT segno, tupcount > 0, state FROM gp_toolkit.__gp_aoseg('truncate_after_ao_vacuum_skip_drop'); segno | ?column? | state -------+----------+------- diff --git a/src/test/isolation2/expected/uao_crash_compaction_column.out b/src/test/isolation2/expected/uao_crash_compaction_column.out index 22d455582f7..5d9ca42981f 100644 --- a/src/test/isolation2/expected/uao_crash_compaction_column.out +++ b/src/test/isolation2/expected/uao_crash_compaction_column.out @@ -31,24 +31,24 @@ SET ao_column (1 row) 3:DROP TABLE IF EXISTS crash_before_cleanup_phase CASCADE; -DROP +DROP TABLE 3:CREATE TABLE crash_before_cleanup_phase (a INT, b INT, c CHAR(20)); -CREATE +CREATE TABLE 3:CREATE INDEX crash_before_cleanup_phase_index ON crash_before_cleanup_phase(b); -CREATE +CREATE INDEX 3:INSERT INTO crash_before_cleanup_phase SELECT i AS a, 1 AS b, 'hello world' AS c FROM generate_series(1, 10) AS i; -INSERT 10 +INSERT 0 10 3:DELETE FROM crash_before_cleanup_phase WHERE a < 4; DELETE 3 -- for crash_vacuum_in_appendonly_insert 3:DROP TABLE IF EXISTS crash_vacuum_in_appendonly_insert CASCADE; -DROP +DROP TABLE 3:CREATE TABLE crash_vacuum_in_appendonly_insert (a INT, b INT, c CHAR(20)); -CREATE +CREATE TABLE 3:CREATE INDEX crash_vacuum_in_appendonly_insert_index ON crash_vacuum_in_appendonly_insert(b); -CREATE +CREATE INDEX 3:INSERT INTO crash_vacuum_in_appendonly_insert SELECT i AS a, 1 AS b, 'hello world' AS c FROM generate_series(1, 10) AS i; -INSERT 10 +INSERT 0 10 3:UPDATE crash_vacuum_in_appendonly_insert SET b = 2; UPDATE 10 @@ -83,7 +83,7 @@ BEGIN Success: (1 row) 3:END; -END +COMMIT -- we already waited for suspend faults to trigger and hence we can proceed to -- run next command which would trigger panic fault and help test @@ -137,7 +137,7 @@ ERROR: Error on receive from seg0 127.0.0.1:7002 pid=18463: server closed the c 2 | 2 | 258 | 3 | 0 | 1 (15 rows) 1:INSERT INTO crash_before_cleanup_phase VALUES(1, 1, 'c'), (25, 6, 'c'); -INSERT 2 +INSERT 0 2 1:UPDATE crash_before_cleanup_phase SET b = b+10 WHERE a=25; UPDATE 1 1:SELECT * FROM crash_before_cleanup_phase ORDER BY a,b; @@ -199,7 +199,7 @@ VACUUM 2 | 2 | 258 | 5 | 0 | 1 (18 rows) 1:INSERT INTO crash_before_cleanup_phase VALUES(21, 1, 'c'), (26, 1, 'c'); -INSERT 2 +INSERT 0 2 1:UPDATE crash_before_cleanup_phase SET b = b+10 WHERE a=26; UPDATE 1 1:SELECT * FROM crash_before_cleanup_phase ORDER BY a,b; @@ -263,7 +263,7 @@ VACUUM 2 | 2 | 258 | 5 | 0 | 1 (18 rows) 1:INSERT INTO crash_vacuum_in_appendonly_insert VALUES(21, 1, 'c'), (26, 1, 'c'); -INSERT 2 +INSERT 0 2 1:UPDATE crash_vacuum_in_appendonly_insert SET b = b+10 WHERE a=26; UPDATE 1 1:SELECT * FROM crash_vacuum_in_appendonly_insert ORDER BY a,b; @@ -294,15 +294,15 @@ SET ----------------------------- ao_column (1 row) -2:DROP TABLE IF EXISTS crash_master_before_cleanup_phase CASCADE; -DROP -2:CREATE TABLE crash_master_before_cleanup_phase (a INT, b INT, c CHAR(20)); -CREATE -2:CREATE INDEX crash_master_before_cleanup_phase_index ON crash_master_before_cleanup_phase(b); -CREATE -2:INSERT INTO crash_master_before_cleanup_phase SELECT i AS a, 1 AS b, 'hello world' AS c FROM generate_series(1, 10) AS i; -INSERT 10 -2:DELETE FROM crash_master_before_cleanup_phase WHERE a < 4; +2:DROP TABLE IF EXISTS crash_coordinator_before_cleanup_phase CASCADE; +DROP TABLE +2:CREATE TABLE crash_coordinator_before_cleanup_phase (a INT, b INT, c CHAR(20)); +CREATE TABLE +2:CREATE INDEX crash_coordinator_before_cleanup_phase_index ON crash_coordinator_before_cleanup_phase(b); +CREATE INDEX +2:INSERT INTO crash_coordinator_before_cleanup_phase SELECT i AS a, 1 AS b, 'hello world' AS c FROM generate_series(1, 10) AS i; +INSERT 0 10 +2:DELETE FROM crash_coordinator_before_cleanup_phase WHERE a < 4; DELETE 3 -- inject panic fault @@ -345,9 +345,9 @@ server closed the connection unexpectedly 2 | 2 | 258 | 0 | 0 | 1 2 | 2 | 258 | 3 | 0 | 1 (15 rows) -4:INSERT INTO crash_master_before_cleanup_phase VALUES(1, 1, 'c'), (25, 6, 'c'); -INSERT 2 -4:UPDATE crash_master_before_cleanup_phase SET b = b+10 WHERE a=25; +4:INSERT INTO crash_coordinator_before_cleanup_phase VALUES(1, 1, 'c'), (25, 6, 'c'); +INSERT 0 2 +4:UPDATE crash_coordinator_before_cleanup_phase SET b = b+10 WHERE a=25; UPDATE 1 4:SELECT * FROM crash_master_before_cleanup_phase ORDER BY a,b; a | b | c @@ -405,9 +405,9 @@ VACUUM 2 | 2 | 258 | 3 | 0 | 1 2 | 2 | 258 | 5 | 0 | 1 (18 rows) -4:INSERT INTO crash_master_before_cleanup_phase VALUES(21, 1, 'c'), (26, 1, 'c'); -INSERT 2 -4:UPDATE crash_master_before_cleanup_phase SET b = b+10 WHERE a=26; +4:INSERT INTO crash_coordinator_before_cleanup_phase VALUES(21, 1, 'c'), (26, 1, 'c'); +INSERT 0 2 +4:UPDATE crash_coordinator_before_cleanup_phase SET b = b+10 WHERE a=26; UPDATE 1 4:SELECT * FROM crash_master_before_cleanup_phase ORDER BY a,b; a | b | c @@ -441,7 +441,7 @@ UPDATE 1 4:SET default_table_access_method = ao_column; SET 4:CREATE TABLE crash_vacuum_in_appendonly_insert_1 (a INT, b INT, c CHAR(20)); -CREATE +CREATE TABLE -- just sanity check to make sure appendonly table is created 4:SELECT count(*) from pg_appendonly where relid in (select oid from pg_class where relname='crash_vacuum_in_appendonly_insert_1'); count @@ -449,7 +449,7 @@ CREATE 1 (1 row) 4:INSERT INTO crash_vacuum_in_appendonly_insert_1 SELECT i AS a, 1 AS b, 'hello world' AS c FROM generate_series(1, 10) AS i; -INSERT 10 +INSERT 0 10 4:UPDATE crash_vacuum_in_appendonly_insert_1 SET b = 2; UPDATE 10 4:SELECT gp_inject_fault('xlog_ao_insert', 'infinite_loop', 2); diff --git a/src/test/isolation2/expected/uao_crash_compaction_row.out b/src/test/isolation2/expected/uao_crash_compaction_row.out index 5dd3bc113f0..45ec3bb4a6b 100644 --- a/src/test/isolation2/expected/uao_crash_compaction_row.out +++ b/src/test/isolation2/expected/uao_crash_compaction_row.out @@ -30,24 +30,24 @@ SET ao_row (1 row) 3:DROP TABLE IF EXISTS crash_before_cleanup_phase CASCADE; -DROP +DROP TABLE 3:CREATE TABLE crash_before_cleanup_phase (a INT, b INT, c CHAR(20)); -CREATE +CREATE TABLE 3:CREATE INDEX crash_before_cleanup_phase_index ON crash_before_cleanup_phase(b); -CREATE +CREATE INDEX 3:INSERT INTO crash_before_cleanup_phase SELECT i AS a, 1 AS b, 'hello world' AS c FROM generate_series(1, 10) AS i; -INSERT 10 +INSERT 0 10 3:DELETE FROM crash_before_cleanup_phase WHERE a < 4; DELETE 3 -- for crash_vacuum_in_appendonly_insert 3:DROP TABLE IF EXISTS crash_vacuum_in_appendonly_insert CASCADE; -DROP +DROP TABLE 3:CREATE TABLE crash_vacuum_in_appendonly_insert (a INT, b INT, c CHAR(20)); -CREATE +CREATE TABLE 3:CREATE INDEX crash_vacuum_in_appendonly_insert_index ON crash_vacuum_in_appendonly_insert(b); -CREATE +CREATE INDEX 3:INSERT INTO crash_vacuum_in_appendonly_insert SELECT i AS a, 1 AS b, 'hello world' AS c FROM generate_series(1, 10) AS i; -INSERT 10 +INSERT 0 10 3:UPDATE crash_vacuum_in_appendonly_insert SET b = 2; UPDATE 10 @@ -124,7 +124,7 @@ VACUUM 2 | 1 | 200 | 4 | 1 | 200 | 1 | 3 | 1 (5 rows) 1:INSERT INTO crash_before_cleanup_phase VALUES(1, 1, 'c'), (25, 6, 'c'); -INSERT 2 +INSERT 0 2 1:UPDATE crash_before_cleanup_phase SET b = b+10 WHERE a=25; UPDATE 1 1:SELECT * FROM crash_before_cleanup_phase ORDER BY a,b; @@ -162,7 +162,7 @@ VACUUM 2 | 2 | 248 | 5 | 1 | 248 | 0 | 3 | 1 (6 rows) 1:INSERT INTO crash_before_cleanup_phase VALUES(21, 1, 'c'), (26, 1, 'c'); -INSERT 2 +INSERT 0 2 1:UPDATE crash_before_cleanup_phase SET b = b+10 WHERE a=26; UPDATE 1 1:SELECT * FROM crash_before_cleanup_phase ORDER BY a,b; @@ -208,7 +208,7 @@ VACUUM 2 | 2 | 200 | 4 | 1 | 200 | 0 | 3 | 1 (6 rows) 1:INSERT INTO crash_vacuum_in_appendonly_insert VALUES(21, 1, 'c'), (26, 1, 'c'); -INSERT 2 +INSERT 0 2 1:UPDATE crash_vacuum_in_appendonly_insert SET b = b+10 WHERE a=26; UPDATE 1 1:SELECT * FROM crash_vacuum_in_appendonly_insert ORDER BY a,b; @@ -239,15 +239,15 @@ SET ----------------------------- ao_row (1 row) -2:DROP TABLE IF EXISTS crash_master_before_cleanup_phase CASCADE; -DROP -2:CREATE TABLE crash_master_before_cleanup_phase (a INT, b INT, c CHAR(20)); -CREATE -2:CREATE INDEX crash_master_before_cleanup_phase_index ON crash_master_before_cleanup_phase(b); -CREATE -2:INSERT INTO crash_master_before_cleanup_phase SELECT i AS a, 1 AS b, 'hello world' AS c FROM generate_series(1, 10) AS i; -INSERT 10 -2:DELETE FROM crash_master_before_cleanup_phase WHERE a < 4; +2:DROP TABLE IF EXISTS crash_coordinator_before_cleanup_phase CASCADE; +DROP TABLE +2:CREATE TABLE crash_coordinator_before_cleanup_phase (a INT, b INT, c CHAR(20)); +CREATE TABLE +2:CREATE INDEX crash_coordinator_before_cleanup_phase_index ON crash_coordinator_before_cleanup_phase(b); +CREATE INDEX +2:INSERT INTO crash_coordinator_before_cleanup_phase SELECT i AS a, 1 AS b, 'hello world' AS c FROM generate_series(1, 10) AS i; +INSERT 0 10 +2:DELETE FROM crash_coordinator_before_cleanup_phase WHERE a < 4; DELETE 3 -- suspend at intended points @@ -280,9 +280,9 @@ server closed the connection unexpectedly 1 | 2 | 0 | 0 | 0 | 0 | 0 | 3 | 1 2 | 1 | 200 | 4 | 1 | 200 | 1 | 3 | 1 (5 rows) -4:INSERT INTO crash_master_before_cleanup_phase VALUES(1, 1, 'c'), (25, 6, 'c'); -INSERT 2 -4:UPDATE crash_master_before_cleanup_phase SET b = b+10 WHERE a=25; +4:INSERT INTO crash_coordinator_before_cleanup_phase VALUES(1, 1, 'c'), (25, 6, 'c'); +INSERT 0 2 +4:UPDATE crash_coordinator_before_cleanup_phase SET b = b+10 WHERE a=25; UPDATE 1 4:SELECT * FROM crash_master_before_cleanup_phase ORDER BY a,b; a | b | c @@ -318,9 +318,9 @@ VACUUM 2 | 1 | 0 | 0 | 0 | 0 | 3 | 3 | 1 2 | 2 | 248 | 5 | 1 | 248 | 0 | 3 | 1 (6 rows) -4:INSERT INTO crash_master_before_cleanup_phase VALUES(21, 1, 'c'), (26, 1, 'c'); -INSERT 2 -4:UPDATE crash_master_before_cleanup_phase SET b = b+10 WHERE a=26; +4:INSERT INTO crash_coordinator_before_cleanup_phase VALUES(21, 1, 'c'), (26, 1, 'c'); +INSERT 0 2 +4:UPDATE crash_coordinator_before_cleanup_phase SET b = b+10 WHERE a=26; UPDATE 1 4:SELECT * FROM crash_master_before_cleanup_phase ORDER BY a,b; a | b | c diff --git a/src/test/isolation2/expected/udf_exception_blocks_panic_scenarios.out b/src/test/isolation2/expected/udf_exception_blocks_panic_scenarios.out index 84b84a3ae8d..bc120f05905 100644 --- a/src/test/isolation2/expected/udf_exception_blocks_panic_scenarios.out +++ b/src/test/isolation2/expected/udf_exception_blocks_panic_scenarios.out @@ -52,21 +52,21 @@ SELECT gp_request_fts_probe_scan(); t (1 row) CREATE OR REPLACE FUNCTION test_excep (arg INTEGER) RETURNS INTEGER AS $$ DECLARE res INTEGER; /* in func */ BEGIN /* in func */ res := 100 / arg; /* in func */ RETURN res; /* in func */ EXCEPTION /* in func */ WHEN division_by_zero /* in func */ THEN RETURN 999; /* in func */ END; /* in func */ $$ LANGUAGE plpgsql; -CREATE +CREATE FUNCTION CREATE OR REPLACE FUNCTION test_protocol_allseg(mid int, mshop int, mgender character) RETURNS VOID AS $$ DECLARE tfactor int default 0; /* in func */ BEGIN /* in func */ BEGIN /* in func */ CREATE TABLE employees(id int, shop_id int, gender character) DISTRIBUTED BY (id); /* in func */ INSERT INTO employees VALUES (0, 1, 'm'); /* in func */ END; /* in func */ BEGIN /* in func */ BEGIN /* in func */ IF EXISTS (select 1 from employees where id = mid) THEN /* in func */ RAISE EXCEPTION 'Duplicate employee id'; /* in func */ ELSE /* in func */ IF NOT (mshop between 1 AND 2) THEN /* in func */ RAISE EXCEPTION 'Invalid shop id' ; /* in func */ END IF; /* in func */ END IF; /* in func */ SELECT * INTO tfactor FROM test_excep(0); /* in func */ BEGIN /* in func */ INSERT INTO employees VALUES (mid, mshop, mgender); /* in func */ EXCEPTION /* in func */ WHEN OTHERS THEN /* in func */ BEGIN /* in func */ RAISE NOTICE 'catching the exception ...3'; /* in func */ END; /* in func */ END; /* in func */ EXCEPTION /* in func */ WHEN OTHERS THEN /* in func */ RAISE NOTICE 'catching the exception ...2'; /* in func */ END; /* in func */ EXCEPTION /* in func */ WHEN OTHERS THEN /* in func */ RAISE NOTICE 'catching the exception ...1'; /* in func */ END; /* in func */ END; /* in func */ $$ LANGUAGE plpgsql; -CREATE -SELECT role, preferred_role, content, status FROM gp_segment_configuration; - role | preferred_role | content | status -------+----------------+---------+-------- - p | p | -1 | u - m | m | -1 | u - p | p | 2 | u - m | m | 2 | u - p | p | 1 | u - m | m | 1 | u - p | p | 0 | u - m | m | 0 | u +CREATE FUNCTION +SELECT role, preferred_role, content, mode, status FROM gp_segment_configuration; + role | preferred_role | content | mode | status +------+----------------+---------+------+-------- + m | m | -1 | s | u + m | m | 0 | s | u + m | m | 1 | s | u + m | m | 2 | s | u + p | p | -1 | n | u + p | p | 0 | s | u + p | p | 1 | s | u + p | p | 2 | s | u (8 rows) SET debug_dtm_action_segment=0; SET @@ -79,7 +79,7 @@ SET SET debug_dtm_action_nestinglevel=0; SET DROP TABLE IF EXISTS employees; -DROP +DROP TABLE select test_protocol_allseg(1, 2,'f'); ERROR: PANIC for debug_dtm_action = 4, debug_dtm_action_protocol = Begin Internal Subtransaction (postgres.c:1490) (seg1 127.0.1.1:25433 pid=27784) CONTEXT: PL/pgSQL function test_protocol_allseg(integer,integer,character) line 9 during statement block entry @@ -107,7 +107,7 @@ SET SET debug_dtm_action_nestinglevel=0; SET DROP TABLE IF EXISTS employees; -DROP +DROP TABLE select test_protocol_allseg(1, 2,'f'); ERROR: DTX RollbackAndReleaseCurrentSubTransaction dispatch failed CONTEXT: PL/pgSQL function test_protocol_allseg(integer,integer,character) line 19 during exception cleanup @@ -135,7 +135,7 @@ SET SET debug_dtm_action_nestinglevel=4; SET DROP TABLE IF EXISTS employees; -DROP +DROP TABLE select test_protocol_allseg(1, 2,'f'); ERROR: DTX RollbackAndReleaseCurrentSubTransaction dispatch failed CONTEXT: PL/pgSQL function test_protocol_allseg(integer,integer,character) line 19 during exception cleanup @@ -163,7 +163,7 @@ SET SET debug_dtm_action_nestinglevel=3; SET DROP TABLE IF EXISTS employees; -DROP +DROP TABLE select test_protocol_allseg(1, 2,'f'); ERROR: DTX RollbackAndReleaseCurrentSubTransaction dispatch failed CONTEXT: PL/pgSQL function test_protocol_allseg(integer,integer,character) line 18 during exception cleanup @@ -191,7 +191,7 @@ SET SET debug_dtm_action_nestinglevel=0; SET DROP TABLE IF EXISTS employees; -DROP +DROP TABLE select test_protocol_allseg(1, 2,'f'); ERROR: DTX RollbackAndReleaseCurrentSubTransaction dispatch failed CONTEXT: PL/pgSQL function test_protocol_allseg(integer,integer,character) line 18 during exception cleanup @@ -219,7 +219,7 @@ SET SET debug_dtm_action_nestinglevel=3; SET DROP TABLE IF EXISTS employees; -DROP +DROP TABLE select test_protocol_allseg(1, 2,'f'); ERROR: DTX RollbackAndReleaseCurrentSubTransaction dispatch failed CONTEXT: PL/pgSQL function test_protocol_allseg(integer,integer,character) line 18 during exception cleanup diff --git a/src/test/isolation2/expected/unlogged_appendonly_tables.out b/src/test/isolation2/expected/unlogged_appendonly_tables.out index 9931e64f408..8e455c5f377 100644 --- a/src/test/isolation2/expected/unlogged_appendonly_tables.out +++ b/src/test/isolation2/expected/unlogged_appendonly_tables.out @@ -1,6 +1,6 @@ -- expect: create table succeeds create unlogged table unlogged_appendonly_table_managers ( id int, name text ) with ( appendonly=true ) distributed by (id); -CREATE +CREATE TABLE -- skip FTS probes to make the test deterministic. SELECT gp_inject_fault_infinite('fts_probe', 'skip', 1); @@ -21,9 +21,9 @@ SELECT gp_request_fts_probe_scan(); -- expect: insert/update/select works insert into unlogged_appendonly_table_managers values (1, 'Joe'); -INSERT 1 +INSERT 0 1 insert into unlogged_appendonly_table_managers values (2, 'Jane'); -INSERT 1 +INSERT 0 1 update unlogged_appendonly_table_managers set name = 'Susan' where id = 2; UPDATE 1 select * from unlogged_appendonly_table_managers order by id; @@ -55,9 +55,9 @@ select segment_id, segno, tupcount from gp_toolkit.__gp_aoseg('unlogged_appendon -- expect: insert/update/select works 3: insert into unlogged_appendonly_table_managers values (1, 'Joe'); -INSERT 1 +INSERT 0 1 3: insert into unlogged_appendonly_table_managers values (2, 'Jane'); -INSERT 1 +INSERT 0 1 3: update unlogged_appendonly_table_managers set name = 'Susan' where id = 2; UPDATE 1 3: select * from unlogged_appendonly_table_managers order by id; @@ -91,7 +91,7 @@ UPDATE 1 -- expect: drop table succeeds 5: drop table unlogged_appendonly_table_managers; -DROP +DROP TABLE SELECT gp_inject_fault('fts_probe', 'reset', 1); gp_inject_fault diff --git a/src/test/isolation2/expected/unlogged_heap_tables.out b/src/test/isolation2/expected/unlogged_heap_tables.out index eda1f72310e..75073386d50 100644 --- a/src/test/isolation2/expected/unlogged_heap_tables.out +++ b/src/test/isolation2/expected/unlogged_heap_tables.out @@ -1,6 +1,6 @@ -- expect: create table succeeds create unlogged table unlogged_heap_table_managers ( id int, name text ) distributed by (id); -CREATE +CREATE TABLE -- skip FTS probes to make the test deterministic. SELECT gp_inject_fault_infinite('fts_probe', 'skip', 1); @@ -21,9 +21,9 @@ SELECT gp_request_fts_probe_scan(); -- expect: insert/update/select works insert into unlogged_heap_table_managers values (1, 'Joe'); -INSERT 1 +INSERT 0 1 insert into unlogged_heap_table_managers values (2, 'Jane'); -INSERT 1 +INSERT 0 1 update unlogged_heap_table_managers set name = 'Susan' where id = 2; UPDATE 1 select * from unlogged_heap_table_managers order by id; @@ -45,9 +45,9 @@ select * from unlogged_heap_table_managers order by id; -- expect: insert/update/select works 3: insert into unlogged_heap_table_managers values (1, 'Joe'); -INSERT 1 +INSERT 0 1 3: insert into unlogged_heap_table_managers values (2, 'Jane'); -INSERT 1 +INSERT 0 1 3: update unlogged_heap_table_managers set name = 'Susan' where id = 2; UPDATE 1 3: select * from unlogged_heap_table_managers order by id; @@ -69,7 +69,7 @@ UPDATE 1 -- expect: drop table succeeds 5: drop table unlogged_heap_table_managers; -DROP +DROP TABLE SELECT gp_inject_fault('fts_probe', 'reset', 1); gp_inject_fault diff --git a/src/test/isolation2/expected/update_hash_col_utilitymode.out b/src/test/isolation2/expected/update_hash_col_utilitymode.out index 74cb7d728a2..e8b72be593a 100644 --- a/src/test/isolation2/expected/update_hash_col_utilitymode.out +++ b/src/test/isolation2/expected/update_hash_col_utilitymode.out @@ -1,5 +1,5 @@ create table t_update_hash_col_utilitymode(c int, d int) distributed by (c); -CREATE +CREATE TABLE -- This works. 1U: update t_update_hash_col_utilitymode set d = d + 1; @@ -10,4 +10,4 @@ UPDATE 0 ERROR: cannot update distribution key columns in utility mode drop table t_update_hash_col_utilitymode; -DROP +DROP TABLE diff --git a/src/test/isolation2/expected/upgrade_numsegments.out b/src/test/isolation2/expected/upgrade_numsegments.out index 965a0468143..f6d3aaa67d7 100644 --- a/src/test/isolation2/expected/upgrade_numsegments.out +++ b/src/test/isolation2/expected/upgrade_numsegments.out @@ -9,13 +9,13 @@ -- numsegments in utility mode, so we use it to test the -- function. -1U: create temp table t1(c1 int, c2 int); -CREATE +CREATE TABLE 0U: create temp table t1(c1 int, c2 int); -CREATE +CREATE TABLE 1U: create temp table t1(c1 int, c2 int); -CREATE +CREATE TABLE 2U: create temp table t1(c1 int, c2 int); -CREATE +CREATE TABLE -- start_ignore -1Uq: ... 0Uq: ... diff --git a/src/test/isolation2/expected/vacuum_after_vacuum_skip_drop_column.out b/src/test/isolation2/expected/vacuum_after_vacuum_skip_drop_column.out index c39460d99dd..4588ee41283 100644 --- a/src/test/isolation2/expected/vacuum_after_vacuum_skip_drop_column.out +++ b/src/test/isolation2/expected/vacuum_after_vacuum_skip_drop_column.out @@ -2,9 +2,9 @@ -- left over by a previous vacuum -- CREATE TABLE aoco_vacuum_after_vacuum_skip_drop (a INT, b INT) WITH (appendonly=true, orientation=column); -CREATE +CREATE TABLE INSERT INTO aoco_vacuum_after_vacuum_skip_drop SELECT i as a, i as b FROM generate_series(1, 10) AS i; -INSERT 10 +INSERT 0 10 DELETE FROM aoco_vacuum_after_vacuum_skip_drop; DELETE 10 @@ -28,7 +28,7 @@ BEGIN 2: VACUUM aoco_vacuum_after_vacuum_skip_drop; VACUUM 1: END; -END +COMMIT -- We should see an aocsseg in state 2 (AOSEG_STATE_AWAITING_DROP) 0U: SELECT segno, column_num, state FROM gp_toolkit.__gp_aocsseg('aoco_vacuum_after_vacuum_skip_drop'); @@ -54,7 +54,7 @@ VACUUM -- Check if insert goes into segno 1 instead of segno 2 1: INSERT INTO aoco_vacuum_after_vacuum_skip_drop SELECT i as a, i as b FROM generate_series(1, 100) AS i; -INSERT 100 +INSERT 0 100 0U: SELECT segno, tupcount > 0, state FROM gp_toolkit.__gp_aocsseg('aoco_vacuum_after_vacuum_skip_drop'); segno | ?column? | state -------+----------+------- diff --git a/src/test/isolation2/expected/vacuum_full_interrupt.out b/src/test/isolation2/expected/vacuum_full_interrupt.out index b2d7a396ba5..7c8e5102454 100644 --- a/src/test/isolation2/expected/vacuum_full_interrupt.out +++ b/src/test/isolation2/expected/vacuum_full_interrupt.out @@ -6,11 +6,11 @@ -- transaction is aborted. 1: CREATE TABLE vacuum_full_interrupt(a int, b int, c int); -CREATE +CREATE TABLE 1: CREATE INDEX vacuum_full_interrupt_idx on vacuum_full_interrupt(b); -CREATE +CREATE INDEX 1: INSERT INTO vacuum_full_interrupt SELECT i, i, i from generate_series(1,100)i; -INSERT 100 +INSERT 0 100 1: ANALYZE vacuum_full_interrupt; ANALYZE -- the relfrozenxid is the same as xmin when there's concurrent transactions. @@ -63,7 +63,7 @@ ERROR: canceling statement due to user request -- verify the index is correctly when insert new tuples, in bug also reset 'relhasindex' in pg_class. 2: INSERT INTO vacuum_full_interrupt SELECT i, i, i from generate_series(1,100)i; -INSERT 100 +INSERT 0 100 2: SET optimizer=off; SET 2: SET enable_seqscan=off; diff --git a/src/test/isolation2/expected/vacuum_progress_column.out b/src/test/isolation2/expected/vacuum_progress_column.out index 587bd35f7c8..54d4018303f 100644 --- a/src/test/isolation2/expected/vacuum_progress_column.out +++ b/src/test/isolation2/expected/vacuum_progress_column.out @@ -6,15 +6,15 @@ SET -- Setup the append-optimized table to be vacuumed DROP TABLE IF EXISTS vacuum_progress_ao_column; -DROP +DROP TABLE CREATE TABLE vacuum_progress_ao_column(i int, j int); -CREATE +CREATE TABLE -- Add two indexes to be vacuumed as well CREATE INDEX on vacuum_progress_ao_column(i); -CREATE +CREATE INDEX CREATE INDEX on vacuum_progress_ao_column(j); -CREATE +CREATE INDEX -- Insert all tuples to seg1 from two current sessions so that data are stored -- in two segment files. @@ -23,23 +23,23 @@ BEGIN 2: BEGIN; BEGIN 1: INSERT INTO vacuum_progress_ao_column SELECT 0, i FROM generate_series(1, 100000) i; -INSERT 100000 +INSERT 0 100000 2: INSERT INTO vacuum_progress_ao_column SELECT 0, i FROM generate_series(1, 100000) i; -INSERT 100000 +INSERT 0 100000 -- Commit so that the logical EOF of segno 2 is non-zero. 2: COMMIT; COMMIT 2: BEGIN; BEGIN 2: INSERT INTO vacuum_progress_ao_column SELECT 0, i FROM generate_series(1, 100000) i; -INSERT 100000 +INSERT 0 100000 -- Abort so that segno 2 has dead tuples after its logical EOF 2: ABORT; -ABORT +ROLLBACK 2q: ... -- Abort so that segno 1 has logical EOF = 0. 1: ABORT; -ABORT +ROLLBACK -- Also delete half of the tuples evenly before the EOF of segno 2. DELETE FROM vacuum_progress_ao_column where j % 2 = 0; diff --git a/src/test/isolation2/expected/vacuum_progress_row.out b/src/test/isolation2/expected/vacuum_progress_row.out index 0f1b3e65ef5..f5e7bfb0165 100644 --- a/src/test/isolation2/expected/vacuum_progress_row.out +++ b/src/test/isolation2/expected/vacuum_progress_row.out @@ -6,15 +6,15 @@ SET -- Setup the append-optimized table to be vacuumed DROP TABLE IF EXISTS vacuum_progress_ao_row; -DROP +DROP TABLE CREATE TABLE vacuum_progress_ao_row(i int, j int); -CREATE +CREATE TABLE -- Add two indexes to be vacuumed as well CREATE INDEX on vacuum_progress_ao_row(i); -CREATE +CREATE INDEX CREATE INDEX on vacuum_progress_ao_row(j); -CREATE +CREATE INDEX -- Insert all tuples to seg1 from two current sessions so that data are stored -- in two segment files. @@ -22,24 +22,24 @@ CREATE BEGIN 2: BEGIN; BEGIN -1: INSERT INTO vacuum_progress_ao_row SELECT 0, i FROM generate_series(1, 100000) i; -INSERT 100000 -2: INSERT INTO vacuum_progress_ao_row SELECT 0, i FROM generate_series(1, 100000) i; -INSERT 100000 +1: INSERT INTO vacuum_progress_ao_row SELECT i, i FROM generate_series(1, 100000) i; +INSERT 0 100000 +2: INSERT INTO vacuum_progress_ao_row SELECT i, i FROM generate_series(1, 100000) i; +INSERT 0 100000 -- Commit so that the logical EOF of segno 2 is non-zero. 2: COMMIT; COMMIT 2: BEGIN; BEGIN -2: INSERT INTO vacuum_progress_ao_row SELECT 0, i FROM generate_series(1, 100000) i; -INSERT 100000 +2: INSERT INTO vacuum_progress_ao_row SELECT i, i FROM generate_series(1, 100000) i; +INSERT 0 100000 -- Abort so that segno 2 has dead tuples after its logical EOF 2: ABORT; -ABORT +ROLLBACK 2q: ... -- Abort so that segno 1 has logical EOF = 0. 1: ABORT; -ABORT +ROLLBACK -- Also delete half of the tuples evenly before the EOF of segno 2. DELETE FROM vacuum_progress_ao_row where j % 2 = 0; diff --git a/src/test/isolation2/expected/vacuum_recently_dead_tuple_due_to_distributed_snapshot.out b/src/test/isolation2/expected/vacuum_recently_dead_tuple_due_to_distributed_snapshot.out index 7a9a981ba06..463c6f492ee 100644 --- a/src/test/isolation2/expected/vacuum_recently_dead_tuple_due_to_distributed_snapshot.out +++ b/src/test/isolation2/expected/vacuum_recently_dead_tuple_due_to_distributed_snapshot.out @@ -2,10 +2,10 @@ -- visible to a distributed snapshot, even if there is no corresponding -- local snapshot in a QE node yet. create table test_recently_dead_utility(a int); -CREATE +CREATE TABLE insert into test_recently_dead_utility select g from generate_series(1, 100) g; -INSERT 100 +INSERT 0 100 -- A function that: -- @@ -24,7 +24,7 @@ INSERT 100 -- (All on one line because of limitations in the isolation2 test language.) create or replace function afunc() returns int4 as $$ declare c int; begin select count(*) into c from pg_Database; perform pg_sleep(10); select count(*) into c from test_recently_dead_utility; return c; end; $$ language plpgsql stable; -CREATE +CREATE FUNCTION -- In one session, launch afunc(). 1&: select afunc(); diff --git a/src/test/isolation2/expected/vacuum_skip_locked_onseg.out b/src/test/isolation2/expected/vacuum_skip_locked_onseg.out index 243f663a27d..07cd9c64488 100644 --- a/src/test/isolation2/expected/vacuum_skip_locked_onseg.out +++ b/src/test/isolation2/expected/vacuum_skip_locked_onseg.out @@ -5,13 +5,13 @@ -- on master). 1: CREATE TABLE vacuum_tbl (c1 int) DISTRIBUTED BY (c1); -CREATE +CREATE TABLE -- Connect to seg #0 in utility mode, lock the table in share mode 0U: BEGIN; BEGIN 0U: LOCK vacuum_tbl IN SHARE MODE; -LOCK +LOCK TABLE -- Issue vacuum with SKIP_LOCKED option -- Note that some ANALYZE options are disabled here because the ANALYZE @@ -32,7 +32,7 @@ COMMIT 0U: BEGIN; BEGIN 0U: LOCK vacuum_tbl IN ACCESS EXCLUSIVE MODE; -LOCK +LOCK TABLE -- Issue vacuum with SKIP_LOCKED option -- Note that some ANALYZE options are disabled here because the ANALYZE @@ -50,4 +50,4 @@ VACUUM COMMIT 1: DROP TABLE IF EXISTS vacuum_tbl; -DROP +DROP TABLE diff --git a/src/test/isolation2/isolation2_main.c b/src/test/isolation2/isolation2_main.c index fb338660dc6..e3f2093811e 100644 --- a/src/test/isolation2/isolation2_main.c +++ b/src/test/isolation2/isolation2_main.c @@ -108,7 +108,16 @@ isolation_start_test(const char *testname, offset += snprintf(psql_cmd + offset, sizeof(psql_cmd) - offset, "%s ", launcher); + /* + * sql_isolation_testcase.py is using psycopg2 to connect to server. Psycopg2 requires the server + * using PGDATESTYLE='ISO, MDY', otherwise psycopg2 will try to execute "SET DATESTYLE='ISO, MDY'" + * after the connection being established. However, the pg_regress hardcoded PGDATESTYLE to 'Postgres, MDY', + * while in Greenplum, the 'SET' command is not allowed to execute in a retrieve connection + * (PGOPTIONS='-c gp_retrieve_conn=true'). To workaround this issue, we set 'DATESTYLE' to 'ISO, MDY' + * before invoking sql_isolation_testcase.py. + */ snprintf(psql_cmd + offset, sizeof(psql_cmd) - offset, + "env PGDATESTYLE='ISO,MDY' " "python3 ./sql_isolation_testcase.py --dbname=\"%s\" --initfile_prefix=\"%s\" < \"%s\" > \"%s\" 2>&1", dblist->str, outfile, diff --git a/src/test/isolation2/output/autovacuum-analyze.source b/src/test/isolation2/output/autovacuum-analyze.source index e071f9e7007..4dfa7e49b2a 100644 --- a/src/test/isolation2/output/autovacuum-analyze.source +++ b/src/test/isolation2/output/autovacuum-analyze.source @@ -4,7 +4,9 @@ -- Speed up test. ALTER SYSTEM SET autovacuum_naptime = 5; -ALTER +ALTER SYSTEM +ALTER SYSTEM SET autovacuum_vacuum_threshold = 50; +ALTER SYSTEM select * from pg_reload_conf(); pg_reload_conf ---------------- @@ -23,7 +25,7 @@ ANALYZE -- Prepare the table to be ANALYZEd 1: CREATE TABLE anatest (id bigint); -CREATE +CREATE TABLE -- Track report gpstat on master SELECT gp_inject_fault('gp_pgstat_report_on_master', 'suspend', '', '', 'anatest', 1, -1, 0, 1); @@ -59,7 +61,7 @@ SELECT gp_inject_fault('gp_pgstat_report_on_master', 'reset', 1); (1 row) 1<: <... completed> -INSERT 1000 +INSERT 0 1000 -- Wait until autovacuum is triggered SELECT gp_wait_until_triggered_fault('auto_vac_worker_after_report_activity', 1, 1); @@ -110,7 +112,7 @@ select relpages, reltuples from pg_class where oid = 'anatest'::regclass; -- Prepare the table to be ANALYZEd 1: CREATE TABLE rankpart (id int, rank int, product int) DISTRIBUTED BY (id) PARTITION BY RANGE (rank) ( START (1) END (10) EVERY (2), DEFAULT PARTITION extra ); -CREATE +CREATE TABLE -- Track report gpstat on master SELECT gp_inject_fault('gp_pgstat_report_on_master', 'suspend', '', '', 'rankpart_1_prt_extra', 1, -1, 0, 1); @@ -147,7 +149,7 @@ SELECT gp_inject_fault('gp_pgstat_report_on_master', 'reset', 1); (1 row) 1<: <... completed> -INSERT 1000 +INSERT 0 1000 -- Wait until autovacuum is triggered SELECT gp_wait_until_triggered_fault('auto_vac_worker_after_report_activity', 1, 1); @@ -263,7 +265,7 @@ select relpages, reltuples from pg_class where oid = 'rankpart'::regclass; -- 1: CREATE TABLE anaabort(id int); -CREATE +CREATE TABLE -- Track report gpstat on master SELECT gp_inject_fault('gp_pgstat_report_on_master', 'suspend', '', '', 'anaabort', 1, -1, 0, 1); @@ -305,7 +307,7 @@ SELECT gp_inject_fault('gp_pgstat_report_on_master', 'reset', 1); (1 row) 1<: <... completed> -INSERT 1000 +INSERT 0 1000 -- Wait until autovacuum is triggered SELECT gp_wait_until_triggered_fault('auto_vac_worker_after_report_activity', 1, 1); @@ -356,7 +358,7 @@ SELECT gp_inject_fault('analyze_after_hold_lock', 'reset', 1); -- Get lock 1<: <... completed> -LOCK +LOCK TABLE -- Shouldn't have statistic updated. SELECT count(*) FROM pg_statistic where starelid = 'anaabort'::regclass; @@ -371,7 +373,7 @@ select relpages, reltuples from pg_class where oid = 'anaabort'::regclass; (1 row) 1: END; -END +COMMIT -- -- Test 4, auto-ANALYZE and auto_stats could work at the same time. @@ -390,7 +392,7 @@ SET -- Prepare the table to be ANALYZEd 2: CREATE TABLE autostatstbl (id bigint); -CREATE +CREATE TABLE -- Track that we have updated the attributes stats in pg_statistic when finished SELECT gp_inject_fault('analyze_finished_one_relation', 'skip', '', '', 'autostatstbl', 1, -1, 0, 1); @@ -407,7 +409,7 @@ SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'suspend', '', ' -- with auto_stats, the auto-ANALYZE still trigger 2: INSERT INTO autostatstbl select i from generate_series(1, 1000) as i; -INSERT 1000 +INSERT 0 1000 2: select pg_sleep(0.77); -- Force pgstat_report_stat() to send tabstat. -- auto_stats executed but auto-ANALYZE not execute yet since we suspend before finish ANALYZE. SELECT count(*) FROM pg_statistic where starelid = 'autostatstbl'::regclass; @@ -492,7 +494,7 @@ SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'suspend', '', ' (1 row) 2: INSERT INTO autostatstbl select i from generate_series(1001, 2000) as i; -INSERT 1000 +INSERT 0 1000 2: select pg_sleep(0.77); -- Force pgstat_report_stat() to send tabstat. -- auto_stats executed but auto-ANALYZE not execute yet since we suspend before finish ANALYZE. select relpages, reltuples from pg_class where oid = 'autostatstbl'::regclass; @@ -571,7 +573,7 @@ SELECT gp_inject_fault('auto_vac_worker_after_report_activity', 'suspend', '', ' (1 row) 2: INSERT INTO autostatstbl select i from generate_series(2001, 3000) as i; -INSERT 1000 +INSERT 0 1000 2: select pg_sleep(0.77); -- Force pgstat_report_stat() to send tabstat. -- auto_stats should not executed and auto-ANALYZE not execute yet since we suspend before finish ANALYZE. select relpages, reltuples from pg_class where oid = 'autostatstbl'::regclass; @@ -632,7 +634,9 @@ select analyze_count, autoanalyze_count, n_mod_since_analyze from pg_stat_all_ta -- Reset GUCs. ALTER SYSTEM RESET autovacuum_naptime; -ALTER +ALTER SYSTEM +ALTER SYSTEM RESET autovacuum_vacuum_threshold; +ALTER SYSTEM select * from pg_reload_conf(); pg_reload_conf ---------------- diff --git a/src/test/isolation2/output/distributed_snapshot.source b/src/test/isolation2/output/distributed_snapshot.source index 10ca3f6d5c1..fbffab12e53 100644 --- a/src/test/isolation2/output/distributed_snapshot.source +++ b/src/test/isolation2/output/distributed_snapshot.source @@ -1,7 +1,7 @@ -- Distributed snapshot tests create or replace function test_consume_xids(int4) returns void as '@abs_srcdir@/../regress/regress.so', 'test_consume_xids' language C; -CREATE +CREATE FUNCTION -- Scenario1: Test to validate GetSnapshotData()'s computation of globalXmin using -- distributed snapshot. It mainly uses a old read-only transaction to help @@ -10,12 +10,12 @@ CREATE -- Setup CREATE TABLE distributed_snapshot_test1 (a int); -CREATE +CREATE TABLE 1: BEGIN; BEGIN 1: INSERT INTO distributed_snapshot_test1 values(1); -INSERT 1 +INSERT 0 1 -- Read transaction which helps to get lower globalXmin for session 3. As this -- will have MyProc->xmin set to transaction 1's xid. 2: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; @@ -31,7 +31,7 @@ COMMIT -- Transaction to bump the latestCompletedXid 1: INSERT INTO distributed_snapshot_test1 values(1); -INSERT 1 +INSERT 0 1 -- Hold after walking over ProcArray in GetSnpashotData(), right at start of -- DistributedLog_AdvanceOldestXmin() @@ -51,7 +51,7 @@ COMMIT -- Transaction used to bump the distributed oldestXmin 1: INSERT INTO distributed_snapshot_test1 values(1); -INSERT 1 +INSERT 0 1 -- let session 3 now move forward to compute distributed oldest xmin 1: SELECT gp_inject_fault('distributedlog_advance_oldest_xmin', 'reset', dbid) from gp_segment_configuration where content = 0 and role = 'p'; gp_inject_fault @@ -68,14 +68,14 @@ INSERT 1 -- Setup CREATE TABLE distributed_snapshot_test2 (a int); -CREATE +CREATE TABLE -- start transaction assigns distributed xid. 1: BEGIN ISOLATION LEVEL REPEATABLE READ; BEGIN -- this sets latestCompletedXid 2: INSERT INTO distributed_snapshot_test2 VALUES(1); -INSERT 1 +INSERT 0 1 -- here, take distributed snapshot 1: SELECT 123 AS "establish snapshot"; establish snapshot @@ -83,7 +83,7 @@ INSERT 1 123 (1 row) 2: INSERT INTO distributed_snapshot_test2 VALUES(2); -INSERT 1 +INSERT 0 1 -- expected to see just VALUES(1) 1: SELECT * FROM distributed_snapshot_test2; a @@ -94,7 +94,7 @@ INSERT 1 COMMIT DROP TABLE distributed_snapshot_test2; -DROP +DROP TABLE -- Scenario3: Test the one-phase commit transactions don't break repeatable read isolation. -- @@ -110,7 +110,7 @@ DROP -- protocol. Repeatable read transactions may read (100), (100,100) or -- (100,100,300), but not (100, 300). CREATE TABLE distributed_snapshot_test3 (a int); -CREATE +CREATE TABLE 10: BEGIN ISOLATION LEVEL REPEATABLE READ; BEGIN 20: BEGIN ISOLATION LEVEL REPEATABLE READ; @@ -118,21 +118,21 @@ BEGIN 30: BEGIN ISOLATION LEVEL REPEATABLE READ; BEGIN 40: INSERT INTO distributed_snapshot_test3 VALUES(100); -INSERT 1 +INSERT 0 1 10: SELECT gp_segment_id, * FROM distributed_snapshot_test3 where a = 100; gp_segment_id | a ---------------+----- 2 | 100 (1 row) 40: INSERT INTO distributed_snapshot_test3 VALUES(100); -INSERT 1 +INSERT 0 1 30: SELECT 123 AS "establish snapshot"; establish snapshot -------------------- 123 (1 row) 40: INSERT INTO distributed_snapshot_test3 VALUES(300); -INSERT 1 +INSERT 0 1 10: SELECT gp_segment_id, * FROM distributed_snapshot_test3; gp_segment_id | a ---------------+----- @@ -158,7 +158,7 @@ COMMIT 30: COMMIT; COMMIT DROP TABLE distributed_snapshot_test3; -DROP +DROP TABLE -- The following test cases are to test that QEs can get -- latest distribute snapshot to scan normal tables (not catalog). @@ -190,9 +190,9 @@ DROP -- Case 1: concurrently alter column type (will do rewrite heap) create table t_alter_snapshot_test(a int, b int, c int); -CREATE +CREATE TABLE insert into t_alter_snapshot_test values (1, 1, 1), (1, 1, 1); -INSERT 2 +INSERT 0 2 select * from t_alter_snapshot_test; a | b | c @@ -204,17 +204,17 @@ select * from t_alter_snapshot_test; 1: begin; BEGIN 1: alter table t_alter_snapshot_test alter column b type text; -ALTER +ALTER TABLE -- the following statement will hang 2&: alter table t_alter_snapshot_test alter column c type text; 1: end; -END +COMMIT -- after 1 commit, 2 can continue, it should use latest distributed -- snapshot so that the data will not be lost. 2<: <... completed> -ALTER +ALTER TABLE select * from t_alter_snapshot_test; a | b | c @@ -223,13 +223,13 @@ select * from t_alter_snapshot_test; 1 | 1 | 1 (2 rows) drop table t_alter_snapshot_test; -DROP +DROP TABLE -- Case 2: concurrently add exclude constrain create table t_alter_snapshot_test(a int, b int); -CREATE +CREATE TABLE insert into t_alter_snapshot_test values (1, 1), (1, 1); -INSERT 2 +INSERT 0 2 select a from t_alter_snapshot_test; a @@ -241,26 +241,26 @@ select a from t_alter_snapshot_test; 1: begin; BEGIN 1: alter table t_alter_snapshot_test alter column b type int using b::int; -ALTER +ALTER TABLE 2&: alter table t_alter_snapshot_test add exclude using btree (a WITH =); 1: end; -END +COMMIT -- after 1 commit, 2 can go on and it should fail 2<: <... completed> ERROR: could not create exclusion constraint "t_alter_snapshot_test_a_excl" (seg1 127.0.1.1:7003 pid=39163) DETAIL: Key (a)=(1) conflicts with key (a)=(1). drop table t_alter_snapshot_test; -DROP +DROP TABLE -- Case 3: concurrently split partition create table t_alter_snapshot_test(id int, rank int, year int) distributed by (id) partition by range (year) ( start (0) end (20) every (4), default partition extra ); -CREATE +CREATE TABLE insert into t_alter_snapshot_test select i,i,i from generate_series(1, 100)i; -INSERT 100 +INSERT 0 100 select count(*) from t_alter_snapshot_test; count ------- @@ -270,15 +270,15 @@ select count(*) from t_alter_snapshot_test; 1: begin; BEGIN 1: alter table t_alter_snapshot_test alter column rank type text; -ALTER +ALTER TABLE 2&: alter table t_alter_snapshot_test split partition for (5) at (5) into (partition pa, partition pb); 1: end; -END +COMMIT -- after 1 commit, 2 can go on and it should not lose data 2<: <... completed> -ALTER +ALTER TABLE select count(*) from t_alter_snapshot_test; count @@ -286,69 +286,69 @@ select count(*) from t_alter_snapshot_test; 100 (1 row) drop table t_alter_snapshot_test; -DROP +DROP TABLE -- case 4: concurrently validate check create table t_alter_snapshot_test(a int, b int); -CREATE +CREATE TABLE insert into t_alter_snapshot_test values (1, 1), (2, 2); -INSERT 2 +INSERT 0 2 alter table t_alter_snapshot_test ADD CONSTRAINT mychk CHECK(a > 20) NOT VALID; -ALTER +ALTER TABLE 1: begin; BEGIN 1: alter table t_alter_snapshot_test alter column b type text; -ALTER +ALTER TABLE 2&: alter table t_alter_snapshot_test validate CONSTRAINT mychk; 1: end; -END +COMMIT -- after 1 commit, 2 can go on and it should fail 2<: <... completed> ERROR: check constraint "mychk" of relation "t_alter_snapshot_test" is violated by some row (seg1 127.0.1.1:8003 pid=423039) drop table t_alter_snapshot_test; -DROP +DROP TABLE -- case 5: concurrently domain check create domain domain_snapshot_test as int; -CREATE +CREATE DOMAIN create table t_alter_snapshot_test(i domain_snapshot_test, j int, k int); -CREATE +CREATE TABLE insert into t_alter_snapshot_test values(200,1,1); -INSERT 1 +INSERT 0 1 alter domain domain_snapshot_test ADD CONSTRAINT mychk CHECK(VALUE > 300) NOT VALID; -ALTER +ALTER DOMAIN 1: begin; BEGIN 1: alter table t_alter_snapshot_test alter column k type text; -ALTER +ALTER TABLE 2&: alter domain domain_snapshot_test validate CONSTRAINT mychk; 1:end; -END +COMMIT -- after 1 commit, 2 can go on and it should fail 2<: <... completed> ERROR: column "i" of table "t_alter_snapshot_test" contains values that violate the new constraint (seg2 127.0.1.1:7004 pid=39164) drop table t_alter_snapshot_test; -DROP +DROP TABLE drop domain domain_snapshot_test; -DROP +DROP DOMAIN -- case 6: alter table expand table create table t_alter_snapshot_test(a int, b int); -CREATE +CREATE TABLE set allow_system_table_mods = on; SET update gp_distribution_policy set numsegments = 2 where localoid = 't_alter_snapshot_test'::regclass::oid; UPDATE 1 insert into t_alter_snapshot_test select i,i from generate_series(1, 10)i; -INSERT 10 +INSERT 0 10 select gp_segment_id, * from t_alter_snapshot_test; gp_segment_id | a | b ---------------+----+---- @@ -367,15 +367,15 @@ select gp_segment_id, * from t_alter_snapshot_test; 1: begin; BEGIN 1: alter table t_alter_snapshot_test alter column b type text; -ALTER +ALTER TABLE 2&: alter table t_alter_snapshot_test expand table; 1: end; -END +COMMIT -- after 1 commit, 2 can go on and data should not be lost 2<: <... completed> -ALTER +ALTER TABLE select gp_segment_id, * from t_alter_snapshot_test; gp_segment_id | a | b @@ -392,13 +392,13 @@ select gp_segment_id, * from t_alter_snapshot_test; 2 | 5 | 5 (10 rows) drop table t_alter_snapshot_test; -DROP +DROP TABLE -- case 7: alter table set distributed by create table t_alter_snapshot_test(a int, b int) distributed randomly; -CREATE +CREATE TABLE insert into t_alter_snapshot_test select i,i from generate_series(1, 10)i; -INSERT 10 +INSERT 0 10 select count(*) from t_alter_snapshot_test; count ------- @@ -408,15 +408,15 @@ select count(*) from t_alter_snapshot_test; 1: begin; BEGIN 1: alter table t_alter_snapshot_test alter column b type text; -ALTER +ALTER TABLE 2&: alter table t_alter_snapshot_test set distributed by (a); 1: end; -END +COMMIT -- after 1 commit, 2 can continue and data should not be lost 2<: <... completed> -ALTER +ALTER TABLE select count(*) from t_alter_snapshot_test; count @@ -424,23 +424,23 @@ select count(*) from t_alter_snapshot_test; 10 (1 row) drop table t_alter_snapshot_test; -DROP +DROP TABLE -- case 8: DML concurrent with Alter Table create table t_alter_snapshot_test(a int, b int); -CREATE +CREATE TABLE ---- test for insert 1: begin; BEGIN 1: insert into t_alter_snapshot_test values (1, 1); -INSERT 1 +INSERT 0 1 2&: alter table t_alter_snapshot_test alter column b type text; 1: end; -END +COMMIT -- 2 can continue, and we should not lose data 2<: <... completed> -ALTER +ALTER TABLE select * from t_alter_snapshot_test; a | b ---+--- @@ -449,19 +449,19 @@ select * from t_alter_snapshot_test; ---- test for update truncate t_alter_snapshot_test; -TRUNCATE +TRUNCATE TABLE insert into t_alter_snapshot_test values (1, 1); -INSERT 1 +INSERT 0 1 1: begin; BEGIN 1: update t_alter_snapshot_test set b = '3'; UPDATE 1 2&: alter table t_alter_snapshot_test alter column b type int using b::int; 1: end; -END +COMMIT -- 2 can continue and we should see the data has been updated 2<: <... completed> -ALTER +ALTER TABLE select * from t_alter_snapshot_test; a | b ---+--- @@ -470,35 +470,35 @@ select * from t_alter_snapshot_test; ---- test for delete truncate t_alter_snapshot_test; -TRUNCATE +TRUNCATE TABLE insert into t_alter_snapshot_test values (1, 1); -INSERT 1 +INSERT 0 1 1: begin; BEGIN 1: delete from t_alter_snapshot_test; DELETE 1 2&: alter table t_alter_snapshot_test alter column b type text; 1: end; -END +COMMIT -- 2 can continue and we should see the data has been deleted 2<: <... completed> -ALTER +ALTER TABLE select * from t_alter_snapshot_test; a | b ---+--- (0 rows) drop table t_alter_snapshot_test; -DROP +DROP TABLE -- Case 9: Repeatable Read Isolation Level Test create table t_alter_snapshot_test(a int, b int); -CREATE +CREATE TABLE insert into t_alter_snapshot_test values (1, 1); -INSERT 1 +INSERT 0 1 1: begin; BEGIN 1: insert into t_alter_snapshot_test values (1, 1); -INSERT 1 +INSERT 0 1 2: begin isolation level repeatable read; BEGIN @@ -510,11 +510,11 @@ BEGIN 2&: alter table t_alter_snapshot_test alter column b type text; 1: end; -END +COMMIT -- 2 can continue and after its alter rewrite the heap -- it can see all the data even under repeatable read 2<: <... completed> -ALTER +ALTER TABLE 2: select * from t_alter_snapshot_test; a | b ---+--- @@ -522,7 +522,7 @@ ALTER 1 | 1 (2 rows) 2: end; -END +COMMIT select * from t_alter_snapshot_test; a | b @@ -531,7 +531,7 @@ select * from t_alter_snapshot_test; 1 | 1 (2 rows) drop table t_alter_snapshot_test; -DROP +DROP TABLE ---------------------------------------- -- Test for fixes @@ -542,7 +542,7 @@ DROP -- have completed and no longer needed). And in that case, we -- should still be able to advance properly after restart. create table distributed_snapshot_fix1(a int); -CREATE +CREATE TABLE -- On a primary, burn xids until the next xid is the first one of a segment, -- which has 4096 (ENTRIES_PER_PAGE) * 32 (SLRU_PAGES_PER_SEGMENT) = 131072 xids. @@ -559,9 +559,9 @@ BEGIN (1 row) 1U: end; -END +COMMIT 1U: insert into distributed_snapshot_fix1 values(1); -INSERT 1 +INSERT 0 1 1Uq: ... 1q: ... @@ -614,9 +614,9 @@ select pg_ctl(datadir, 'restart') from gp_segment_configuration where role = 'p' -- test the distributed snapshot in the situation of direct dispatch 0: create table direct_dispatch_snapshot_alpha(a int, b int); -CREATE +CREATE TABLE 0: insert into direct_dispatch_snapshot_alpha select i, i from generate_series(1, 10) i; -INSERT 10 +INSERT 0 10 -- Direct dispach doesn't support transaction block. Use multiple '-c' to avoid psql creating single transaction. -- direct dispatch, one log line is expected diff --git a/src/test/isolation2/output/external_table.source b/src/test/isolation2/output/external_table.source index c737b5ac83a..59425df689e 100644 --- a/src/test/isolation2/output/external_table.source +++ b/src/test/isolation2/output/external_table.source @@ -1,20 +1,20 @@ CREATE EXTENSION IF NOT EXISTS gp_inject_fault; -CREATE +CREATE EXTENSION -- start_ignore DROP EXTERNAL TABLE IF EXISTS exttab_cursor_1; -DROP +DROP FOREIGN TABLE DROP EXTERNAL TABLE IF EXISTS exttab_cursor_2; -DROP +DROP FOREIGN TABLE -- end_ignore -- Define a cursor on an external table scan query with segment reject limit reached -- does not reach reject limit CREATE EXTERNAL TABLE exttab_cursor_1( i int, j text ) LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') FORMAT 'TEXT' (DELIMITER '|') LOG ERRORS SEGMENT REJECT LIMIT 10; -CREATE +CREATE EXTERNAL TABLE -- reaches reject limit, use the same err table CREATE EXTERNAL TABLE exttab_cursor_2( i int, j text ) LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_more_errors.data') FORMAT 'TEXT' (DELIMITER '|') LOG ERRORS SEGMENT REJECT LIMIT 2; -CREATE +CREATE EXTERNAL TABLE -- Test to make sure error logs are populated when cursors are used -- The total number of formatting errors reported by the query is dependant on the number of rows parsed on -- the segments before COMMIT finishes. So mask the NOTICE by setting the client_min_messages guc to WARNING. @@ -23,7 +23,7 @@ SET 10: BEGIN; BEGIN 10: DECLARE exttab_cur1 no scroll cursor FOR SELECT e1.i, e2.j from exttab_cursor_1 e1 INNER JOIN exttab_cursor_1 e2 ON e1.i = e2.i UNION ALL SELECT e1.i, e2.j from exttab_cursor_1 e1 INNER JOIN exttab_cursor_1 e2 ON e1.i = e2.i UNION ALL SELECT e1.i, e2.j from exttab_cursor_1 e1 INNER JOIN exttab_cursor_1 e2 ON e1.i = e2.i; -DECLARE +DECLARE CURSOR 10: COMMIT; COMMIT 10: reset CLIENT_MIN_MESSAGES; @@ -100,7 +100,7 @@ ERROR: segment reject limit reached, aborting operation (seg0 slice1 @hostname DETAIL: Last error was: invalid input syntax for type integer: "error_1", column i CONTEXT: External table exttab_cursor_2, line 7 of file://@hostname@@abs_srcdir@/data/exttab_more_errors.data, column i 10: COMMIT; -COMMIT +ROLLBACK -- Reset injected faults SELECT gp_inject_fault('transaction_abort_failure', 'reset', dbid) FROM gp_segment_configuration WHERE content=0 AND role='p'; @@ -135,7 +135,7 @@ SELECT gp_inject_fault('interconnect_setup_palloc', 'reset', dbid) FROM gp_segme 10: BEGIN; BEGIN 10: DECLARE exttab_cur1 no scroll cursor FOR (SELECT e1.i, e2.j from exttab_cursor_1 e1 INNER JOIN exttab_cursor_1 e2 ON e1.i = e2.i ORDER BY e1.i); -DECLARE +DECLARE CURSOR -- Should not fail 10: FETCH exttab_cur1; i | j @@ -196,7 +196,7 @@ GP_IGNORE:-- end_ignore -- Create external table with delimiter off CREATE EXTERNAL WEB TABLE ext_delim_off ( junk text) execute 'echo hi' on coordinator FORMAT 'text' (delimiter 'OFF' null E'\\N' escape E'\\'); -CREATE +CREATE EXTERNAL TABLE -- Query the ext_delim_off table SELECT * FROM ext_delim_off; @@ -212,7 +212,7 @@ GP_IGNORE:-- end_ignore -- Create external table(format text) with delimiter off, and a row with 'O' CREATE EXTERNAL WEB TABLE ext_delimiter_off_text (a text) EXECUTE E'echo O' ON COORDINATOR FORMAT 'text' (delimiter 'OFF') ENCODING 'UTF8'; -CREATE +CREATE EXTERNAL TABLE SELECT * FROM ext_delimiter_off_text; a @@ -227,7 +227,7 @@ GP_IGNORE:-- end_ignore -- Create external table(format csv) with delimiter off, and a row with 'O' CREATE EXTERNAL WEB TABLE ext_delimiter_off_csv (a text) EXECUTE E'echo O' ON COORDINATOR FORMAT 'csv' (delimiter 'OFF') ENCODING 'UTF8'; -CREATE +CREATE EXTERNAL TABLE SELECT * FROM ext_delimiter_off_csv; a @@ -237,12 +237,12 @@ SELECT * FROM ext_delimiter_off_csv; -- start_ignore DROP EXTERNAL TABLE IF EXISTS exttab_delimiter_escape_off; -DROP +DROP FOREIGN TABLE -- end_ignore -- Create external table(text format) with both delimiter and escape off CREATE EXTERNAL WEB TABLE exttab_delimiter_escape_off(a text) EXECUTE E'cat @abs_srcdir@/data/exttab_escape_off.data' ON SEGMENT 0 format 'TEXT' (delimiter 'OFF' escape 'OFF') encoding 'UTF8' LOG ERRORS SEGMENT REJECT LIMIT 10; -CREATE +CREATE EXTERNAL TABLE SELECT * FROM exttab_delimiter_escape_off ORDER BY a; a diff --git a/src/test/isolation2/output/fts_manual_probe.source b/src/test/isolation2/output/fts_manual_probe.source index ed3900646d3..13a24dbf685 100644 --- a/src/test/isolation2/output/fts_manual_probe.source +++ b/src/test/isolation2/output/fts_manual_probe.source @@ -24,13 +24,41 @@ select gp_inject_fault('all', 'reset', 1) from master(); (1 row) create temp table fts_probe_results(seq serial, seq_name varchar(20), current_started int, expected_start_delta int, current_done int, expected_done_delta int); -CREATE +CREATE TABLE + +-- create extension only on coordinator since the fts process is only on coordinator +create or replace function fts_probe_stats() returns table ( start_count int, done_count int, status_version int2 ) as '/@abs_builddir@/../regress/regress.so', 'gp_fts_probe_stats' language c execute on coordinator reads sql data; +CREATE FUNCTION create or replace view get_raw_stats as select seq, seq_name, current_started, expected_start_delta, current_started - min(current_started) over () as actual_start_delta, -- actual_start_delta = current_started - initial_started current_done, expected_done_delta, current_done - min(current_done) over () as actual_done_delta -- actual_done_delta = current_done - initial_done from fts_probe_results order by seq; -CREATE +CREATE VIEW create or replace view get_stats as select seq, seq_name, expected_start_delta, actual_start_delta, expected_done_delta, actual_done_delta from get_raw_stats order by seq desc limit 1; -CREATE +CREATE VIEW + +drop function if exists insert_expected_stats(int, int); +DROP FUNCTION +create or replace function insert_expected_stats(seq_name varchar(20), expected_start_delta int, expected_done_delta int) returns void as $$ INSERT INTO fts_probe_results (seq_name, current_started, expected_start_delta, current_done, expected_done_delta) /* inside a function */ SELECT seq_name, /* inside a function */ start_count AS current_started, /* inside a function */ expected_start_delta, /* inside a function */ done_count AS current_done, /* inside a function */ expected_done_delta /* inside a function */ FROM fts_probe_stats(); /* inside a function */ $$ language sql volatile; +CREATE FUNCTION + +-- ensure the internal regular probes do not affect our test +!\retcode gpconfig -c gp_fts_probe_interval -v 3600; +-- start_ignore +20190730:11:15:27:045870 gpconfig:office-5-75:dkrieger-[INFO]:-completed successfully with parameters '-c gp_fts_probe_interval -v 3600' + +-- end_ignore +(exited with code 0) +!\retcode gpstop -u; +-- start_ignore +20190730:11:15:27:045929 gpstop:office-5-75:dkrieger-[INFO]:-Starting gpstop with args: -u +20190730:11:15:27:045929 gpstop:office-5-75:dkrieger-[INFO]:-Gathering information and validating the environment... +20190730:11:15:27:045929 gpstop:office-5-75:dkrieger-[INFO]:-Obtaining Greenplum Coordinator catalog information +20190730:11:15:27:045929 gpstop:office-5-75:dkrieger-[INFO]:-Obtaining Segment details from coordinator... +20190730:11:15:27:045929 gpstop:office-5-75:dkrieger-[INFO]:-Greenplum Version: 'postgres (Greenplum Database) 7.0.0-alpha.0+dev.575.g59811832fc build dev' +20190730:11:15:27:045929 gpstop:office-5-75:dkrieger-[INFO]:-Signalling all postmaster processes to reload + +-- end_ignore +(exited with code 0) -- ensure there is no in progress ftsLoop after reloading the gp_fts_probe_interval select gp_request_fts_probe_scan(); diff --git a/src/test/isolation2/output/gp_collation.source b/src/test/isolation2/output/gp_collation.source index 47d261237cf..cde62b95d59 100644 --- a/src/test/isolation2/output/gp_collation.source +++ b/src/test/isolation2/output/gp_collation.source @@ -13,7 +13,7 @@ SELECT gp_inject_fault('collate_locale_os_lookup', 'error', dbid) from gp_segmen -- The fault injector should prevent all collations from being created by -- pg_import_system_collations(). create schema import_collation_schema; -CREATE +CREATE SCHEMA select pg_import_system_collations( (select oid from pg_namespace where nspname = 'import_collation_schema') ); ERROR: fault triggered, fault name:'collate_locale_os_lookup' fault type:'error' (seg0 127.0.1.1:25432 pid=19176) @@ -48,7 +48,7 @@ select gp_segment_id, collname from pg_collation where collname='collation_from_ ---------------+---------- (0 rows) create collation "collation_from_disk" (locale="@gp_syslocale@"); -CREATE +CREATE COLLATION select gp_segment_id, collname from pg_collation where collname='collation_from_disk'; gp_segment_id | collname ---------------+--------------------- @@ -71,7 +71,7 @@ select count(distinct oid) from gp_dist_random('pg_collation') where oid=(select -- Drop the collation, and confirm it is actually gone -- drop collation "collation_from_disk"; -DROP +DROP COLLATION select gp_segment_id, collname from pg_collation where collname='collation_from_disk'; gp_segment_id | collname ---------------+---------- @@ -90,7 +90,7 @@ select gp_segment_id, collname from pg_collation where collname='collation_from_ ---------------+---------- (0 rows) create collation "collation_from_db" from "POSIX"; -CREATE +CREATE COLLATION select gp_segment_id, collname from pg_collation where collname='collation_from_db'; gp_segment_id | collname ---------------+------------------- @@ -115,10 +115,10 @@ select count(distinct oid) from gp_dist_random('pg_collation') where oid=(select -- should not be created on any segment. -- create collation "missing_on_one_segment" from "C"; -CREATE +CREATE COLLATION -- Drop collation from one segment 2U: drop collation "missing_on_one_segment"; -DROP +DROP COLLATION select gp_segment_id, collname from gp_dist_random('pg_collation') where oid=(select oid from pg_collation where collname='missing_on_one_segment'); gp_segment_id | collname ---------------+------------------------ @@ -141,11 +141,11 @@ select gp_segment_id, collname from gp_dist_random('pg_collation') where collnam -- Clean up table missing_on_one_segement -1U: drop collation "missing_on_one_segment"; -DROP +DROP COLLATION 0U: drop collation "missing_on_one_segment"; -DROP +DROP COLLATION 1U: drop collation "missing_on_one_segment"; -DROP +DROP COLLATION -- -- Simulate a locale missing on one segment at collation creation. If this @@ -191,7 +191,7 @@ select gp_segment_id, collname from pg_collation where collname='locale_missing_ ---------------+---------- (0 rows) create collation "locale_missing_on_one_segment" (locale="@gp_syslocale@"); -CREATE +CREATE COLLATION -- Confirm is on all segments. select gp_segment_id, collname from pg_collation where collname='locale_missing_on_one_segment'; gp_segment_id | collname @@ -207,11 +207,11 @@ select gp_segment_id, collname from gp_dist_random('pg_collation') where collnam (3 rows) create table uses_collation (a text collate locale_missing_on_one_segment); -CREATE +CREATE TABLE -- The case here aims to insert two tuples to seg0. -- Under jump consistent hash, ('abc'), ('012') goes to seg0. insert into uses_collation values ('abc'), ('012'); -INSERT 2 +INSERT 0 2 SELECT gp_inject_fault('collate_locale_os_lookup', 'error', dbid) from gp_segment_configuration where content = 0 and role = 'p'; gp_inject_fault diff --git a/src/test/isolation2/output/idle_gang_cleaner.source b/src/test/isolation2/output/idle_gang_cleaner.source index 7510ccd1b53..4904046404c 100644 --- a/src/test/isolation2/output/idle_gang_cleaner.source +++ b/src/test/isolation2/output/idle_gang_cleaner.source @@ -4,18 +4,26 @@ -- clean up the idle writer gangs after the timeout, -- no snapshot collision error should occur. +create or replace language plpython3u; +CREATE LANGUAGE +create extension if not exists gp_inject_fault; +CREATE EXTENSION + +CREATE OR REPLACE FUNCTION idle_gang_pressure_test() RETURNS VOID LANGUAGE plpython3u AS $$ plpy.execute("SET gp_vmem_idle_resource_timeout = 1") for i in range(1000): plpy.execute("SELECT count(*) from idle_gang_cleaner_t a join idle_gang_cleaner_t b using (c2);") plpy.execute("RESET gp_vmem_idle_resource_timeout") $$; +CREATE FUNCTION + set gp_vmem_idle_resource_timeout to '0.5s'; SET set gp_snapshotadd_timeout to 0; SET create table target_session_id_t(target_session_id int) DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE insert into target_session_id_t values(current_setting('gp_session_id')::int); -INSERT 1 +INSERT 0 1 create table idle_gang_cleaner_t (c1 int, c2 int); -CREATE +CREATE TABLE 0U: select gp_inject_fault('proc_kill', 'suspend', 2, target_session_id) from target_session_id_t; gp_inject_fault @@ -47,10 +55,43 @@ select count(*) from idle_gang_cleaner_t a join idle_gang_cleaner_t b using (c2) Success: (1 row) +-- Release idle Reader gangs in transaction or transaction block +0U: select gp_inject_fault('proc_kill', 'suspend', 2, target_session_id) from target_session_id_t; + gp_inject_fault +----------------- + Success: +(1 row) + +begin; +BEGIN +select count(*) from idle_gang_cleaner_t a join idle_gang_cleaner_t b using (c2) ; + count +------- + 0 +(1 row) +0U: select gp_inject_fault('proc_kill', 'wait_until_triggered', '','','', 1, 1, 1, 2 ,target_session_id) from target_session_id_t; + gp_inject_fault +----------------- + Success: +(1 row) +0U: select gp_inject_fault('proc_kill', 'reset', 2, target_session_id) from target_session_id_t; + gp_inject_fault +----------------- + Success: +(1 row) +end; +COMMIT + +select idle_gang_pressure_test(); + idle_gang_pressure_test +------------------------- + +(1 row) + drop table target_session_id_t; -DROP +DROP TABLE drop table idle_gang_cleaner_t; -DROP +DROP TABLE reset gp_vmem_idle_resource_timeout; RESET reset gp_snapshotadd_timeout; diff --git a/src/test/isolation2/output/parallel_retrieve_cursor/corner.source b/src/test/isolation2/output/parallel_retrieve_cursor/corner.source index 438a106dd9a..3f32d219d8a 100644 --- a/src/test/isolation2/output/parallel_retrieve_cursor/corner.source +++ b/src/test/isolation2/output/parallel_retrieve_cursor/corner.source @@ -1,48 +1,48 @@ DROP TABLE IF EXISTS t1; -DROP +DROP TABLE CREATE TABLE t1 (a INT) DISTRIBUTED by (a); -CREATE +CREATE TABLE insert into t1 select generate_series(1,100); -INSERT 100 +INSERT 0 100 DROP TABLE IF EXISTS t11; -DROP +DROP TABLE CREATE TABLE t11 (a INT) DISTRIBUTED by (a); -CREATE +CREATE TABLE insert into t11 select generate_series(1,100000); -INSERT 100000 +INSERT 0 100000 DROP TABLE IF EXISTS t2; -DROP +DROP TABLE CREATE TABLE t2 (a INT) DISTRIBUTED by (a); -CREATE +CREATE TABLE DROP TABLE IF EXISTS t3; -DROP +DROP TABLE CREATE TABLE t3 (a text) DISTRIBUTED by (a); -CREATE +CREATE TABLE COPY t3 FROM PROGRAM 'for i in `seq 1 10`; do echo ${i}test; done'; COPY 10 DROP TABLE IF EXISTS t4; -DROP +DROP TABLE CREATE TABLE t4 (a text) DISTRIBUTED by (a); -CREATE +CREATE TABLE DROP TABLE IF EXISTS t5; -DROP +DROP TABLE CREATE TABLE t5 (b INT) DISTRIBUTED by (b); -CREATE +CREATE TABLE INSERT INTO t5 SELECT GENERATE_SERIES(1, 10); -INSERT 10 +INSERT 0 10 -- Test1: close not executed PARALLEL RETRIEVE CURSOR 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 1 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id1 | token_id | host_id | port_id | READY endpoint_id1 | token_id | host_id | port_id | READY endpoint_id1 | token_id | host_id | port_id | READY (3 rows) 1: CLOSE c1; -CLOSE +CLOSE CURSOR -- check no endpoint info 1: SELECT auth_token,state FROM gp_get_endpoints() WHERE cursorname='c1'; auth_token | state @@ -76,14 +76,14 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c11 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t11; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 11 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c11'; endpoint_id11 | token_id | host_id | port_id | READY endpoint_id11 | token_id | host_id | port_id | READY endpoint_id11 | token_id | host_id | port_id | READY (3 rows) 1: CLOSE c11; -CLOSE +CLOSE CURSOR -- check no endpoint info 1: SELECT auth_token,state FROM gp_get_endpoints() WHERE cursorname='c11'; auth_token | state @@ -117,27 +117,27 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c7 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c8 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c9 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c10 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c11 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: ROLLBACK; ROLLBACK -- check no endpoint info @@ -150,7 +150,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', -1); ERROR: cursor "c2" does not exist 1: ROLLBACK; @@ -158,7 +158,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c2', 0); ERROR: cursor "c2" does not exist 1: ROLLBACK; @@ -173,27 +173,27 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c7 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c8 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c9 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c10 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c11 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c2'; endpoint_id2 | token_id | host_id | port_id | READY endpoint_id2 | token_id | host_id | port_id | READY @@ -377,7 +377,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE CURSOR 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; ERROR: cursor "c1" already exists -- check no endpoint info @@ -389,9 +389,9 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE CURSOR 1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c2'; endpoint_id2 | token_id | host_id | port_id | READY endpoint_id2 | token_id | host_id | port_id | READY @@ -559,7 +559,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1 ORDER BY a LIMIT 10; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c2'; endpoint_id2 | token_id | host_id | port_id | READY (1 row) @@ -634,7 +634,7 @@ Sessions not started cannot be quit 1: BEGIN; BEGIN 1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1 ORDER BY a LIMIT 0; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c2'; endpoint_id2 | token_id | host_id | port_id | READY (1 row) @@ -704,7 +704,7 @@ Sessions not started cannot be quit 1: BEGIN; BEGIN 1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t2; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c2'; endpoint_id2 | token_id | host_id | port_id | READY endpoint_id2 | token_id | host_id | port_id | READY @@ -782,7 +782,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t3; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c2'; endpoint_id2 | token_id | host_id | port_id | READY endpoint_id2 | token_id | host_id | port_id | READY @@ -870,7 +870,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t4; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c2'; endpoint_id2 | token_id | host_id | port_id | READY endpoint_id2 | token_id | host_id | port_id | READY @@ -948,7 +948,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1 WHERE a = 50; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id2 | token_id | host_id | port_id | READY (1 row) @@ -995,7 +995,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT SUM(a) FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id2 | token_id | host_id | port_id | READY (1 row) @@ -1041,7 +1041,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT AVG(a) FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id2 | token_id | host_id | port_id | READY (1 row) @@ -1081,7 +1081,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT COUNT(*) FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id2 | token_id | host_id | port_id | READY (1 row) @@ -1117,7 +1117,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1, t5 where t1.a = t5.b; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id2 | token_id | host_id | port_id | READY endpoint_id2 | token_id | host_id | port_id | READY @@ -1175,7 +1175,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT COUNT(*) FROM t1, t5 where t1.a = t5.b; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id2 | token_id | host_id | port_id | READY (1 row) @@ -1206,7 +1206,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id2 | token_id | host_id | port_id | READY endpoint_id2 | token_id | host_id | port_id | READY @@ -1355,9 +1355,9 @@ DECLARE t (1 row) 1: CLOSE c1; -CLOSE +CLOSE CURSOR 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id2 | token_id | host_id | port_id | READY endpoint_id2 | token_id | host_id | port_id | READY @@ -1524,7 +1524,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id2 | token_id | host_id | port_id | READY endpoint_id2 | token_id | host_id | port_id | READY @@ -1677,9 +1677,9 @@ DECLARE t (1 row) 1: CLOSE c1; -CLOSE +CLOSE CURSOR 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id2 | token_id | host_id | port_id | READY endpoint_id2 | token_id | host_id | port_id | READY @@ -1848,7 +1848,7 @@ BEGIN 1: SAVEPOINT s1; SAVEPOINT 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id2 | token_id | host_id | port_id | READY endpoint_id2 | token_id | host_id | port_id | READY @@ -1868,11 +1868,11 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: SAVEPOINT s1; SAVEPOINT 1: CLOSE c1; -CLOSE +CLOSE CURSOR 1: ROLLBACK TO s1; ROLLBACK 1: SELECT * FROM pg_cursors WHERE name='c1'; @@ -1887,7 +1887,7 @@ COMMIT 1: BEGIN; BEGIN 1: DECLARE c21a PARALLEL RETRIEVE CURSOR FOR SELECT COUNT(*) from t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'get_tuple_cell TOKEN21a 1 1 ; create_match_sub $TOKEN21a token21a' : SELECT auth_token FROM gp_get_endpoints() WHERE cursorname='c21a'; auth_token ---------------------------------- @@ -1895,9 +1895,9 @@ DECLARE (1 row) -- Declare more cursors in the same session should not change the first one's token 1: DECLARE c21b PARALLEL RETRIEVE CURSOR FOR SELECT COUNT(*) from t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c21c PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: SELECT auth_token FROM gp_get_endpoints() WHERE cursorname='c21a'; auth_token ---------------------------------- @@ -1915,7 +1915,7 @@ Sessions not started cannot be quit 1: BEGIN; BEGIN 1: DECLARE c22 PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM generate_series(1,10); -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 22 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c22'; endpoint_id22 | token_id | host_id | port_id | READY (1 row) @@ -1992,7 +1992,7 @@ Sessions not started cannot be quit 1: BEGIN; BEGIN 1: DECLARE c23 PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT relname FROM pg_class where relname='pg_class'; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 23 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c23'; endpoint_id23 | token_id | host_id | port_id | READY (1 row) @@ -2058,11 +2058,11 @@ Sessions not started cannot be quit 1: BEGIN; BEGIN 1: DECLARE "x12345678901234567890123456789012345678901234567890123456789x" PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t5; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE "x123456789012345678901234567890123456789012345678901234567890123456789x" PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t5; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE "x1234567890123456789012345678901234567890123456789012345678901x" PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t5; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 24 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='x12345678901234567890123456789012345678901234567890123456789x'; endpoint_id24 | token_id | host_id | port_id | READY endpoint_id24 | token_id | host_id | port_id | READY @@ -2165,7 +2165,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE "x123456789012345678901234567890123456789012345678901234567890123456789x" PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE "x123456789012345678901234567890123456789012345678901234567890123456789y" PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t1; ERROR: cursor "x12345678901234567890123456789012345678901234567890123456789012" already exists 1: ROLLBACK; @@ -2175,7 +2175,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t5; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 26 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c2'; endpoint_id26 | token_id | host_id | port_id | READY endpoint_id26 | token_id | host_id | port_id | READY @@ -2201,7 +2201,7 @@ ERROR: another session (pid: 46988) used the endpoint and completed retrieving -- check no endpoint info 1: CLOSE C2; -CLOSE +CLOSE CURSOR 1: COMMIT; COMMIT @@ -2209,7 +2209,7 @@ COMMIT 1: BEGIN; BEGIN 1: DECLARE c27 PARALLEL RETRIEVE CURSOR FOR SELECT generate_series(1,10); -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 27 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c27'; endpoint_id27 | token_id | host_id | port_id | READY (1 row) @@ -2287,14 +2287,14 @@ ERROR: Parallel retrieve cursor should run on the dispatcher only -- Final: clean up DROP TABLE t1; -DROP +DROP TABLE DROP TABLE t11; -DROP +DROP TABLE DROP TABLE t2; -DROP +DROP TABLE DROP TABLE t3; -DROP +DROP TABLE DROP TABLE t4; -DROP +DROP TABLE DROP TABLE t5; -DROP +DROP TABLE diff --git a/src/test/isolation2/output/parallel_retrieve_cursor/explain.source b/src/test/isolation2/output/parallel_retrieve_cursor/explain.source index e26fe7bd9fa..fe6e3fefe1d 100644 --- a/src/test/isolation2/output/parallel_retrieve_cursor/explain.source +++ b/src/test/isolation2/output/parallel_retrieve_cursor/explain.source @@ -14,21 +14,21 @@ set enable_incremental_sort=on; SET DROP TABLE IF EXISTS t1; -DROP +DROP TABLE CREATE TABLE t1 (a INT) DISTRIBUTED by (a); -CREATE +CREATE TABLE insert into t1 select generate_series(1,100); -INSERT 100 +INSERT 0 100 CREATE TABLE t2 (a INT) DISTRIBUTED RANDOMLY; -CREATE +CREATE TABLE insert into t2 select generate_series(1,100); -INSERT 100 +INSERT 0 100 DROP TABLE IF EXISTS rt1; -DROP +DROP TABLE CREATE TABLE rt1 (a INT) DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE insert into rt1 select generate_series(1,100); -INSERT 100 +INSERT 0 100 -- PARALLEL RETRIEVE CURSOR with other options (WITH HOLD/SCROLL) is not supported EXPLAIN (COSTS false) DECLARE c1 PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t1; diff --git a/src/test/isolation2/output/parallel_retrieve_cursor/fault_inject.source b/src/test/isolation2/output/parallel_retrieve_cursor/fault_inject.source index 4539da90f54..7013130a2f2 100644 --- a/src/test/isolation2/output/parallel_retrieve_cursor/fault_inject.source +++ b/src/test/isolation2/output/parallel_retrieve_cursor/fault_inject.source @@ -1,11 +1,11 @@ -- @Description Tests with faut inject -- DROP TABLE IF EXISTS t1; -DROP +DROP TABLE CREATE TABLE t1 (a INT) DISTRIBUTED by (a); -CREATE +CREATE TABLE insert into t1 select generate_series(1,100); -INSERT 100 +INSERT 0 100 --------- Test1: fault injection end-point shared memory slot full on QE 2: SELECT gp_inject_fault('alloc_endpoint_slot_full', 'reset', 2); @@ -48,7 +48,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id1 | token_id | host_id | port_id | READY endpoint_id1 | token_id | host_id | port_id | READY @@ -197,7 +197,7 @@ DECLARE t (1 row) 1: CLOSE c1; -CLOSE +CLOSE CURSOR -- check no endpoint info 1: SELECT auth_token,state FROM gp_get_endpoints() WHERE cursorname='c1' or endpointname='DUMMYENDPOINTNAME'; auth_token | state @@ -239,7 +239,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id2 | token_id | host_id | port_id | READY endpoint_id2 | token_id | host_id | port_id | READY @@ -301,7 +301,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 3 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id3 | token_id | host_id | port_id | READY endpoint_id3 | token_id | host_id | port_id | READY @@ -358,7 +358,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 4 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id4 | token_id | host_id | port_id | READY endpoint_id4 | token_id | host_id | port_id | READY @@ -476,7 +476,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 5 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id5 | token_id | host_id | port_id | READY endpoint_id5 | token_id | host_id | port_id | READY @@ -576,7 +576,7 @@ SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'suspend', '', '', '', 5, 5 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 7 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id7 | token_id | host_id | port_id | READY endpoint_id7 | token_id | host_id | port_id | READY @@ -610,7 +610,7 @@ DECLARE f (1 row) 1: CLOSE c1; -CLOSE +CLOSE CURSOR SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'resume', 2); gp_inject_fault @@ -638,7 +638,7 @@ ERROR: endpoint is not available because the parallel retrieve cursor was abort 1: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); ERROR: cursor "c1" does not exist 1: END; -END +ROLLBACK 1: SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', 2); gp_inject_fault ----------------- @@ -656,15 +656,15 @@ END (1 row) DROP TABLE t1; -DROP +DROP TABLE -- Test7: error inject at the 1000th time while retrieving tuples from endpoint. other retrieve session finished. DROP TABLE IF EXISTS t2; -DROP +DROP TABLE CREATE TABLE t2 (a INT) DISTRIBUTED by (a); -CREATE +CREATE TABLE insert into t2 select generate_series(1,10000); -INSERT 10000 +INSERT 0 10000 SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'reset', dbid) FROM gp_segment_configuration WHERE content=1 AND role='p'; gp_inject_fault @@ -700,7 +700,7 @@ SELECT gp_inject_fault('fetch_tuples_from_endpoint', 'suspend', '', '', '', 800, 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * from t2; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 6 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id6 | token_id | host_id | port_id | READY endpoint_id6 | token_id | host_id | port_id | READY @@ -770,4 +770,4 @@ ROLLBACK (1 row) DROP TABLE t2; -DROP +DROP TABLE diff --git a/src/test/isolation2/output/parallel_retrieve_cursor/privilege.source b/src/test/isolation2/output/parallel_retrieve_cursor/privilege.source index 30a0bc1f158..1ac85b2cb3b 100644 --- a/src/test/isolation2/output/parallel_retrieve_cursor/privilege.source +++ b/src/test/isolation2/output/parallel_retrieve_cursor/privilege.source @@ -1,36 +1,36 @@ -- @Description Tests the privileges related with endpoints -- DROP TABLE IF EXISTS t1; -DROP +DROP TABLE DROP USER IF EXISTS adminuser; -DROP +DROP ROLE DROP USER IF EXISTS u1; -DROP +DROP ROLE DROP USER IF EXISTS uu1; -DROP +DROP ROLE DROP USER IF EXISTS u2; -DROP +DROP ROLE CREATE USER adminuser; -CREATE +CREATE ROLE ALTER USER adminuser WITH SUPERUSER; -ALTER +ALTER ROLE CREATE USER u1 with CREATEROLE; -CREATE +CREATE ROLE CREATE USER u2; -CREATE +CREATE ROLE SET SESSION AUTHORIZATION u1; SET CREATE TABLE t1 (a INT) DISTRIBUTED by (a); -CREATE +CREATE TABLE insert into t1 select generate_series(1,10); -INSERT 10 +INSERT 0 10 CREATE USER uu1; -CREATE +CREATE ROLE GRANT ALL PRIVILEGES ON t1 TO uu1; GRANT GRANT uu1 TO u1; -GRANT +GRANT ROLE RESET SESSION AUTHORIZATION; RESET @@ -47,7 +47,7 @@ SET 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id1 | token_id | host_id | port_id | READY endpoint_id1 | token_id | host_id | port_id | READY @@ -62,10 +62,10 @@ SET (1 row) --- c2 is declared by u1 1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR --- c12 is declared by u1 on entry db 1: DECLARE c12 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM generate_series(1,10); -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR --- u1 is able to see all endpoints created by himself. 1: SELECT DISTINCT(cursorname), username FROM gp_get_endpoints(); cursorname | username @@ -161,7 +161,7 @@ SET u1 | uu1 (1 row) 1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 2: @post_run 'parse_endpoint_info 3 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c3'; endpoint_id3 | token_id | host_id | port_id | READY endpoint_id3 | token_id | host_id | port_id | READY @@ -215,7 +215,7 @@ HINT: Use the same user as the PARALLEL RETRIEVE CURSOR creator to retrieve. 1<: <... completed> FAILED: Execution failed 1: END; -END +COMMIT 2q: ... 3: @pre_run 'unset RETRIEVE_USER; echo $RAW_STR ' : SELECT 1; ?column? @@ -237,12 +237,12 @@ SET BEGIN -- Used to let super login to retrieve session so then it can change user in session. 1: DECLARE c0 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: SET SESSION AUTHORIZATION u1; SET --- c1 is declared and executed by u1 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1&: SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); 2: @post_run 'parse_endpoint_info 40 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c0'; @@ -305,7 +305,7 @@ ERROR: canceling statement due to user request 1: CLOSE c1; ERROR: current transaction is aborted, commands ignored until end of transaction block 1: END; -END +ROLLBACK 1q: ... 3q: ... 0Rq: ... @@ -320,14 +320,14 @@ SET 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR --- Close c1 by adminuser 1: SET SESSION AUTHORIZATION adminuser; SET 1: CLOSE c1; -CLOSE +CLOSE CURSOR 1: END; -END +COMMIT --------- Test4: u2 should NOT be able to see or retrieve from u1's endpoints @@ -342,7 +342,7 @@ SET BEGIN -- Used to let super login to retrieve session so then it can change user in session. 1: DECLARE c0 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 50 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c0'; endpoint_id50 | token_id | host_id | port_id | READY endpoint_id50 | token_id | host_id | port_id | READY @@ -352,7 +352,7 @@ DECLARE SET --- c4 is declared and executed by u1 1: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 5 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c4'; endpoint_id5 | token_id | host_id | port_id | READY endpoint_id5 | token_id | host_id | port_id | READY @@ -430,7 +430,7 @@ ERROR: canceling statement due to user request 1: CLOSE c4; ERROR: current transaction is aborted, commands ignored until end of transaction block 1: END; -END +ROLLBACK 0Rq: ... 1Rq: ... 2Rq: ... diff --git a/src/test/isolation2/output/parallel_retrieve_cursor/replicated_table.source b/src/test/isolation2/output/parallel_retrieve_cursor/replicated_table.source index 75aa878a48a..eaa724d73d7 100644 --- a/src/test/isolation2/output/parallel_retrieve_cursor/replicated_table.source +++ b/src/test/isolation2/output/parallel_retrieve_cursor/replicated_table.source @@ -1,11 +1,11 @@ -- @Description Tests the PARALLEL RETRIEVE CURSOR for select replcated table -- DROP TABLE IF EXISTS rt1; -DROP +DROP TABLE CREATE TABLE rt1 (a INT) DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE insert into rt1 select generate_series(1,100); -INSERT 100 +INSERT 0 100 --------- Test1: Basic test for PARALLEL RETRIEVE CURSOR on replicated table @@ -16,7 +16,7 @@ INSERT 100 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: SELECT sc.content = current_setting('gp_session_id')::int % 3 AS diff FROM gp_get_endpoints() ep, gp_segment_configuration sc WHERE ep.gp_segment_id = sc.content; diff ------ @@ -31,27 +31,27 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 ORDER BY a; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 2: BEGIN; BEGIN 2: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 ORDER BY a; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 3: BEGIN; BEGIN 3: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 ORDER BY a; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 4: BEGIN; BEGIN 4: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 ORDER BY a; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 5: BEGIN; BEGIN 5: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 ORDER BY a; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 6: BEGIN; BEGIN 6: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 ORDER BY a; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR -- Here because replicated table will execute on seg id: session_id % segment_number -- Just declare & CHECK PARALLEL RETRIEVE CURSORs in all segment_number (i.e. 3) sessions, @@ -161,27 +161,27 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 2: BEGIN; BEGIN 2: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 3: BEGIN; BEGIN 3: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 4: BEGIN; BEGIN 4: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 5: BEGIN; BEGIN 5: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 6: BEGIN; BEGIN 6: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR -- Here because replicated table will execute on seg id: session_id % segment_number -- Just declare & CHECK PARALLEL RETRIEVE CURSORs in all segment_number (i.e. 3) sessions, @@ -291,27 +291,27 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1 OR MOD(a,3)=2; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 2: BEGIN; BEGIN 2: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1 OR MOD(a,3)=2; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 3: BEGIN; BEGIN 3: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1 OR MOD(a,3)=2; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 4: BEGIN; BEGIN 4: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1 OR MOD(a,3)=2; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 5: BEGIN; BEGIN 5: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1 OR MOD(a,3)=2; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 6: BEGIN; BEGIN 6: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM rt1 WHERE MOD(a,3)=1 OR MOD(a,3)=2; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR -- Here because replicated table will execute on seg id: session_id % segment_number -- Just declare & CHECK PARALLEL RETRIEVE CURSORs in all segment_number (i.e. 3) sessions, diff --git a/src/test/isolation2/output/parallel_retrieve_cursor/retrieve_quit_check.source b/src/test/isolation2/output/parallel_retrieve_cursor/retrieve_quit_check.source index ccb3dbe61f8..a941fe8a9d2 100644 --- a/src/test/isolation2/output/parallel_retrieve_cursor/retrieve_quit_check.source +++ b/src/test/isolation2/output/parallel_retrieve_cursor/retrieve_quit_check.source @@ -2,21 +2,21 @@ -- Test quitting retrieve sessions interfering with multiple endpoints when calling -- gp_wait_parallel_retrieve_cursor. DROP TABLE IF EXISTS t1; -DROP +DROP TABLE CREATE TABLE t1 (a INT) DISTRIBUTED by (a); -CREATE +CREATE TABLE insert into t1 select generate_series(1,100); -INSERT 100 +INSERT 0 100 --------- Test1: test for quit retrieve will cancel all unfinished QE backend 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id1 | token_id | host_id | port_id | READY endpoint_id1 | token_id | host_id | port_id | READY @@ -191,7 +191,7 @@ ERROR: current transaction is aborted, commands ignored until end of transactio (0 rows) 1: END; -END +ROLLBACK 2: SELECT cursorname, state FROM gp_get_endpoints(); cursorname | state diff --git a/src/test/isolation2/output/parallel_retrieve_cursor/retrieve_quit_wait.source b/src/test/isolation2/output/parallel_retrieve_cursor/retrieve_quit_wait.source index 843a2e50834..80ecb233932 100644 --- a/src/test/isolation2/output/parallel_retrieve_cursor/retrieve_quit_wait.source +++ b/src/test/isolation2/output/parallel_retrieve_cursor/retrieve_quit_wait.source @@ -2,21 +2,21 @@ -- Test quitting retrieve sessions interfering with multiple endpoints when calling -- gp_wait_parallel_retrieve_cursor. DROP TABLE IF EXISTS t1; -DROP +DROP TABLE CREATE TABLE t1 (a INT) DISTRIBUTED by (a); -CREATE +CREATE TABLE insert into t1 select generate_series(1,100); -INSERT 100 +INSERT 0 100 --------- Test1: test for wait for a finished endpoint 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id1 | token_id | host_id | port_id | READY endpoint_id1 | token_id | host_id | port_id | READY @@ -268,11 +268,11 @@ ERROR: canceling MPP operation: "Endpoint retrieve session is quitting. All unf 1: BEGIN; BEGIN 1: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 4 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c4'; endpoint_id4 | token_id | host_id | port_id | READY endpoint_id4 | token_id | host_id | port_id | READY diff --git a/src/test/isolation2/output/parallel_retrieve_cursor/security.source b/src/test/isolation2/output/parallel_retrieve_cursor/security.source index 24c492f6732..ba98a51f3c1 100644 --- a/src/test/isolation2/output/parallel_retrieve_cursor/security.source +++ b/src/test/isolation2/output/parallel_retrieve_cursor/security.source @@ -1,14 +1,14 @@ -- @Description Tests retrieve session functionality restriction for security. -- DROP TABLE IF EXISTS t1; -DROP +DROP TABLE CREATE TABLE t1 (a INT) DISTRIBUTED by (a); -CREATE +CREATE TABLE insert into t1 select generate_series(1,100); -INSERT 100 +INSERT 0 100 CREATE OR REPLACE FUNCTION myappend(anyarray, anyelement) RETURNS anyarray AS $$ SELECT $1 || $2 $$ LANGUAGE SQL; -CREATE +CREATE FUNCTION -- Test: Retrieve login without valid token. 1: @pre_run 'export RETRIEVE_TOKEN="123" ; echo $RAW_STR' : SELECT 1; @@ -25,7 +25,7 @@ CREATE 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id1 | token_id | host_id | port_id | READY endpoint_id1 | token_id | host_id | port_id | READY diff --git a/src/test/isolation2/output/parallel_retrieve_cursor/special_query.source b/src/test/isolation2/output/parallel_retrieve_cursor/special_query.source index 81201f3033d..20baa684a5f 100644 --- a/src/test/isolation2/output/parallel_retrieve_cursor/special_query.source +++ b/src/test/isolation2/output/parallel_retrieve_cursor/special_query.source @@ -3,12 +3,12 @@ --------- Test1: test for PARALLEL RETRIEVE CURSOR on select transient record types DROP TABLE IF EXISTS t1; -DROP +DROP TABLE CREATE TABLE t1 AS SELECT generate_series(1, 10) AS x DISTRIBUTED by (x); -CREATE 10 +SELECT 10 CREATE OR REPLACE FUNCTION make_record(n int) RETURNS RECORD LANGUAGE plpgsql AS ' BEGIN RETURN CASE n WHEN 1 THEN ROW(1) WHEN 2 THEN ROW(1, 2) WHEN 3 THEN ROW(1, 2, 3) WHEN 4 THEN ROW(1, 2, 3, 4) ELSE ROW(1, 2, 3, 4, 5) END; END; '; -CREATE +CREATE FUNCTION SELECT make_record(x) FROM t1; make_record @@ -28,7 +28,7 @@ SELECT make_record(x) FROM t1; 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT make_record(x) FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 1 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id1 | token_id | host_id | port_id | READY endpoint_id1 | token_id | host_id | port_id | READY @@ -93,13 +93,13 @@ DECLARE t (1 row) 1: CLOSE c1; -CLOSE +CLOSE CURSOR --------- Test1.1: test for PARALLEL RETRIEVE CURSOR on select transient record types and multi-retrieve 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT make_record(x) FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 1 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id1 | token_id | host_id | port_id | READY endpoint_id1 | token_id | host_id | port_id | READY @@ -194,12 +194,12 @@ DECLARE t (1 row) 1: CLOSE c1; -CLOSE +CLOSE CURSOR 1: CREATE OR REPLACE FUNCTION make_record2(n int) RETURNS RECORD LANGUAGE plpgsql AS ' BEGIN RETURN CASE n WHEN 1 THEN ROW(1,2,3) WHEN 2 THEN ROW(1,2,3,4) WHEN 3 THEN ROW(1,2,3,4,5) WHEN 4 THEN ROW(1,2,3,4,5,6) ELSE ROW(1,2,3,4,5,6,7) END; END; '; -CREATE +CREATE FUNCTION 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT make_record2(x) FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 1 1 2 3 4': SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id1 | token_id | host_id | port_id | READY endpoint_id1 | token_id | host_id | port_id | READY @@ -266,7 +266,7 @@ DECLARE t (1 row) 1: CLOSE c1; -CLOSE +CLOSE CURSOR --------- Test2: test for PARALLEL RETRIEVE CURSOR on select with join statement. -- there was a hang issue when declaring PARALLEL RETRIEVE CURSOR with join clause. @@ -295,12 +295,12 @@ CLOSE (exited with code 0) DROP TABLE IF EXISTS t2; -DROP +DROP TABLE CREATE TABLE t2 (a BIGINT) DISTRIBUTED by (a); -CREATE +CREATE TABLE insert into t2 select generate_series(1,2000); -INSERT 2000 +INSERT 0 2000 SET gp_interconnect_snd_queue_depth=1; SET @@ -316,7 +316,7 @@ BEGIN 512 (1 row) 2: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t2 join t2 t12 on true; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 2: SELECT state FROM gp_get_endpoints() WHERE cursorname='c2'; state ------- @@ -325,13 +325,13 @@ DECLARE READY (3 rows) 2: CLOSE c2; -CLOSE +CLOSE CURSOR 2: END; -END +COMMIT -- cleanup DROP TABLE t2; -DROP +DROP TABLE !\retcode gpconfig -r gp_max_packet_size; -- start_ignore 20210729:16:23:43:000489 gpconfig:lhlgpdb7:gpadmin-[INFO]:-completed successfully with parameters '-r gp_max_packet_size' diff --git a/src/test/isolation2/output/parallel_retrieve_cursor/status_check.source b/src/test/isolation2/output/parallel_retrieve_cursor/status_check.source index f05bed21e10..caea003c190 100644 --- a/src/test/isolation2/output/parallel_retrieve_cursor/status_check.source +++ b/src/test/isolation2/output/parallel_retrieve_cursor/status_check.source @@ -2,17 +2,17 @@ -- need to fault injection to gp_wait_parallel_retrieve_cursor() -- DROP TABLE IF EXISTS t1; -DROP +DROP TABLE CREATE TABLE t1 (a INT) DISTRIBUTED by (a); -CREATE +CREATE TABLE insert into t1 select generate_series(1,100); -INSERT 100 +INSERT 0 100 --------- Test1: Basic test for parallel retrieve interface & close cursor 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id1 | token_id | host_id | port_id | READY endpoint_id1 | token_id | host_id | port_id | READY @@ -165,7 +165,7 @@ DECLARE t (1 row) 1: CLOSE c1; -CLOSE +CLOSE CURSOR -- check no endpoint info 1: SELECT auth_token,state FROM gp_get_endpoints() WHERE cursorname='c1'; auth_token | state @@ -199,7 +199,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c2'; endpoint_id2 | token_id | host_id | port_id | READY endpoint_id2 | token_id | host_id | port_id | READY @@ -467,7 +467,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 3 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c3'; endpoint_id3 | token_id | host_id | port_id | READY endpoint_id3 | token_id | host_id | port_id | READY @@ -618,7 +618,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 4 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c4'; endpoint_id4 | token_id | host_id | port_id | READY endpoint_id4 | token_id | host_id | port_id | READY @@ -768,7 +768,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 5 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c5'; endpoint_id5 | token_id | host_id | port_id | READY endpoint_id5 | token_id | host_id | port_id | READY @@ -929,7 +929,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 6 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c6'; endpoint_id6 | token_id | host_id | port_id | READY endpoint_id6 | token_id | host_id | port_id | READY @@ -1071,7 +1071,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c61 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 61 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c61'; endpoint_id61 | token_id | host_id | port_id | READY endpoint_id61 | token_id | host_id | port_id | READY @@ -1211,7 +1211,7 @@ ERROR: canceling statement due to user request 1: BEGIN; BEGIN 1: DECLARE c7 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 7 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c7'; endpoint_id7 | token_id | host_id | port_id | READY endpoint_id7 | token_id | host_id | port_id | READY @@ -1353,7 +1353,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c8 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'get_tuple_cell SESSION81 1 1 ; create_match_sub_with_spaces $SESSION81 session81' : SELECT sessionid,state FROM gp_get_session_endpoints() WHERE cursorname='c8'; sessionid | state -----------+------- @@ -1365,7 +1365,7 @@ DECLARE 2: BEGIN; BEGIN 2: DECLARE c8 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 2: @post_run 'get_tuple_cell SESSION82 1 1 ; create_match_sub_with_spaces $SESSION82 session82' : SELECT sessionid,state FROM gp_get_session_endpoints() WHERE cursorname='c8'; sessionid | state -----------+------- @@ -1386,13 +1386,13 @@ DECLARE (6 rows) 1: CLOSE c8; -CLOSE +CLOSE CURSOR 1: END; -END +COMMIT 2: CLOSE c8; -CLOSE +CLOSE CURSOR 2: END; -END +COMMIT ---------- Test9: Test parallel retrieve cursor auto-check 1: drop table if exists t1; diff --git a/src/test/isolation2/output/parallel_retrieve_cursor/status_wait.source b/src/test/isolation2/output/parallel_retrieve_cursor/status_wait.source index cdb6488879a..cf1721719be 100644 --- a/src/test/isolation2/output/parallel_retrieve_cursor/status_wait.source +++ b/src/test/isolation2/output/parallel_retrieve_cursor/status_wait.source @@ -1,17 +1,17 @@ -- @Description Tests the state for pg_endpoints AND gp_get_segment_endpoints(), focus in wait mode -- DROP TABLE IF EXISTS t1; -DROP +DROP TABLE CREATE TABLE t1 (a INT) DISTRIBUTED by (a); -CREATE +CREATE TABLE insert into t1 select generate_series(1,100); -INSERT 100 +INSERT 0 100 --------- Test1: Basic test for parallel retrieve interface & close cursor 1: BEGIN; BEGIN 1: DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 1 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c1'; endpoint_id1 | token_id | host_id | port_id | READY endpoint_id1 | token_id | host_id | port_id | READY @@ -160,7 +160,7 @@ DECLARE t (1 row) 1: CLOSE c1; -CLOSE +CLOSE CURSOR -- check no endpoint info 1: SELECT auth_token,state FROM gp_get_endpoints() WHERE cursorname='c1'; auth_token | state @@ -194,7 +194,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c2 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 2 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c2'; endpoint_id2 | token_id | host_id | port_id | READY endpoint_id2 | token_id | host_id | port_id | READY @@ -458,7 +458,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c3 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 3 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c3'; endpoint_id3 | token_id | host_id | port_id | READY endpoint_id3 | token_id | host_id | port_id | READY @@ -594,7 +594,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c4 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 4 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c4'; endpoint_id4 | token_id | host_id | port_id | READY endpoint_id4 | token_id | host_id | port_id | READY @@ -731,7 +731,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c5 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 5 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c5'; endpoint_id5 | token_id | host_id | port_id | READY endpoint_id5 | token_id | host_id | port_id | READY @@ -866,7 +866,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c6 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 6 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c6'; endpoint_id6 | token_id | host_id | port_id | READY endpoint_id6 | token_id | host_id | port_id | READY @@ -996,7 +996,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c61 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 61 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c61'; endpoint_id61 | token_id | host_id | port_id | READY endpoint_id61 | token_id | host_id | port_id | READY @@ -1125,7 +1125,7 @@ ERROR: canceling statement due to user request 1: BEGIN; BEGIN 1: DECLARE c7 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 7 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c7'; endpoint_id7 | token_id | host_id | port_id | READY endpoint_id7 | token_id | host_id | port_id | READY @@ -1267,7 +1267,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c8 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'get_tuple_cell SESSION81 1 1 ; create_match_sub_with_spaces $SESSION81 session81': SELECT sessionid,state FROM gp_get_session_endpoints() WHERE cursorname='c8'; sessionid | state -----------+------- @@ -1279,7 +1279,7 @@ DECLARE 2: BEGIN; BEGIN 2: DECLARE c8 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 2: @post_run 'get_tuple_cell SESSION82 1 1 ; create_match_sub_with_spaces $SESSION82 session82': SELECT sessionid,state FROM gp_get_session_endpoints() WHERE cursorname='c8'; sessionid | state -----------+------- @@ -1300,19 +1300,19 @@ DECLARE (6 rows) 1: CLOSE c8; -CLOSE +CLOSE CURSOR 1: END; -END +COMMIT 2: CLOSE c8; -CLOSE +CLOSE CURSOR 2: END; -END +COMMIT ---------- Test9: Cancel (using pg_cancel_backend(pid)) the process of 'CHECK PARALLEL RETRIEVE CURSOR' 1: BEGIN; BEGIN 1: DECLARE c9 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 9 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c9'; endpoint_id9 | token_id | host_id | port_id | READY endpoint_id9 | token_id | host_id | port_id | READY @@ -1370,7 +1370,7 @@ ROLLBACK 1: BEGIN; BEGIN 1: DECLARE c10 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 10 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c10'; endpoint_id10 | token_id | host_id | port_id | READY endpoint_id10 | token_id | host_id | port_id | READY @@ -1456,16 +1456,16 @@ ROLLBACK --------- Test11: Test t1 has large amount of tuples, only retreive small number of tuples, we can still close cursor. 1:DROP TABLE IF EXISTS t2; -DROP +DROP TABLE 1:CREATE TABLE t2 (id integer, data text) DISTRIBUTED by (id); -CREATE +CREATE TABLE 1:INSERT INTO t2 select id, 'test ' || id from generate_series(1,100000) id; -INSERT 100000 +INSERT 0 100000 1: BEGIN; BEGIN 1: DECLARE c11 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t2; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR 1: @post_run 'parse_endpoint_info 11 1 2 3 4' : SELECT endpointname,auth_token,hostname,port,state FROM gp_get_endpoints() WHERE cursorname='c11'; endpoint_id11 | token_id | host_id | port_id | READY endpoint_id11 | token_id | host_id | port_id | READY @@ -1500,7 +1500,7 @@ DECLARE (5 rows) 1: CLOSE c11; -CLOSE +CLOSE CURSOR 1: ROLLBACK; ROLLBACK diff --git a/src/test/isolation2/output/parallel_retrieve_cursor/syntax.source b/src/test/isolation2/output/parallel_retrieve_cursor/syntax.source index 40d92067636..36404920fb1 100644 --- a/src/test/isolation2/output/parallel_retrieve_cursor/syntax.source +++ b/src/test/isolation2/output/parallel_retrieve_cursor/syntax.source @@ -1,17 +1,17 @@ -- @Description Tests syntax for the PARALLEL RETRIEVE CURSOR statement -- DROP TABLE IF EXISTS t1; -DROP +DROP TABLE CREATE TABLE t1 (a INT) DISTRIBUTED by (a); -CREATE +CREATE TABLE insert into t1 select generate_series(1,100); -INSERT 100 +INSERT 0 100 -- Test1: PARALLEL RETRIEVE CURSOR with other options (WITH HOLD/SCROLL) is not supported BEGIN; BEGIN DECLARE c1 PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR DECLARE c2 PARALLEL RETRIEVE CURSOR WITH HOLD FOR SELECT * FROM t1; ERROR: DECLARE PARALLEL RETRIEVE CURSOR WITH HOLD ... is not supported DETAIL: Holdable cursors can not be parallel @@ -21,7 +21,7 @@ ROLLBACK BEGIN; BEGIN DECLARE c1 NO SCROLL PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR DECLARE c2 SCROLL PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; ERROR: SCROLL is not allowed for the PARALLEL RETRIEVE CURSORs DETAIL: Scrollable cursors can not be parallel @@ -32,7 +32,7 @@ ROLLBACK BEGIN; BEGIN DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR FETCH ALL FROM c1; ERROR: cannot specify 'FETCH' for PARALLEL RETRIEVE CURSOR HINT: Use 'RETRIEVE' statement on endpoint instead. @@ -42,7 +42,7 @@ ROLLBACK BEGIN; BEGIN DECLARE c1 PARALLEL RETRIEVE CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR MOVE 10 FROM c1; ERROR: the 'MOVE' statement for PARALLEL RETRIEVE CURSOR is not supported ROLLBACK; @@ -52,7 +52,7 @@ ROLLBACK BEGIN; BEGIN DECLARE c1 CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE CURSOR SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', 0); ERROR: cursor is not a PARALLEL RETRIEVE CURSOR ROLLBACK; @@ -60,7 +60,7 @@ ROLLBACK BEGIN; BEGIN DECLARE c1 CURSOR FOR SELECT * FROM t1; -DECLARE +DECLARE CURSOR SELECT * FROM gp_wait_parallel_retrieve_cursor('c1', -1); ERROR: cursor is not a PARALLEL RETRIEVE CURSOR ROLLBACK; @@ -70,7 +70,7 @@ ROLLBACK BEGIN; BEGIN DECLARE c1 CURSOR WITHOUT HOLD FOR SELECT * FROM t1; -DECLARE +DECLARE CURSOR DO $$ DECLARE i int4; c2 refcursor = 'c1'; BEGIN FETCH FROM c2 INTO i; RAISE NOTICE '%', i; END; $$; DO ROLLBACK; @@ -78,7 +78,7 @@ ROLLBACK BEGIN; BEGIN DECLARE c3 PARALLEL RETRIEVE CURSOR WITHOUT HOLD FOR SELECT * FROM t1; -DECLARE +DECLARE PARALLEL RETRIEVE CURSOR DO $$ DECLARE i int4; c4 refcursor = 'c3'; BEGIN FETCH FROM c4 INTO i; RAISE NOTICE '%', i; END; $$; ERROR: The PARALLEL RETRIEVE CURSOR is not supported in SPI. HINT: Use normal cursor statement instead. diff --git a/src/test/isolation2/output/pg_basebackup_large_database_oid.source b/src/test/isolation2/output/pg_basebackup_large_database_oid.source index 141d648b79d..6f356829cdd 100644 --- a/src/test/isolation2/output/pg_basebackup_large_database_oid.source +++ b/src/test/isolation2/output/pg_basebackup_large_database_oid.source @@ -6,7 +6,7 @@ select gp_inject_fault('bump_oid', 'skip', dbid) from gp_segment_configuration w (1 row) create database db_large_oid; -CREATE +CREATE DATABASE select gp_inject_fault('bump_oid', 'reset', dbid) from gp_segment_configuration where role = 'p' and content = -1; gp_inject_fault @@ -28,7 +28,7 @@ select pg_basebackup(address, dbid, port, true, 'some_replication_slot', '@testt drop database db_large_oid; -DROP +DROP DATABASE 0U: select * from pg_drop_replication_slot('some_replication_slot'); pg_drop_replication_slot diff --git a/src/test/isolation2/output/pg_basebackup_with_tablespaces.source b/src/test/isolation2/output/pg_basebackup_with_tablespaces.source index fc8ceda2d41..626880348a4 100644 --- a/src/test/isolation2/output/pg_basebackup_with_tablespaces.source +++ b/src/test/isolation2/output/pg_basebackup_with_tablespaces.source @@ -6,31 +6,31 @@ (exited with code 0) drop tablespace if exists some_basebackup_tablespace; -DROP +DROP TABLESPACE create tablespace some_basebackup_tablespace location '@testtablespace@/some_basebackup_tablespace'; -CREATE +CREATE TABLESPACE -- And a database using the tablespace drop database if exists some_database_with_tablespace; -DROP +DROP DATABASE create database some_database_with_tablespace tablespace some_basebackup_tablespace; -CREATE +CREATE DATABASE -- And a database without using the tablespace drop database if exists some_database_without_tablespace; -DROP +DROP DATABASE create database some_database_without_tablespace; -CREATE +CREATE DATABASE -- And a table and index, temp table and index using the tablespace 1:@db_name some_database_without_tablespace: CREATE TABLE test(a INT, b INT) TABLESPACE some_basebackup_tablespace; -CREATE +CREATE TABLE 1:@db_name some_database_without_tablespace: CREATE INDEX test_index on test(a) TABLESPACE some_basebackup_tablespace; -CREATE +CREATE INDEX 2:@db_name some_database_without_tablespace: CREATE TEMP TABLE test_tmp(a INT, b INT) TABLESPACE some_basebackup_tablespace; -CREATE +CREATE TABLE 2:@db_name some_database_without_tablespace: CREATE INDEX test_tmp_index on test_tmp(a) TABLESPACE some_basebackup_tablespace; -CREATE +CREATE INDEX 1q: ... @@ -103,7 +103,7 @@ select validate_tablespace_symlink('@testtablespace@/some_basebackup_datadir', ' (1 row) drop database some_database_with_tablespace; -DROP +DROP DATABASE -- Need to poll until db drop succeeds since after 2q: happens the PGPROC -- on the server side might be still not released when we run database drop. -- This makes the test flaky. @@ -113,7 +113,7 @@ DROP -- end_ignore (exited with code 0) drop tablespace some_basebackup_tablespace; -DROP +DROP TABLESPACE !\retcode rm -rf @testtablespace@/some_basebackup_datadir/; -- start_ignore @@ -143,23 +143,23 @@ DROP (exited with code 0) create tablespace some_basebackup_tablespace LOCATION '@testtablespace@/some_basebackup_tablespace' WITH (content0='@testtablespace@/some_basebackup_tablespace_c0'); -CREATE +CREATE TABLESPACE -- And a database without using the tablespace drop database if exists some_database_without_tablespace; -DROP +DROP DATABASE create database some_database_without_tablespace; -CREATE +CREATE DATABASE -- And a table and index, temp table and index using the tablespace 1:@db_name some_database_without_tablespace: CREATE TABLE test(a INT, b INT) TABLESPACE some_basebackup_tablespace; -CREATE +CREATE TABLE 1:@db_name some_database_without_tablespace: CREATE INDEX test_index on test(a) TABLESPACE some_basebackup_tablespace; -CREATE +CREATE INDEX 2:@db_name some_database_without_tablespace: CREATE TEMP TABLE test_tmp(a INT, b INT) TABLESPACE some_basebackup_tablespace; -CREATE +CREATE TABLE 2:@db_name some_database_without_tablespace: CREATE INDEX test_tmp_index on test_tmp(a) TABLESPACE some_basebackup_tablespace; -CREATE +CREATE INDEX 1q: ... @@ -208,7 +208,7 @@ select validate_tablespace_symlink('@testtablespace@/some_basebackup_datadir', ' -- end_ignore (exited with code 0) drop tablespace some_basebackup_tablespace; -DROP +DROP TABLESPACE !\retcode rm -rf @testtablespace@/some_basebackup_datadir/; -- start_ignore diff --git a/src/test/isolation2/output/uao/alter_while_vacuum.source b/src/test/isolation2/output/uao/alter_while_vacuum.source index 3c3d0d06391..de230532c05 100644 --- a/src/test/isolation2/output/uao/alter_while_vacuum.source +++ b/src/test/isolation2/output/uao/alter_while_vacuum.source @@ -1,9 +1,9 @@ -- @Description Ensures that an alter table while a vacuum operation is ok -- CREATE TABLE alter_while_vacuum_@amname@ (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO alter_while_vacuum_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; -INSERT 100000 +INSERT 0 100000 DELETE FROM alter_while_vacuum_@amname@ WHERE a < 12000; DELETE 11999 @@ -16,7 +16,7 @@ DELETE 11999 2: VACUUM alter_while_vacuum_@amname@; VACUUM 1<: <... completed> -ALTER +ALTER TABLE 1: SELECT * FROM alter_while_vacuum_@amname@ WHERE a < 12010; a | b | d -------+-------+---- diff --git a/src/test/isolation2/output/uao/alter_while_vacuum2.source b/src/test/isolation2/output/uao/alter_while_vacuum2.source index 94b4c86cddd..f3cf87d3137 100644 --- a/src/test/isolation2/output/uao/alter_while_vacuum2.source +++ b/src/test/isolation2/output/uao/alter_while_vacuum2.source @@ -1,19 +1,19 @@ -- @Description Ensures that an alter table while a vacuum operation is ok -- CREATE TABLE alter_while_vacuum2_@amname@ (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO alter_while_vacuum2_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; -INSERT 100000 +INSERT 0 100000 INSERT INTO alter_while_vacuum2_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; -INSERT 100000 +INSERT 0 100000 INSERT INTO alter_while_vacuum2_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; -INSERT 100000 +INSERT 0 100000 INSERT INTO alter_while_vacuum2_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; -INSERT 100000 +INSERT 0 100000 INSERT INTO alter_while_vacuum2_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; -INSERT 100000 +INSERT 0 100000 INSERT INTO alter_while_vacuum2_@amname@ SELECT i as a, i as b FROM generate_series(1, 100000) AS i; -INSERT 100000 +INSERT 0 100000 DELETE FROM alter_while_vacuum2_@amname@ WHERE a < 12000; DELETE 71994 @@ -26,7 +26,7 @@ DELETE 71994 SET 2>: VACUUM alter_while_vacuum2_@amname@; 1: Alter table alter_while_vacuum2_@amname@ set with ( reorganize='true') distributed randomly; -ALTER +ALTER TABLE 2<: <... completed> VACUUM 1: SELECT COUNT(*) FROM alter_while_vacuum2_@amname@ WHERE a < 12010; diff --git a/src/test/isolation2/output/uao/ao_unique_index_vacuum.source b/src/test/isolation2/output/uao/ao_unique_index_vacuum.source index 74db357c6ab..1591a295b90 100644 --- a/src/test/isolation2/output/uao/ao_unique_index_vacuum.source +++ b/src/test/isolation2/output/uao/ao_unique_index_vacuum.source @@ -3,9 +3,9 @@ -- Case 1: Basic case with a few deleted tuples--------------------------------- CREATE TABLE unique_index_vacuum_@amname@(i int UNIQUE) USING @amname@ DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE INSERT INTO unique_index_vacuum_@amname@ SELECT generate_series(1, 5); -INSERT 5 +INSERT 0 5 DELETE FROM unique_index_vacuum_@amname@ WHERE i = 5; DELETE 1 -- should succeed (and not raise conflicts for rows [1,4] while moving rows [1,4]) @@ -18,15 +18,15 @@ SELECT (gp_toolkit.__gp_aoblkdir('unique_index_vacuum_@amname@')).* FROM gp_dist (0,3) | 2 | 0 | 0 | 1 | 0 | 4 (1 row) DROP TABLE unique_index_vacuum_@amname@; -DROP +DROP TABLE -- Case 2: Concurrent case showcasing that a placeholder block directory row is -- not necessary to be inserted for the rows transferred to a new segment by -- a VACUUM operation. CREATE TABLE unique_index_vacuum_@amname@(i int UNIQUE) USING @amname@ DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE INSERT INTO unique_index_vacuum_@amname@ SELECT generate_series(1, 5); -INSERT 5 +INSERT 0 5 DELETE FROM unique_index_vacuum_@amname@ WHERE i = 5; DELETE 1 @@ -72,14 +72,14 @@ SELECT gp_inject_fault('appendonly_insert', 'reset', dbid) FROM gp_segment_confi 1<: <... completed> VACUUM DROP TABLE unique_index_vacuum_@amname@; -DROP +DROP TABLE -- Case 3: Validate the occurrence of vacuum index. -- just after it has bulk deleted the old index entries. CREATE TABLE unique_index_vacuum_@amname@(i int UNIQUE) USING @amname@ DISTRIBUTED REPLICATED; -CREATE +CREATE TABLE INSERT INTO unique_index_vacuum_@amname@ SELECT generate_series(1, 5); -INSERT 5 +INSERT 0 5 DELETE FROM unique_index_vacuum_@amname@ WHERE i = 5; DELETE 1 @@ -113,4 +113,4 @@ SELECT gp_inject_fault_infinite('vacuum_ao_after_index_delete', 'reset', dbid) F (3 rows) DROP TABLE unique_index_vacuum_@amname@; -DROP +DROP TABLE diff --git a/src/test/isolation2/output/uao/bitmapindex_rescan.source b/src/test/isolation2/output/uao/bitmapindex_rescan.source index a55a3b625bd..00c8cba3664 100644 --- a/src/test/isolation2/output/uao/bitmapindex_rescan.source +++ b/src/test/isolation2/output/uao/bitmapindex_rescan.source @@ -3,27 +3,27 @@ drop table if exists bir; drop table if exists yolo cascade; -- end_ignore create table bir (a int, b int) distributed by (a); -CREATE +CREATE TABLE insert into bir select i, i from generate_series(1, 5) i; -INSERT 5 +INSERT 0 5 create table yolo (a int, b int) USING @amname@ distributed by (a); -CREATE +CREATE TABLE create index yolo_idx on yolo using btree (a); -CREATE +CREATE INDEX 1: begin; BEGIN 2: begin; BEGIN 1: insert into yolo select i, i from generate_series(1, 10000) i; -INSERT 10000 +INSERT 0 10000 2: insert into yolo select i, i from generate_series(1, 2) i; -INSERT 2 +INSERT 0 2 1: commit; COMMIT 2: abort; -ABORT +ROLLBACK analyze yolo; ANALYZE diff --git a/src/test/isolation2/output/uao/brin.source b/src/test/isolation2/output/uao/brin.source index 5fae106e460..c955be65d26 100644 --- a/src/test/isolation2/output/uao/brin.source +++ b/src/test/isolation2/output/uao/brin.source @@ -2,6 +2,8 @@ -- White-box tests are necessary to ensure that summarization is done -- successfully (to avoid cases where ranges have brin data tuples without -- values or where the range is not covered by the revmap etc) +CREATE EXTENSION pageinspect; +CREATE EXTENSION -- Turn off sequential scans to force usage of BRIN indexes for scans. SET enable_seqscan TO off; @@ -13,9 +15,9 @@ SET -- Create an index on an empty table CREATE TABLE brin_ao_summarize_@amname@(i int) USING @amname@; -CREATE +CREATE TABLE CREATE INDEX ON brin_ao_summarize_@amname@ USING brin(i) WITH (pages_per_range=1); -CREATE +CREATE INDEX -- Sanity: There are no revmap/data pages as there is no data 1U: SELECT blkno, brin_page_type(get_raw_page('brin_ao_summarize_@amname@_i_idx', blkno)) FROM generate_series(0, nblocks('brin_ao_summarize_@amname@_i_idx') - 1) blkno; @@ -40,7 +42,7 @@ SELECT brin_summarize_new_values('brin_ao_summarize_@amname@_i_idx'); -- Drop the index DROP INDEX brin_ao_summarize_@amname@_i_idx; -DROP +DROP INDEX -- Create 3 blocks all on 1 QE, in 1 aoseg: 2 blocks full, 1 block with 1 tuple. SELECT populate_pages('brin_ao_summarize_@amname@', 1, tid '(33554434, 0)'); @@ -51,7 +53,7 @@ SELECT populate_pages('brin_ao_summarize_@amname@', 1, tid '(33554434, 0)'); -- Now re-create the index on the data inserted above. CREATE INDEX ON brin_ao_summarize_@amname@ USING brin(i) WITH (pages_per_range=1); -CREATE +CREATE INDEX -- Sanity: there should be 1 revmap page and 1 data page covering the 3 blocks. 1U: SELECT blkno, brin_page_type(get_raw_page('brin_ao_summarize_@amname@_i_idx', blkno)) FROM generate_series(0, nblocks('brin_ao_summarize_@amname@_i_idx') - 1) blkno; @@ -335,7 +337,7 @@ VACUUM -- A new INSERT would always map to the last range on the old segment and that -- range will be updated to hold the new value, as part of INSERT. INSERT INTO brin_ao_summarize_@amname@ VALUES(40); -INSERT 1 +INSERT 0 1 -- All the live tuples will have been moved to a single new logical heap block -- in seg2 (67108864). The 1 tuple INSERTed after the VACUUM should have gone to @@ -464,9 +466,9 @@ SELECT brin_summarize_new_values('brin_ao_summarize_@amname@_i_idx'); -- Specific range summarization/desummarization -------------------------------------------------------------------------------- CREATE TABLE brin_ao_specific_@amname@(i int) USING @amname@; -CREATE +CREATE TABLE CREATE INDEX ON brin_ao_specific_@amname@ USING brin(i) WITH (pages_per_range=1); -CREATE +CREATE INDEX 1: BEGIN; BEGIN @@ -675,9 +677,9 @@ SELECT brin_desummarize_range('brin_ao_specific_@amname@_i_idx', 100663296); -------------------------------------------------------------------------------- CREATE TABLE brin_ao_summarize_partial_@amname@(i int) USING @amname@; -CREATE +CREATE TABLE CREATE INDEX ON brin_ao_summarize_partial_@amname@ USING brin(i) WITH (pages_per_range=3); -CREATE +CREATE INDEX -- Insert 4 blocks of data on 1 QE, in 1 aoseg; 3 blocks full, 1 block with 1 tuple. -- The 1st range [33554432, 33554434] is full and the last range [33554435, 33554437] @@ -758,9 +760,9 @@ SELECT brin_summarize_new_values('brin_ao_summarize_partial_@amname@_i_idx'); -- concurrent inserts to it, while summarization was in flight. CREATE TABLE brin_range_extended1_@amname@(i int) USING @amname@; -CREATE +CREATE TABLE CREATE INDEX ON brin_range_extended1_@amname@ USING brin(i) WITH (pages_per_range=5); -CREATE +CREATE INDEX -- Insert 3 blocks of data on 1 QE, in 1 aoseg; 2 blocks full, 1 block with 1 tuple. SELECT populate_pages('brin_range_extended1_@amname@', 1, tid '(33554434, 0)'); @@ -807,7 +809,7 @@ SELECT gp_wait_until_triggered_fault('summarize_last_partial_range', 1, dbid) FR -- Insert a different value into seg1 concurrently. INSERT INTO brin_range_extended1_@amname@ VALUES(20); -INSERT 1 +INSERT 0 1 -- Sanity: The earlier placeholder tuple has been modified by the INSERT to -- contain only the value 20. The tuple is still a placeholder. @@ -891,9 +893,9 @@ SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_ -- case it was extended by another transaction, while summarization was in flight. CREATE TABLE brin_range_extended2_@amname@(i int) USING @amname@; -CREATE +CREATE TABLE CREATE INDEX ON brin_range_extended2_@amname@ USING brin(i) WITH (pages_per_range=5); -CREATE +CREATE INDEX -- Insert 3 blocks of data on 1 QE, in 1 aoseg; 2 blocks full, 1 block with 1 tuple. SELECT populate_pages('brin_range_extended2_@amname@', 1, tid '(33554434, 0)'); @@ -1002,7 +1004,7 @@ SELECT gp_inject_fault('summarize_last_partial_range', 'reset', dbid) FROM gp_se -- Another insert into the same QE and the same range should not change the fact -- that the summary tuple is a placeholder tuple. INSERT INTO brin_range_extended2_@amname@ VALUES(30); -INSERT 1 +INSERT 0 1 1U: SELECT blkno, brin_page_type(get_raw_page('brin_range_extended2_@amname@_i_idx', blkno)) FROM generate_series(0, nblocks('brin_range_extended2_@amname@_i_idx') - 1) blkno; blkno | brin_page_type -------+---------------- @@ -1026,7 +1028,7 @@ INSERT 1 -------------------------------------------------------------------------------- CREATE TABLE brin_multi_@amname@(i int) USING @amname@; -CREATE +CREATE TABLE -- For each segment file (there are 2), populate 1 full block and 1 block with -- 1 tuple. @@ -1050,7 +1052,7 @@ COMMIT COMMIT CREATE INDEX ON brin_multi_@amname@ USING brin(i) WITH (pages_per_range=1); -CREATE +CREATE INDEX -- Sanity: All four blocks from the 2 seg files above should be summarized. 1U: SELECT blkno, brin_page_type(get_raw_page('brin_multi_@amname@_i_idx', blkno)) FROM generate_series(0, nblocks('brin_multi_@amname@_i_idx') - 1) blkno; @@ -1103,9 +1105,9 @@ SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_ -- Test build/summarize with aborted rows. -------------------------------------------------------------------------------- CREATE TABLE brin_abort_@amname@(i int) USING @amname@; -CREATE +CREATE TABLE CREATE INDEX ON brin_abort_@amname@ USING brin(i) WITH (pages_per_range=1); -CREATE +CREATE INDEX BEGIN; BEGIN -- Create 3 blocks all on 1 QE, in 1 aoseg: 2 blocks full, 1 block with 1 tuple. @@ -1115,7 +1117,7 @@ SELECT populate_pages('brin_abort_@amname@', 1, tid '(33554434, 0)'); (1 row) ABORT; -ABORT +ROLLBACK -- Sanity: There are no revmap or data pages created yet. 1U: SELECT blkno, brin_page_type(get_raw_page('brin_abort_@amname@_i_idx', blkno)) FROM generate_series(0, nblocks('brin_abort_@amname@_i_idx') - 1) blkno; @@ -1244,9 +1246,9 @@ SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_ -- Drop and re-create the index to test build. DROP INDEX brin_abort_@amname@_i_idx; -DROP +DROP INDEX CREATE INDEX ON brin_abort_@amname@ USING brin(i) WITH (pages_per_range=1); -CREATE +CREATE INDEX -- Sanity: There is 1 revmap page and 1 data page, containing 2 empty ranges -- and 2 ranges over the committed rows. @@ -1302,17 +1304,17 @@ SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_ -- Test build/summarize with whole revmap page containing aborted ranges. -------------------------------------------------------------------------------- CREATE TABLE brin_abort_fullpage_@amname@(i int) USING @amname@; -CREATE +CREATE TABLE CREATE INDEX ON brin_abort_fullpage_@amname@ USING brin(i) WITH (pages_per_range=1); -CREATE +CREATE INDEX -- Insert single row, so we have a gp_fastsequence entry to modify. BEGIN; BEGIN INSERT INTO brin_abort_fullpage_@amname@ VALUES(1); -INSERT 1 +INSERT 0 1 ABORT; -ABORT +ROLLBACK -- Simulate a revmap page full of aborted ranges by altering gp_fastsequence. -- This creates enough entries for 2 revmap pages (About 32768 integers fit in @@ -1395,9 +1397,9 @@ SELECT gp_inject_fault('brin_bitmap_page_added', 'reset', dbid) FROM gp_segment_ -- Drop and re-create the index to test build. DROP INDEX brin_abort_fullpage_@amname@_i_idx; -DROP +DROP INDEX CREATE INDEX ON brin_abort_fullpage_@amname@ USING brin(i) WITH (pages_per_range=1); -CREATE +CREATE INDEX -- Sanity: There are 2 revmap pages, and 3 data pages. The first 2 data pages -- contain nothing but empty ranges. The 3rd data page has a single non-empty @@ -1501,3 +1503,5 @@ SELECT brin_summarize_range('brin_abort_fullpage_@amname@_i_idx', 33559886); RESET enable_seqscan; RESET +DROP EXTENSION pageinspect; +DROP EXTENSION diff --git a/src/test/isolation2/output/uao/brin_chain.source b/src/test/isolation2/output/uao/brin_chain.source index 12012899a23..7ec54c96698 100644 --- a/src/test/isolation2/output/uao/brin_chain.source +++ b/src/test/isolation2/output/uao/brin_chain.source @@ -1,6 +1,9 @@ -- Tests for BRIN chaining for AO/CO tables -- These are in a separate file as they take longer and deal with more data. +CREATE EXTENSION pageinspect; +CREATE EXTENSION + -- All tests insert rows into content=1. -- We create an append-optimized table with the following characteristics: @@ -13,11 +16,11 @@ -- * seg3: 32768 aborted rows (1 logical heap block), 3000 committed rows -> 1 revmap page. CREATE TABLE brin_chain_@amname@(i character(1)) USING heap; -CREATE +CREATE TABLE INSERT INTO brin_chain_@amname@ SELECT '2' FROM generate_series(1, 1000); -INSERT 1000 +INSERT 0 1000 ALTER TABLE brin_chain_@amname@ SET ACCESS METHOD @amname@; -ALTER +ALTER TABLE 1: BEGIN; BEGIN @@ -46,26 +49,26 @@ COPY 180000000 -- end_ignore (exited with code 0) 2: INSERT INTO brin_chain_@amname@ SELECT '2' FROM generate_series(1, 2000); -INSERT 2000 +INSERT 0 2000 3: INSERT INTO brin_chain_@amname@ SELECT '2' FROM generate_series(1, 32768); -INSERT 32768 +INSERT 0 32768 3: ABORT; -ABORT +ROLLBACK 3: BEGIN; BEGIN 3: INSERT INTO brin_chain_@amname@ SELECT '2' FROM generate_series(1, 3000); -INSERT 3000 +INSERT 0 3000 1: COMMIT; COMMIT 2: ABORT; -ABORT +ROLLBACK 3: COMMIT; COMMIT -- Create the index. CREATE INDEX ON brin_chain_@amname@ USING brin(i) WITH (pages_per_range=1); -CREATE +CREATE INDEX -- Sanity: Inspect the revmap chain information (limit to first 5 segments) 1U: SELECT blkno, brin_page_type(get_raw_page('brin_chain_@amname@_i_idx', blkno)) FROM generate_series(0, nblocks('brin_chain_@amname@_i_idx') - 1) blkno; @@ -134,3 +137,6 @@ SELECT count(*) FROM brin_chain_@amname@ WHERE i > '1' and i < '3'; ----------- 180004000 (1 row) + +DROP EXTENSION pageinspect; +DROP EXTENSION diff --git a/src/test/isolation2/output/uao/compaction_full_stats.source b/src/test/isolation2/output/uao/compaction_full_stats.source index 9a2969468bd..ca022d61a3e 100644 --- a/src/test/isolation2/output/uao/compaction_full_stats.source +++ b/src/test/isolation2/output/uao/compaction_full_stats.source @@ -1,16 +1,16 @@ -- @Description Tests the behavior of full vacuum w.r.t. the pg_class statistics -- DROP TABLE IF EXISTS foo; -DROP +DROP TABLE CREATE TABLE foo (a INT, b INT, c CHAR(128)) USING @amname@ DISTRIBUTED BY (a); -CREATE +CREATE TABLE CREATE INDEX foo_index ON foo(b); -CREATE +CREATE INDEX INSERT INTO foo SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i; -INSERT 50 +INSERT 0 50 INSERT INTO foo SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i; -INSERT 50 +INSERT 0 50 ANALYZE foo; ANALYZE diff --git a/src/test/isolation2/output/uao/compaction_utility.source b/src/test/isolation2/output/uao/compaction_utility.source index 0ae471d7212..e9587d96f7e 100644 --- a/src/test/isolation2/output/uao/compaction_utility.source +++ b/src/test/isolation2/output/uao/compaction_utility.source @@ -1,13 +1,13 @@ -- @Description Tests the basic behavior of (lazy) vacuum when called from utility mode -- DROP TABLE IF EXISTS foo; -DROP +DROP TABLE CREATE TABLE foo (a INT, b INT, c CHAR(128)) USING @amname@; -CREATE +CREATE TABLE CREATE INDEX foo_index ON foo(b); -CREATE +CREATE INDEX INSERT INTO foo SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 100) AS i; -INSERT 100 +INSERT 0 100 DELETE FROM foo WHERE a < 20; DELETE 19 diff --git a/src/test/isolation2/output/uao/compaction_utility_2.source b/src/test/isolation2/output/uao/compaction_utility_2.source index d3c2c5c9ebd..d5119ad10a3 100644 --- a/src/test/isolation2/output/uao/compaction_utility_2.source +++ b/src/test/isolation2/output/uao/compaction_utility_2.source @@ -1,13 +1,13 @@ -- @Description Tests the basic behavior of (lazy) vacuum when called from utility mode -- DROP TABLE IF EXISTS foo; -DROP +DROP TABLE CREATE TABLE foo (a INT, b INT, c CHAR(128)) USING @amname@; -CREATE +CREATE TABLE CREATE INDEX foo_index ON foo(b); -CREATE +CREATE INDEX INSERT INTO foo SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 100) AS i; -INSERT 100 +INSERT 0 100 DELETE FROM foo WHERE a < 20; DELETE 19 diff --git a/src/test/isolation2/output/uao/compaction_utility_insert.source b/src/test/isolation2/output/uao/compaction_utility_insert.source index ba037d2ee6c..01c42a8569d 100644 --- a/src/test/isolation2/output/uao/compaction_utility_insert.source +++ b/src/test/isolation2/output/uao/compaction_utility_insert.source @@ -1,16 +1,16 @@ -- @Description Tests the compaction of data inserted in utility mode -- DROP TABLE IF EXISTS foo; -DROP +DROP TABLE CREATE TABLE foo (a INT, b INT, c CHAR(128)) USING @amname@ distributed randomly; -CREATE +CREATE TABLE CREATE INDEX foo_index ON foo(b); -CREATE +CREATE INDEX 0U: INSERT INTO foo VALUES (2, 2, 'c'); -INSERT 1 +INSERT 0 1 0U: INSERT INTO foo VALUES (3, 3, 'c'); -INSERT 1 +INSERT 0 1 SELECT *, segno, tupcount, state FROM gp_ao_or_aocs_seg('foo'); segment_id | segno | tupcount | modcount | formatversion | state | segno | tupcount | state ------------+-------+----------+----------+---------------+-------+-------+----------+------- diff --git a/src/test/isolation2/output/uao/compaction_utility_insert_2.source b/src/test/isolation2/output/uao/compaction_utility_insert_2.source index f3bc1a0f400..eedd1e58d0a 100644 --- a/src/test/isolation2/output/uao/compaction_utility_insert_2.source +++ b/src/test/isolation2/output/uao/compaction_utility_insert_2.source @@ -1,23 +1,23 @@ -- @Description Tests the compaction of data inserted in utility mode -- DROP TABLE IF EXISTS foo; -DROP +DROP TABLE CREATE TABLE foo (a INT, b INT, c CHAR(128)) USING @amname@; -CREATE +CREATE TABLE CREATE INDEX foo_index ON foo(b); -CREATE +CREATE INDEX INSERT INTO foo VALUES (1, 1, 'c'); -INSERT 1 +INSERT 0 1 SELECT segno, tupcount, state FROM gp_ao_or_aocs_seg('foo'); segno | tupcount | state -------+----------+------- 1 | 1 | 1 (1 row) 2U: INSERT INTO foo VALUES (2, 2, 'c'); -INSERT 1 +INSERT 0 1 2U: INSERT INTO foo VALUES (3, 3, 'c'); -INSERT 1 +INSERT 0 1 2U: SELECT segno, tupcount, state FROM gp_ao_or_aocs_seg('foo'); segno | tupcount | state -------+----------+------- diff --git a/src/test/isolation2/output/uao/create_index_allows_readonly.source b/src/test/isolation2/output/uao/create_index_allows_readonly.source index a97bce1de81..f4eb8a455f5 100644 --- a/src/test/isolation2/output/uao/create_index_allows_readonly.source +++ b/src/test/isolation2/output/uao/create_index_allows_readonly.source @@ -5,9 +5,9 @@ set default_table_access_method=@amname@; SET create table @amname@_create_index_with_select_tbl(a int, b int); -CREATE +CREATE TABLE insert into @amname@_create_index_with_select_tbl select a,a from generate_series(1,10) a; -INSERT 10 +INSERT 0 10 -- Verify readonly transaction is able to run concurrently with index creation. @@ -23,7 +23,7 @@ BEGIN BEGIN -- expect no hang 2: create index @amname@_create_index_with_select_idx on @amname@_create_index_with_select_tbl(a); -CREATE +CREATE INDEX -- expect no hang 3: select * from @amname@_create_index_with_select_tbl where a = 2; a | b @@ -32,16 +32,16 @@ CREATE (1 row) 1: end; -END +COMMIT 2: end; -END +COMMIT -- Verify behaviors of select with locking clause (i.e. select for update) -- when running concurrently with index creation, expect blocking with each other. -- This is only for AO/CO tables, for Heap tables, refer to lockmodes.sql. drop index @amname@_create_index_with_select_idx; -DROP +DROP INDEX 1: begin; BEGIN @@ -60,17 +60,17 @@ BEGIN COMMIT 2<: <... completed> -CREATE +CREATE INDEX 2: commit; COMMIT drop index @amname@_create_index_with_select_idx; -DROP +DROP INDEX 2: begin; BEGIN 2: create index @amname@_create_index_with_select_idx on @amname@_create_index_with_select_tbl(a); -CREATE +CREATE INDEX 1: begin; BEGIN @@ -89,6 +89,6 @@ COMMIT COMMIT drop table @amname@_create_index_with_select_tbl; -DROP +DROP TABLE reset default_table_access_method; RESET diff --git a/src/test/isolation2/output/uao/cursor_before_delete.source b/src/test/isolation2/output/uao/cursor_before_delete.source index c7a9ddc8fc0..d96257b4c4a 100644 --- a/src/test/isolation2/output/uao/cursor_before_delete.source +++ b/src/test/isolation2/output/uao/cursor_before_delete.source @@ -1,16 +1,16 @@ -- @Description Tests the visibility when a cursor has been created before the delete. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT) USING @amname@; -CREATE +CREATE TABLE insert into ao select generate_series(1, 100); -INSERT 100 +INSERT 0 100 1: BEGIN; BEGIN 1: DECLARE cur CURSOR FOR SELECT a FROM ao ORDER BY a; -DECLARE +DECLARE CURSOR 1: FETCH NEXT IN cur; a --- @@ -43,19 +43,19 @@ COMMIT 5 (1 row) 1: CLOSE cur; -CLOSE +CLOSE CURSOR 1: COMMIT; COMMIT 3: BEGIN; BEGIN 3: DECLARE cur CURSOR FOR SELECT a FROM ao ORDER BY a; -DECLARE +DECLARE CURSOR 3: FETCH NEXT IN cur; a --- 5 (1 row) 3: CLOSE cur; -CLOSE +CLOSE CURSOR 3: COMMIT; COMMIT diff --git a/src/test/isolation2/output/uao/cursor_before_deletevacuum.source b/src/test/isolation2/output/uao/cursor_before_deletevacuum.source index ee1dddd8d58..5b8fe7970f2 100644 --- a/src/test/isolation2/output/uao/cursor_before_deletevacuum.source +++ b/src/test/isolation2/output/uao/cursor_before_deletevacuum.source @@ -1,16 +1,16 @@ -- @Description Tests the visibility when a cursor has been created before the delete. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT) USING @amname@; -CREATE +CREATE TABLE insert into ao select generate_series(1, 10); -INSERT 10 +INSERT 0 10 1: BEGIN; BEGIN 1: DECLARE cur CURSOR FOR SELECT a FROM ao ORDER BY a; -DECLARE +DECLARE CURSOR 1: FETCH NEXT IN cur; a --- @@ -44,7 +44,7 @@ COMMIT 5 (1 row) 1: CLOSE cur; -CLOSE +CLOSE CURSOR 1: COMMIT; COMMIT 2<: <... completed> @@ -52,13 +52,13 @@ VACUUM 3: BEGIN; BEGIN 3: DECLARE cur CURSOR FOR SELECT a FROM ao ORDER BY a; -DECLARE +DECLARE CURSOR 3: FETCH NEXT IN cur; a --- 5 (1 row) 3: CLOSE cur; -CLOSE +CLOSE CURSOR 3: COMMIT; COMMIT diff --git a/src/test/isolation2/output/uao/cursor_before_update.source b/src/test/isolation2/output/uao/cursor_before_update.source index f0998ea3e68..8b595717931 100644 --- a/src/test/isolation2/output/uao/cursor_before_update.source +++ b/src/test/isolation2/output/uao/cursor_before_update.source @@ -1,16 +1,16 @@ -- @Description Tests the visibility when a cursor has been created before the update. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,100) AS i; -INSERT 100 +INSERT 0 100 1: BEGIN; BEGIN 1: DECLARE cur CURSOR FOR SELECT a,b FROM ao ORDER BY a; -DECLARE +DECLARE CURSOR 1: FETCH NEXT IN cur; a | b ---+--- @@ -43,19 +43,19 @@ COMMIT 5 | 5 (1 row) 1: CLOSE cur; -CLOSE +CLOSE CURSOR 1: COMMIT; COMMIT 3: BEGIN; BEGIN 3: DECLARE cur CURSOR FOR SELECT a,b FROM ao ORDER BY a; -DECLARE +DECLARE CURSOR 3: FETCH NEXT IN cur; a | b ---+--- 1 | 8 (1 row) 3: CLOSE cur; -CLOSE +CLOSE CURSOR 3: COMMIT; COMMIT diff --git a/src/test/isolation2/output/uao/cursor_withhold.source b/src/test/isolation2/output/uao/cursor_withhold.source index eec08b9c2af..7ef58270010 100644 --- a/src/test/isolation2/output/uao/cursor_withhold.source +++ b/src/test/isolation2/output/uao/cursor_withhold.source @@ -1,14 +1,14 @@ -- @Description Tests the visibility of an "with hold" cursor w.r.t. deletes. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT) USING @amname@; -CREATE +CREATE TABLE insert into ao select generate_series(1,100); -INSERT 100 +INSERT 0 100 1: DECLARE cur CURSOR WITH HOLD FOR SELECT a FROM ao ORDER BY a; -DECLARE +DECLARE CURSOR 1: FETCH NEXT IN cur; a --- @@ -41,13 +41,13 @@ COMMIT 5 (1 row) 1: CLOSE cur; -CLOSE +CLOSE CURSOR 3: DECLARE cur CURSOR WITH HOLD FOR SELECT a FROM ao ORDER BY a; -DECLARE +DECLARE CURSOR 3: FETCH NEXT IN cur; a --- 5 (1 row) 3: CLOSE cur; -CLOSE +CLOSE CURSOR diff --git a/src/test/isolation2/output/uao/cursor_withhold2.source b/src/test/isolation2/output/uao/cursor_withhold2.source index 3a63dbd2c0f..df0042791b0 100644 --- a/src/test/isolation2/output/uao/cursor_withhold2.source +++ b/src/test/isolation2/output/uao/cursor_withhold2.source @@ -1,16 +1,16 @@ -- @Description Tests the visibility of an "with hold" cursor w.r.t. deletes. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT) USING @amname@; -CREATE +CREATE TABLE insert into ao select generate_series(1,10); -INSERT 10 +INSERT 0 10 1: BEGIN; BEGIN 1: DECLARE cur CURSOR WITH HOLD FOR SELECT a FROM ao ORDER BY a; -DECLARE +DECLARE CURSOR 1: FETCH NEXT IN cur; a --- @@ -47,13 +47,13 @@ VACUUM 5 (1 row) 1: CLOSE cur; -CLOSE +CLOSE CURSOR 3: DECLARE cur CURSOR WITH HOLD FOR SELECT a FROM ao ORDER BY a; -DECLARE +DECLARE CURSOR 3: FETCH NEXT IN cur; a --- 5 (1 row) 3: CLOSE cur; -CLOSE +CLOSE CURSOR diff --git a/src/test/isolation2/output/uao/delete_while_vacuum.source b/src/test/isolation2/output/uao/delete_while_vacuum.source index c32d7c805a6..d740968fbee 100644 --- a/src/test/isolation2/output/uao/delete_while_vacuum.source +++ b/src/test/isolation2/output/uao/delete_while_vacuum.source @@ -1,11 +1,11 @@ -- @Description Ensures that a delete before a vacuum operation is ok -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; -INSERT 100 +INSERT 0 100 DELETE FROM ao WHERE a < 12; @@ -21,11 +21,11 @@ BEGIN 2: VACUUM ao; VACUUM 1<: <... completed> -DELETE +COMMIT 1: SELECT COUNT(*) FROM ao; count ------- 11 (1 row) 3: INSERT INTO ao VALUES (0); -INSERT 1 +INSERT 0 1 diff --git a/src/test/isolation2/output/uao/index_build_reltuples.source b/src/test/isolation2/output/uao/index_build_reltuples.source index d289347544c..04fd55a152a 100644 --- a/src/test/isolation2/output/uao/index_build_reltuples.source +++ b/src/test/isolation2/output/uao/index_build_reltuples.source @@ -10,12 +10,12 @@ SET -- and the index's reltuples, to equal the actual segment tuple counts. CREATE TABLE index_build_reltuples_@amname@(a int); -CREATE +CREATE TABLE INSERT INTO index_build_reltuples_@amname@ SELECT generate_series(1, 10); -INSERT 10 +INSERT 0 10 CREATE INDEX ON index_build_reltuples_@amname@(a); -CREATE +CREATE INDEX SELECT gp_segment_id, count(*) FROM index_build_reltuples_@amname@ GROUP BY gp_segment_id ORDER BY gp_segment_id; gp_segment_id | count @@ -40,7 +40,7 @@ SELECT gp_segment_id, reltuples FROM gp_dist_random('pg_class') WHERE relname='i (3 rows) DROP TABLE index_build_reltuples_@amname@; -DROP +DROP TABLE -- Case 2: Verify that CREATE INDEX is able to update the aorel's reltuples -- to equal the actual segment tuple counts, when there are deleted tuples. For @@ -49,9 +49,9 @@ DROP -- reltuples count for the index would also account for deleted tuples. CREATE TABLE index_build_reltuples_@amname@(a int); -CREATE +CREATE TABLE INSERT INTO index_build_reltuples_@amname@ SELECT generate_series(1, 20); -INSERT 20 +INSERT 0 20 SELECT gp_segment_id, count(*) FROM index_build_reltuples_@amname@ GROUP BY gp_segment_id ORDER BY gp_segment_id; gp_segment_id | count @@ -65,7 +65,7 @@ DELETE FROM index_build_reltuples_@amname@ WHERE a <= 10; DELETE 10 CREATE INDEX ON index_build_reltuples_@amname@(a); -CREATE +CREATE INDEX SELECT gp_segment_id, count(*) FROM index_build_reltuples_@amname@ GROUP BY gp_segment_id ORDER BY gp_segment_id; gp_segment_id | count @@ -90,17 +90,17 @@ SELECT gp_segment_id, reltuples FROM gp_dist_random('pg_class') WHERE relname='i (3 rows) DROP TABLE index_build_reltuples_@amname@; -DROP +DROP TABLE -- Case 3: Verify that CREATE INDEX is able to update both the aorel's reltuples -- and the index's reltuples, to equal the actual segment tuple counts, when -- there are aborted tuples. CREATE TABLE index_build_reltuples_@amname@(a int); -CREATE +CREATE TABLE INSERT INTO index_build_reltuples_@amname@ SELECT generate_series(1, 10); -INSERT 10 +INSERT 0 10 SELECT gp_segment_id, count(*) FROM index_build_reltuples_@amname@ GROUP BY gp_segment_id ORDER BY gp_segment_id; gp_segment_id | count @@ -113,12 +113,12 @@ SELECT gp_segment_id, count(*) FROM index_build_reltuples_@amname@ GROUP BY gp_s BEGIN; BEGIN INSERT INTO index_build_reltuples_@amname@ SELECT generate_series(11, 20); -INSERT 10 +INSERT 0 10 ABORT; -ABORT +ROLLBACK CREATE INDEX ON index_build_reltuples_@amname@(a); -CREATE +CREATE INDEX SELECT gp_segment_id, count(*) FROM index_build_reltuples_@amname@ GROUP BY gp_segment_id ORDER BY gp_segment_id; gp_segment_id | count @@ -143,7 +143,7 @@ SELECT gp_segment_id, reltuples FROM gp_dist_random('pg_class') WHERE relname='i (3 rows) DROP TABLE index_build_reltuples_@amname@; -DROP +DROP TABLE -- Case 4: Verify that CREATE INDEX is able to update both the aorel's reltuples -- and the index's reltuples, to equal the latest segment tuple counts, even @@ -151,7 +151,7 @@ DROP -- (highlights the need for using SnapshotAny) CREATE TABLE index_build_reltuples_@amname@(a int); -CREATE +CREATE TABLE 1: BEGIN ISOLATION LEVEL REPEATABLE READ; BEGIN @@ -161,10 +161,10 @@ BEGIN (0 rows) INSERT INTO index_build_reltuples_@amname@ SELECT generate_series(1, 10); -INSERT 10 +INSERT 0 10 1: CREATE INDEX ON index_build_reltuples_@amname@(a); -CREATE +CREATE INDEX 1: COMMIT; COMMIT @@ -191,7 +191,7 @@ SELECT gp_segment_id, reltuples FROM gp_dist_random('pg_class') WHERE relname='i (3 rows) DROP TABLE index_build_reltuples_@amname@; -DROP +DROP TABLE RESET default_table_access_method; RESET diff --git a/src/test/isolation2/output/uao/insert_policy.source b/src/test/isolation2/output/uao/insert_policy.source index 9d5bbf9cfb1..92197ead4d0 100644 --- a/src/test/isolation2/output/uao/insert_policy.source +++ b/src/test/isolation2/output/uao/insert_policy.source @@ -1,16 +1,16 @@ -- @Description Tests the AO segment file selection policy -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT) USING @amname@; -CREATE +CREATE TABLE -- Case 1: Both transactions insert initial segment files into aoseg. 1: BEGIN; BEGIN 2: BEGIN; BEGIN 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 -- Segment file 1 should be created 3: SELECT segno FROM gp_ao_or_aocs_seg('ao'); segno @@ -18,7 +18,7 @@ INSERT 1 1 (1 row) 2: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 -- Segment file 2 should be created 3: SELECT segno FROM gp_ao_or_aocs_seg('ao'); segno @@ -41,7 +41,7 @@ COMMIT -- Case 2: Concurrent inserts with existing segment files in aoseg. 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 3: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); segno | tupcount -------+---------- @@ -51,7 +51,7 @@ INSERT 1 -- Here we aim to insert a tuple to the same seg as (1). -- Under jump jash, (15) and (1) are on the same seg(seg1). 1: INSERT INTO AO VALUES (15); -INSERT 1 +INSERT 0 1 3: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); segno | tupcount -------+---------- @@ -61,11 +61,11 @@ INSERT 1 1: BEGIN; BEGIN 1: INSERT INTO AO VALUES (15); -INSERT 1 +INSERT 0 1 2: BEGIN; BEGIN 2: INSERT INTO AO VALUES (15); -INSERT 1 +INSERT 0 1 1: COMMIT; COMMIT 2: COMMIT; @@ -77,9 +77,9 @@ COMMIT 2 | 3 (2 rows) 1: insert into ao select generate_series(1,100000); -INSERT 100000 +INSERT 0 100000 1: INSERT INTO AO VALUES (15); -INSERT 1 +INSERT 0 1 3: SELECT segno, case when tupcount = 0 then 'zero' when tupcount <= 5 then 'few' else 'many' end FROM gp_ao_or_aocs_seg('ao'); segno | case -------+------ diff --git a/src/test/isolation2/output/uao/insert_policy_2.source b/src/test/isolation2/output/uao/insert_policy_2.source index a763a89bb7d..1a726f56ae4 100644 --- a/src/test/isolation2/output/uao/insert_policy_2.source +++ b/src/test/isolation2/output/uao/insert_policy_2.source @@ -1,272 +1,272 @@ -- @Description Tests the AO segment file selection policy -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT) USING @amname@; -CREATE +CREATE TABLE 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 -- Actual test begins 1: INSERT INTO AO VALUES (1); -INSERT 1 +INSERT 0 1 2U: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); segno | tupcount -------+---------- 1 | 127 (1 row) 1: INSERT INTO AO VALUES (2); -INSERT 1 +INSERT 0 1 2U: SELECT segno, tupcount FROM gp_ao_or_aocs_seg('ao'); segno | tupcount -------+---------- @@ -275,11 +275,11 @@ INSERT 1 1: BEGIN; BEGIN 1: INSERT INTO AO VALUES (2); -INSERT 1 +INSERT 0 1 2: BEGIN; BEGIN 2: INSERT INTO AO VALUES (2); -INSERT 1 +INSERT 0 1 1: COMMIT; COMMIT 2: COMMIT; @@ -290,9 +290,9 @@ COMMIT 1 | 127 (1 row) 1: insert into ao select generate_series(1,100000); -INSERT 100000 +INSERT 0 100000 1: INSERT INTO AO VALUES (2); -INSERT 1 +INSERT 0 1 2U: SELECT segno, case when tupcount = 0 then 'zero' when tupcount <= 5 then 'few' else 'many' end FROM gp_ao_or_aocs_seg('ao'); segno | case -------+------ diff --git a/src/test/isolation2/output/uao/insert_while_vacuum.source b/src/test/isolation2/output/uao/insert_while_vacuum.source index 8203db799f3..34a0a297b07 100644 --- a/src/test/isolation2/output/uao/insert_while_vacuum.source +++ b/src/test/isolation2/output/uao/insert_while_vacuum.source @@ -1,51 +1,51 @@ -- @Description Ensures that an insert during a vacuum operation is ok -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT) USING @amname@; -CREATE +CREATE TABLE insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 DELETE FROM ao WHERE a < 128; DELETE 2667 @@ -53,7 +53,7 @@ DELETE 2667 4: BEGIN; BEGIN 4: insert into ao select generate_series(1001,2000);insert into ao select generate_series(1001,2000);insert into ao select generate_series(1001,2000);insert into ao select generate_series(1001,2000);insert into ao select generate_series(1001,2000);insert into ao select generate_series(1001,2000);insert into ao select generate_series(1001,2000);insert into ao select generate_series(1001,2000);insert into ao select generate_series(1001,2000);insert into ao select generate_series(1001,2000);insert into ao select generate_series(1001,2000);insert into ao select generate_series(1001,2000);insert into ao select generate_series(1001,2000);insert into ao select generate_series(1001,2000);insert into ao select generate_series(1001,2000);insert into ao select generate_series(1001,2000);insert into ao select generate_series(1001,2000);insert into ao select generate_series(1001,2000);insert into ao select generate_series(1001,2000);insert into ao select generate_series(1001,2000);COMMIT; -INSERT +COMMIT 2<: <... completed> VACUUM 3: SELECT COUNT(*) FROM ao WHERE a = 1500; @@ -62,4 +62,4 @@ VACUUM 20 (1 row) 4: INSERT INTO ao VALUES (0); -INSERT 1 +INSERT 0 1 diff --git a/src/test/isolation2/output/uao/limit_indexscan_inits.source b/src/test/isolation2/output/uao/limit_indexscan_inits.source index 034c66a57ce..9e21323bba1 100644 --- a/src/test/isolation2/output/uao/limit_indexscan_inits.source +++ b/src/test/isolation2/output/uao/limit_indexscan_inits.source @@ -16,40 +16,40 @@ select pg_stat_get_xact_numscans('gp_fastsequence_objid_objmod_index'::regclass) if quote_ident(itype) = 'btree' then /* for BTREE index */ select post_nscans - pre_nscans = segnos + 1 into result; /* calculate the diff and compare to segnos plus 1 to count in segfile0, expect equal */ raise notice '[BTREE] expect: post_nscans - pre_nscans == segnos + 1'; /* in func */ elsif quote_ident(itype) = 'brin' then /* for BRIN index */ select post_nscans - pre_nscans = ((segnos + 1) * 2 - 1) into result; /* BRIN doubles nscans(of BTREE) due to implementation constraint */ raise notice '[BRIN] expect: post_nscans - pre_nscans == ((segnos + 1) * 2 - 1)'; /* in func */ else /* in func */ raise exception 'unexpected type of index %', itype::text; /* in func */ end if; /* in func */ raise notice 'pre_nscans = %, post_nscans = %, segnos = %', pre_nscans, post_nscans, segnos; /* verbose */ return result; /* in func */ end; /* in func */ $$ language plpgsql; -CREATE +CREATE FUNCTION set default_table_access_method=@amname@; SET create table @amname@_limit_iscan_inits_tbl (a int, b int, c int, d int); -CREATE +CREATE TABLE create index on @amname@_limit_iscan_inits_tbl(a); -CREATE +CREATE INDEX create index on @amname@_limit_iscan_inits_tbl using brin (b); -CREATE +CREATE INDEX -- Start three concurrent writing sessions to generate three segment files. 1: begin; BEGIN 1: insert into @amname@_limit_iscan_inits_tbl select a, a, a, a from generate_series(1, 10)a; -INSERT 10 +INSERT 0 10 2: begin; BEGIN 2: insert into @amname@_limit_iscan_inits_tbl select a, a, a, a from generate_series(11, 20)a; -INSERT 10 +INSERT 0 10 3: begin; BEGIN 3: insert into @amname@_limit_iscan_inits_tbl select a, a, a, a from generate_series(21, 30)a; -INSERT 10 +INSERT 0 10 1: end; -END +COMMIT 2: end; -END +COMMIT 3: end; -END +COMMIT -- diable seqscan 0U: set enable_seqscan = off; @@ -89,8 +89,8 @@ SET 0Uq: ... drop table @amname@_limit_iscan_inits_tbl; -DROP +DROP TABLE drop function test_iscan_inits_same_as_aosegs; -DROP +DROP FUNCTION reset default_table_access_method; RESET diff --git a/src/test/isolation2/output/uao/max_concurrency.source b/src/test/isolation2/output/uao/max_concurrency.source index 9423f38f5e6..d484f75d4e5 100644 --- a/src/test/isolation2/output/uao/max_concurrency.source +++ b/src/test/isolation2/output/uao/max_concurrency.source @@ -1,12 +1,12 @@ -- @Description Insert into a ao relation with 127 concurrent transactions -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE ALTER RESOURCE GROUP admin_group SET CONCURRENCY 130; -ALTER +ALTER RESOURCE GROUP 1: BEGIN; BEGIN @@ -263,259 +263,259 @@ BEGIN 127: BEGIN; BEGIN 1: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 2: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 3: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 4: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 5: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 6: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 7: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 8: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 9: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 10: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 11: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 12: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 13: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 14: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 15: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 16: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 17: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 18: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 19: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 20: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 21: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 22: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 23: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 24: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 25: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 26: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 27: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 28: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 29: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 30: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 31: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 32: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 33: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 34: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 35: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 36: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 37: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 38: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 39: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 40: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 41: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 42: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 43: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 44: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 45: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 46: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 47: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 48: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 49: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 50: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 51: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 52: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 53: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 54: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 55: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 56: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 57: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 58: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 59: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 60: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 61: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 62: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 63: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 64: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 65: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 66: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 67: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 68: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 69: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 70: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 71: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 72: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 73: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 74: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 75: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 76: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 77: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 78: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 79: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 80: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 81: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 82: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 83: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 84: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 85: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 86: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 87: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 88: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 89: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 90: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 91: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 92: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 93: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 94: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 95: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 96: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 97: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 98: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 99: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 100: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 101: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 102: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 103: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 104: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 105: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 106: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 107: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 108: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 109: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 110: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 111: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 112: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 113: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 114: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 115: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 116: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 117: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 118: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 119: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 120: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 121: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 122: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 123: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 124: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 125: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 126: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 127: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 1: COMMIT; COMMIT 2: COMMIT; @@ -1034,4 +1034,4 @@ SELECT * FROM gp_ao_or_aocs_seg('ao') ORDER BY segno; (127 rows) ALTER RESOURCE GROUP admin_group SET CONCURRENCY 20; -ALTER +ALTER RESOURCE GROUP diff --git a/src/test/isolation2/output/uao/max_concurrency2.source b/src/test/isolation2/output/uao/max_concurrency2.source index 294e2feccfd..8776993e44f 100644 --- a/src/test/isolation2/output/uao/max_concurrency2.source +++ b/src/test/isolation2/output/uao/max_concurrency2.source @@ -11,12 +11,12 @@ GP_IGNORE: defined new match expression DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE ALTER RESOURCE GROUP admin_group SET CONCURRENCY 130; -ALTER +ALTER RESOURCE GROUP 1: BEGIN; BEGIN @@ -275,259 +275,259 @@ BEGIN 128: BEGIN; BEGIN 1: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 2: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 3: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 4: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 5: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 6: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 7: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 8: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 9: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 10: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 11: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 12: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 13: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 14: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 15: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 16: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 17: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 18: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 19: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 20: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 21: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 22: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 23: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 24: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 25: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 26: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 27: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 28: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 29: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 30: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 31: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 32: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 33: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 34: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 35: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 36: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 37: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 38: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 39: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 40: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 41: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 42: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 43: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 44: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 45: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 46: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 47: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 48: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 49: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 50: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 51: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 52: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 53: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 54: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 55: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 56: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 57: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 58: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 59: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 60: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 61: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 62: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 63: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 64: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 65: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 66: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 67: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 68: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 69: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 70: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 71: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 72: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 73: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 74: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 75: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 76: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 77: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 78: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 79: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 80: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 81: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 82: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 83: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 84: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 85: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 86: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 87: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 88: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 89: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 90: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 91: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 92: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 93: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 94: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 95: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 96: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 97: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 98: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 99: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 100: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 101: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 102: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 103: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 104: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 105: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 106: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 107: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 108: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 109: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 110: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 111: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 112: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 113: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 114: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 115: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 116: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 117: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 118: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 119: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 120: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 121: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 122: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 123: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 124: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 125: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 126: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 127: INSERT INTO AO VALUES (1, 1); -INSERT 1 +INSERT 0 1 128: INSERT INTO AO VALUES (1, 1); ERROR: could not find segment file to use for inserting into relation "ao" 1: COMMIT; @@ -1346,4 +1346,4 @@ SELECT * FROM gp_ao_or_aocs_seg('ao') ORDER BY state, segno; (127 rows) ALTER RESOURCE GROUP admin_group SET CONCURRENCY 20; -ALTER +ALTER RESOURCE GROUP diff --git a/src/test/isolation2/output/uao/modcount.source b/src/test/isolation2/output/uao/modcount.source index 1abf7996d8a..00345d6a556 100644 --- a/src/test/isolation2/output/uao/modcount.source +++ b/src/test/isolation2/output/uao/modcount.source @@ -1,11 +1,11 @@ -- @Description Tests that DML operatins change the modification count. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,10) AS i; -INSERT 10 +INSERT 0 10 SELECT state, tupcount, modcount FROM gp_ao_or_aocs_seg('ao'); state | tupcount | modcount @@ -15,7 +15,7 @@ SELECT state, tupcount, modcount FROM gp_ao_or_aocs_seg('ao'); 1 | 5 | 1 (3 rows) INSERT INTO ao VALUES (11, 11); -INSERT 1 +INSERT 0 1 SELECT state, tupcount, modcount FROM gp_ao_or_aocs_seg('ao'); state | tupcount | modcount -------+----------+---------- diff --git a/src/test/isolation2/output/uao/modcount_vacuum.source b/src/test/isolation2/output/uao/modcount_vacuum.source index 49f29b9ae92..468de1a4b3f 100644 --- a/src/test/isolation2/output/uao/modcount_vacuum.source +++ b/src/test/isolation2/output/uao/modcount_vacuum.source @@ -1,11 +1,11 @@ -- @Description Tests that vacuum is not changing the modification count. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,10) AS i; -INSERT 10 +INSERT 0 10 DELETE FROM ao WHERE a < 5; DELETE 4 diff --git a/src/test/isolation2/output/uao/parallel_delete.source b/src/test/isolation2/output/uao/parallel_delete.source index 0ac8859d81a..4f54ef9caa2 100644 --- a/src/test/isolation2/output/uao/parallel_delete.source +++ b/src/test/isolation2/output/uao/parallel_delete.source @@ -2,11 +2,11 @@ -- until the transaction is committed. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT) USING @amname@ DISTRIBUTED BY (a); -CREATE +CREATE TABLE insert into ao select generate_series(1,100); -INSERT 100 +INSERT 0 100 -- The actual test begins 1: BEGIN; diff --git a/src/test/isolation2/output/uao/parallel_delete_2.source b/src/test/isolation2/output/uao/parallel_delete_2.source index 0723a997aab..f7678fa784a 100644 --- a/src/test/isolation2/output/uao/parallel_delete_2.source +++ b/src/test/isolation2/output/uao/parallel_delete_2.source @@ -2,11 +2,11 @@ -- until the transaction is committed. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT) USING @amname@ DISTRIBUTED BY (a); -CREATE +CREATE TABLE insert into ao select generate_series(1,100); -INSERT 100 +INSERT 0 100 -- The actual test begins 1: BEGIN; diff --git a/src/test/isolation2/output/uao/parallel_delete_optimizer.source b/src/test/isolation2/output/uao/parallel_delete_optimizer.source index 0ac8859d81a..4f54ef9caa2 100644 --- a/src/test/isolation2/output/uao/parallel_delete_optimizer.source +++ b/src/test/isolation2/output/uao/parallel_delete_optimizer.source @@ -2,11 +2,11 @@ -- until the transaction is committed. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT) USING @amname@ DISTRIBUTED BY (a); -CREATE +CREATE TABLE insert into ao select generate_series(1,100); -INSERT 100 +INSERT 0 100 -- The actual test begins 1: BEGIN; diff --git a/src/test/isolation2/output/uao/parallel_update.source b/src/test/isolation2/output/uao/parallel_update.source index 35077903916..6665c8f75ac 100644 --- a/src/test/isolation2/output/uao/parallel_update.source +++ b/src/test/isolation2/output/uao/parallel_update.source @@ -2,11 +2,11 @@ -- until the transaction is committed. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,10) AS i; -INSERT 10 +INSERT 0 10 -- The actual test begins 1: BEGIN; diff --git a/src/test/isolation2/output/uao/parallel_update_2.source b/src/test/isolation2/output/uao/parallel_update_2.source index d190b8852d9..98576a4bacd 100644 --- a/src/test/isolation2/output/uao/parallel_update_2.source +++ b/src/test/isolation2/output/uao/parallel_update_2.source @@ -2,11 +2,11 @@ -- until the transaction is committed. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,10) AS i; -INSERT 10 +INSERT 0 10 -- The actual test begins 1: BEGIN; diff --git a/src/test/isolation2/output/uao/parallel_update_optimizer.source b/src/test/isolation2/output/uao/parallel_update_optimizer.source index 35077903916..6665c8f75ac 100644 --- a/src/test/isolation2/output/uao/parallel_update_optimizer.source +++ b/src/test/isolation2/output/uao/parallel_update_optimizer.source @@ -2,11 +2,11 @@ -- until the transaction is committed. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,10) AS i; -INSERT 10 +INSERT 0 10 -- The actual test begins 1: BEGIN; diff --git a/src/test/isolation2/output/uao/parallel_update_readcommitted.source b/src/test/isolation2/output/uao/parallel_update_readcommitted.source index d9ca48fc74c..a7cda472e7b 100644 --- a/src/test/isolation2/output/uao/parallel_update_readcommitted.source +++ b/src/test/isolation2/output/uao/parallel_update_readcommitted.source @@ -2,11 +2,11 @@ -- until the transaction is committed. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,10) AS i; -INSERT 10 +INSERT 0 10 -- The actual test begins 1: BEGIN; diff --git a/src/test/isolation2/output/uao/phantom_reads.source b/src/test/isolation2/output/uao/phantom_reads.source index 849b6a45fd5..4278d3cbbf7 100644 --- a/src/test/isolation2/output/uao/phantom_reads.source +++ b/src/test/isolation2/output/uao/phantom_reads.source @@ -2,11 +2,11 @@ -- Actually, no UAO is involved here. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; -INSERT 100 +INSERT 0 100 1: BEGIN; BEGIN @@ -28,7 +28,7 @@ BEGIN 2: BEGIN; BEGIN 2: INSERT INTO ao VALUES (101, 25); -INSERT 1 +INSERT 0 1 2: COMMIT; COMMIT 1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; diff --git a/src/test/isolation2/output/uao/phantom_reads_delete.source b/src/test/isolation2/output/uao/phantom_reads_delete.source index 7a6a33d470e..8bb65fdaeb3 100644 --- a/src/test/isolation2/output/uao/phantom_reads_delete.source +++ b/src/test/isolation2/output/uao/phantom_reads_delete.source @@ -2,11 +2,11 @@ -- the default isolation level. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; -INSERT 100 +INSERT 0 100 1: BEGIN; BEGIN diff --git a/src/test/isolation2/output/uao/phantom_reads_delete_serializable.source b/src/test/isolation2/output/uao/phantom_reads_delete_serializable.source index a0d814acc45..608aae6dbba 100644 --- a/src/test/isolation2/output/uao/phantom_reads_delete_serializable.source +++ b/src/test/isolation2/output/uao/phantom_reads_delete_serializable.source @@ -2,11 +2,11 @@ -- the serializable isolation level. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; -INSERT 100 +INSERT 0 100 1: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN diff --git a/src/test/isolation2/output/uao/phantom_reads_serializable.source b/src/test/isolation2/output/uao/phantom_reads_serializable.source index 0b1a7b00f62..87d396bd976 100644 --- a/src/test/isolation2/output/uao/phantom_reads_serializable.source +++ b/src/test/isolation2/output/uao/phantom_reads_serializable.source @@ -2,11 +2,11 @@ -- transactions. Actually, no UAO is involved here. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; -INSERT 100 +INSERT 0 100 1: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN @@ -28,7 +28,7 @@ BEGIN 2: BEGIN; BEGIN 2: INSERT INTO ao VALUES (101, 25); -INSERT 1 +INSERT 0 1 2: COMMIT; COMMIT 1: SELECT * FROM ao WHERE b BETWEEN 20 AND 30 ORDER BY a; diff --git a/src/test/isolation2/output/uao/phantom_reads_update.source b/src/test/isolation2/output/uao/phantom_reads_update.source index 65e2428c6d4..6e92225bb31 100644 --- a/src/test/isolation2/output/uao/phantom_reads_update.source +++ b/src/test/isolation2/output/uao/phantom_reads_update.source @@ -2,11 +2,11 @@ -- the default isolation level. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; -INSERT 100 +INSERT 0 100 1: BEGIN; BEGIN diff --git a/src/test/isolation2/output/uao/phantom_reads_update_serializable.source b/src/test/isolation2/output/uao/phantom_reads_update_serializable.source index 6d7665642a2..149f5864a2d 100644 --- a/src/test/isolation2/output/uao/phantom_reads_update_serializable.source +++ b/src/test/isolation2/output/uao/phantom_reads_update_serializable.source @@ -2,11 +2,11 @@ -- the serializable isolation level. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; -INSERT 100 +INSERT 0 100 1: BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN diff --git a/src/test/isolation2/output/uao/select_after_vacuum.source b/src/test/isolation2/output/uao/select_after_vacuum.source index 5227d1fe7c1..ef86bf99b6e 100644 --- a/src/test/isolation2/output/uao/select_after_vacuum.source +++ b/src/test/isolation2/output/uao/select_after_vacuum.source @@ -1,57 +1,57 @@ -- @Description Ensures that a select after a vacuum operation is ok -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE DROP TABLE IF EXISTS ao2; -DROP +DROP TABLE CREATE TABLE ao2 (a INT) USING @amname@; -CREATE +CREATE TABLE CREATE TABLE ao (a INT) USING @amname@; -CREATE +CREATE TABLE insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao2 select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 -- The actual test begins DELETE FROM ao WHERE a < 128; @@ -95,7 +95,7 @@ COMMIT 18333 (1 row) 3: INSERT INTO ao VALUES (0); -INSERT 1 +INSERT 0 1 0: SELECT segno, case when tupcount = 0 then 'zero' when tupcount = 1 then 'one' when tupcount <= 5 then 'few' else 'many' end FROM gp_ao_or_aocs_seg('ao'); segno | case -------+------ diff --git a/src/test/isolation2/output/uao/select_after_vacuum_serializable.source b/src/test/isolation2/output/uao/select_after_vacuum_serializable.source index 3542fe507da..d95eb1db60f 100644 --- a/src/test/isolation2/output/uao/select_after_vacuum_serializable.source +++ b/src/test/isolation2/output/uao/select_after_vacuum_serializable.source @@ -1,57 +1,57 @@ -- @Description Ensures that a serializable select before during a vacuum operation blocks the vacuum. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE DROP TABLE IF EXISTS ao2; -DROP +DROP TABLE CREATE TABLE ao (a INT) USING @amname@; -CREATE +CREATE TABLE CREATE TABLE ao2 (a INT) USING @amname@; -CREATE +CREATE TABLE insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao2 select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 DELETE FROM ao WHERE a < 128; DELETE 2667 @@ -72,4 +72,4 @@ VACUUM 1: COMMIT; COMMIT 3: INSERT INTO ao VALUES (0); -INSERT 1 +INSERT 0 1 diff --git a/src/test/isolation2/output/uao/select_before_vacuum.source b/src/test/isolation2/output/uao/select_before_vacuum.source index 003098d9ef8..f0d73cbbbb8 100644 --- a/src/test/isolation2/output/uao/select_before_vacuum.source +++ b/src/test/isolation2/output/uao/select_before_vacuum.source @@ -1,51 +1,51 @@ -- @Description Ensures that a select before a vacuum operation is ok -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT) USING @amname@; -CREATE +CREATE TABLE insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 DELETE FROM ao WHERE a < 128; DELETE 2667 @@ -77,4 +77,4 @@ VACUUM 18333 (1 row) 3: INSERT INTO ao VALUES (0); -INSERT 1 +INSERT 0 1 diff --git a/src/test/isolation2/output/uao/select_while_delete.source b/src/test/isolation2/output/uao/select_while_delete.source index 529c9453da8..b87464866bf 100644 --- a/src/test/isolation2/output/uao/select_while_delete.source +++ b/src/test/isolation2/output/uao/select_while_delete.source @@ -1,11 +1,11 @@ -- @Description Ensures that a select during a delete operation is ok -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT) USING @amname@; -CREATE +CREATE TABLE insert into ao select generate_series(1,100); -INSERT 100 +INSERT 0 100 2: BEGIN; BEGIN @@ -52,4 +52,4 @@ COMMIT 9 (5 rows) 4: INSERT INTO ao VALUES (0); -INSERT 1 +INSERT 0 1 diff --git a/src/test/isolation2/output/uao/select_while_full_vacuum.source b/src/test/isolation2/output/uao/select_while_full_vacuum.source index dc32c7fa917..9d84796151b 100644 --- a/src/test/isolation2/output/uao/select_while_full_vacuum.source +++ b/src/test/isolation2/output/uao/select_while_full_vacuum.source @@ -1,51 +1,51 @@ -- @Description Ensures that a select during a full vacuum operation is ok -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT) USING @amname@; -CREATE +CREATE TABLE insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 DELETE FROM ao WHERE a < 128; DELETE 2667 @@ -55,6 +55,6 @@ BEGIN 2: VACUUM FULL ao; VACUUM 1<: <... completed> -SELECT +COMMIT 3: INSERT INTO ao VALUES (0); -INSERT 1 +INSERT 0 1 diff --git a/src/test/isolation2/output/uao/select_while_vacuum.source b/src/test/isolation2/output/uao/select_while_vacuum.source index 39a501a0460..a0d364b8612 100644 --- a/src/test/isolation2/output/uao/select_while_vacuum.source +++ b/src/test/isolation2/output/uao/select_while_vacuum.source @@ -1,51 +1,51 @@ -- @Description Ensures that a select during a vacuum operation is ok -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT) USING @amname@; -CREATE +CREATE TABLE insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 DELETE FROM ao WHERE a < 128; DELETE 2667 @@ -55,6 +55,6 @@ BEGIN 2: VACUUM ao; VACUUM 1<: <... completed> -SELECT +COMMIT 3: INSERT INTO ao VALUES (0); -INSERT 1 +INSERT 0 1 diff --git a/src/test/isolation2/output/uao/select_while_vacuum_serializable.source b/src/test/isolation2/output/uao/select_while_vacuum_serializable.source index 9c6ecbd5a71..494c40444bb 100644 --- a/src/test/isolation2/output/uao/select_while_vacuum_serializable.source +++ b/src/test/isolation2/output/uao/select_while_vacuum_serializable.source @@ -1,51 +1,51 @@ -- @Description Ensures that a select from a serializalbe transaction is ok after vacuum -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT) USING @amname@; -CREATE +CREATE TABLE insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 DELETE FROM ao WHERE a < 128; DELETE 2667 @@ -59,4 +59,4 @@ VACUUM 18333 (1 row) 3: INSERT INTO ao VALUES (0); -INSERT 1 +INSERT 0 1 diff --git a/src/test/isolation2/output/uao/select_while_vacuum_serializable2.source b/src/test/isolation2/output/uao/select_while_vacuum_serializable2.source index 583f9e12c45..1fbab5fd618 100644 --- a/src/test/isolation2/output/uao/select_while_vacuum_serializable2.source +++ b/src/test/isolation2/output/uao/select_while_vacuum_serializable2.source @@ -2,51 +2,51 @@ -- on the table. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT) USING @amname@; -CREATE +CREATE TABLE insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 DELETE FROM ao WHERE a < 128; DELETE 2667 @@ -74,7 +74,7 @@ VACUUM 1: COMMIT; COMMIT 3: INSERT INTO ao VALUES (0); -INSERT 1 +INSERT 0 1 2: SELECT segment_id, segno, tupcount, state FROM gp_ao_or_aocs_seg('ao'); segment_id | segno | tupcount | state ------------+-------+----------+------- diff --git a/src/test/isolation2/output/uao/selectinsert_while_vacuum.source b/src/test/isolation2/output/uao/selectinsert_while_vacuum.source index 88d50af5fb0..a07d6d12146 100644 --- a/src/test/isolation2/output/uao/selectinsert_while_vacuum.source +++ b/src/test/isolation2/output/uao/selectinsert_while_vacuum.source @@ -1,49 +1,49 @@ -- @Description Ensures that an insert during a vacuum operation is ok -- CREATE TABLE selectinsert_while_vacuum_@amname@ (a INT) USING @amname@; -CREATE +CREATE TABLE insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into selectinsert_while_vacuum_@amname@ select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 DELETE FROM selectinsert_while_vacuum_@amname@ WHERE a < 128; DELETE 2667 @@ -70,7 +70,7 @@ BEGIN (1 row) 2>: VACUUM selectinsert_while_vacuum_@amname@; 4: SELECT COUNT(*) FROM selectinsert_while_vacuum_@amname@;SELECT COUNT(*) FROM selectinsert_while_vacuum_@amname@;BEGIN;insert into selectinsert_while_vacuum_@amname@ select generate_series(1001,2000);insert into selectinsert_while_vacuum_@amname@ select generate_series(1001,2000);insert into selectinsert_while_vacuum_@amname@ select generate_series(1001,2000);insert into selectinsert_while_vacuum_@amname@ select generate_series(1001,2000);insert into selectinsert_while_vacuum_@amname@ select generate_series(1001,2000);insert into selectinsert_while_vacuum_@amname@ select generate_series(1001,2000);insert into selectinsert_while_vacuum_@amname@ select generate_series(1001,2000);insert into selectinsert_while_vacuum_@amname@ select generate_series(1001,2000);insert into selectinsert_while_vacuum_@amname@ select generate_series(1001,2000);insert into selectinsert_while_vacuum_@amname@ select generate_series(1001,2000);insert into selectinsert_while_vacuum_@amname@ select generate_series(1001,2000);insert into selectinsert_while_vacuum_@amname@ select generate_series(1001,2000);insert into selectinsert_while_vacuum_@amname@ select generate_series(1001,2000);insert into selectinsert_while_vacuum_@amname@ select generate_series(1001,2000);insert into selectinsert_while_vacuum_@amname@ select generate_series(1001,2000);insert into selectinsert_while_vacuum_@amname@ select generate_series(1001,2000);insert into selectinsert_while_vacuum_@amname@ select generate_series(1001,2000);insert into selectinsert_while_vacuum_@amname@ select generate_series(1001,2000);insert into selectinsert_while_vacuum_@amname@ select generate_series(1001,2000);insert into selectinsert_while_vacuum_@amname@ select generate_series(1001,2000);COMMIT; -SELECT +COMMIT 2<: <... completed> VACUUM 3: SELECT COUNT(*) FROM selectinsert_while_vacuum_@amname@ WHERE a = 1500; @@ -79,4 +79,4 @@ VACUUM 20 (1 row) 3: INSERT INTO selectinsert_while_vacuum_@amname@ VALUES (0); -INSERT 1 +INSERT 0 1 diff --git a/src/test/isolation2/output/uao/selectinsertupdate_while_vacuum.source b/src/test/isolation2/output/uao/selectinsertupdate_while_vacuum.source index fb69f657b5e..e9caac2064e 100644 --- a/src/test/isolation2/output/uao/selectinsertupdate_while_vacuum.source +++ b/src/test/isolation2/output/uao/selectinsertupdate_while_vacuum.source @@ -1,11 +1,11 @@ -- @Description Ensures that an update during a vacuum operation is ok -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,10) AS i; -INSERT 10 +INSERT 0 10 DELETE FROM ao WHERE a < 2; DELETE 1 @@ -17,16 +17,16 @@ BEGIN 9 (1 row) 4: INSERT INTO ao VALUES (1, 1); -INSERT 1 +INSERT 0 1 4>: UPDATE ao SET b=1 WHERE a > 5;UPDATE ao SET b=1 WHERE a > 6;COMMIT; 2: VACUUM ao; VACUUM 4<: <... completed> -UPDATE +COMMIT 3: SELECT COUNT(*) FROM ao WHERE b = 1; count ------- 6 (1 row) 3: INSERT INTO ao VALUES (0); -INSERT 1 +INSERT 0 1 diff --git a/src/test/isolation2/output/uao/selectupdate_while_vacuum.source b/src/test/isolation2/output/uao/selectupdate_while_vacuum.source index b5e37aedf2c..d37fb238999 100644 --- a/src/test/isolation2/output/uao/selectupdate_while_vacuum.source +++ b/src/test/isolation2/output/uao/selectupdate_while_vacuum.source @@ -1,41 +1,41 @@ -- @Description Ensures that an update during a vacuum operation is ok -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; -INSERT 1000 +INSERT 0 1000 INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; -INSERT 1000 +INSERT 0 1000 INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; -INSERT 1000 +INSERT 0 1000 INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; -INSERT 1000 +INSERT 0 1000 INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; -INSERT 1000 +INSERT 0 1000 INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; -INSERT 1000 +INSERT 0 1000 INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; -INSERT 1000 +INSERT 0 1000 INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; -INSERT 1000 +INSERT 0 1000 INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; -INSERT 1000 +INSERT 0 1000 INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; -INSERT 1000 +INSERT 0 1000 INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; -INSERT 1000 +INSERT 0 1000 INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; -INSERT 1000 +INSERT 0 1000 INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; -INSERT 1000 +INSERT 0 1000 INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; -INSERT 1000 +INSERT 0 1000 INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; -INSERT 1000 +INSERT 0 1000 INSERT INTO ao SELECT i as a, i as b FROM generate_series(1,1000) AS i; -INSERT 1000 +INSERT 0 1000 DELETE FROM ao WHERE a < 128; DELETE 2032 @@ -62,7 +62,7 @@ BEGIN (1 row) 2>: VACUUM ao; 4: SELECT COUNT(*) FROM ao;SELECT COUNT(*) FROM ao;BEGIN;UPDATE ao SET b=1 WHERE a > 500;UPDATE ao SET b=1 WHERE a > 400;COMMIT; -SELECT +COMMIT 2<: <... completed> VACUUM 3: SELECT COUNT(*) FROM ao WHERE b = 1; @@ -71,4 +71,4 @@ VACUUM 9600 (1 row) 3: INSERT INTO ao VALUES (0); -INSERT 1 +INSERT 0 1 diff --git a/src/test/isolation2/output/uao/snapshot_index_corruption.source b/src/test/isolation2/output/uao/snapshot_index_corruption.source index 59b00e9f10c..8ce4c624520 100644 --- a/src/test/isolation2/output/uao/snapshot_index_corruption.source +++ b/src/test/isolation2/output/uao/snapshot_index_corruption.source @@ -2,17 +2,17 @@ -- -- Create AO table, insert few rows on it. drop table if exists test_ao; -DROP +DROP TABLE create table test_ao(i bigint) using @amname@ distributed by (i); -CREATE +CREATE TABLE insert into test_ao select generate_series(1,100); -INSERT 100 +INSERT 0 100 -- Test 1 -- Begin single-insert transaction. 1: begin; BEGIN 1: insert into test_ao values(101); -INSERT 1 +INSERT 0 1 -- Try to create index, it should hold on lock before commit below. 2&: create index test_ao_idx on test_ao(i); -- Commit single-insert transaction, so index continues creation. @@ -20,7 +20,7 @@ INSERT 1 COMMIT -- Force index usage and check row is here (false before fix). 2<: <... completed> -CREATE +CREATE INDEX 2: set optimizer=off; SET 2: set enable_seqscan=off; @@ -44,7 +44,7 @@ SET -- Test 2 -- Drop incomplete index 1: drop index test_ao_idx; -DROP +DROP INDEX -- Check row is here and start repeatable read transaction. 2: select i from test_ao where i = 100; i @@ -64,7 +64,7 @@ SET 1: update test_ao set i = 200 where i = 100; UPDATE 1 1: create index test_ao_idx on test_ao(i); -CREATE +CREATE INDEX -- For the repeatable read isolation level row still there. 2: explain (costs off) select i from test_ao where i = 100; QUERY PLAN diff --git a/src/test/isolation2/output/uao/test_pg_appendonly_version.source b/src/test/isolation2/output/uao/test_pg_appendonly_version.source index 2bcf4f25353..6cbfdbc49bc 100644 --- a/src/test/isolation2/output/uao/test_pg_appendonly_version.source +++ b/src/test/isolation2/output/uao/test_pg_appendonly_version.source @@ -2,7 +2,7 @@ -- as it requires pg_appendonly.version >= AORelationVersion_CB2. create table @amname@_version_tbl (a int) using @amname@; -CREATE +CREATE TABLE -- unique index on AO is supported starting from version 2 (AORelationVersion_CB2) select version from pg_appendonly where relid = '@amname@_version_tbl'::regclass; @@ -11,11 +11,11 @@ select version from pg_appendonly where relid = '@amname@_version_tbl'::regclass 2 (1 row) create unique index on @amname@_version_tbl(a); -CREATE +CREATE INDEX insert into @amname@_version_tbl select generate_series(1, 10); -INSERT 10 +INSERT 0 10 create unique index on @amname@_version_tbl(a); -CREATE +CREATE INDEX set enable_seqscan = off; SET select * from @amname@_version_tbl where a = 2; @@ -43,14 +43,14 @@ HINT: ALTER TABLE SET WITH (REORGANIZE = true) before creating the -- alter table with reorganize to verify pg_appendonly being rewritten alter table @amname@_version_tbl set with (reorganize = true); -ALTER +ALTER TABLE select version from pg_appendonly where relid = '@amname@_version_tbl'::regclass; version --------- 2 (1 row) create unique index on @amname@_version_tbl(a); -CREATE +CREATE INDEX select * from @amname@_version_tbl where a = 3; a --- @@ -58,6 +58,6 @@ select * from @amname@_version_tbl where a = 3; (1 row) drop table @amname@_version_tbl; -DROP +DROP TABLE reset allow_system_table_mods; RESET diff --git a/src/test/isolation2/output/uao/update_while_vacuum.source b/src/test/isolation2/output/uao/update_while_vacuum.source index 881f19c8a20..fd6979fa8fc 100644 --- a/src/test/isolation2/output/uao/update_while_vacuum.source +++ b/src/test/isolation2/output/uao/update_while_vacuum.source @@ -1,11 +1,11 @@ -- @Description Ensures that an update before a vacuum operation is ok -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; -INSERT 100 +INSERT 0 100 DELETE FROM ao WHERE a < 12; DELETE 11 @@ -20,11 +20,11 @@ BEGIN 2: VACUUM ao; VACUUM 1<: <... completed> -UPDATE +COMMIT 1: SELECT COUNT(*) FROM ao; count ------- 89 (1 row) 3: INSERT INTO ao VALUES (0); -INSERT 1 +INSERT 0 1 diff --git a/src/test/isolation2/output/uao/vacuum_cleanup.source b/src/test/isolation2/output/uao/vacuum_cleanup.source index b90c82bfd68..a81d731c8ed 100644 --- a/src/test/isolation2/output/uao/vacuum_cleanup.source +++ b/src/test/isolation2/output/uao/vacuum_cleanup.source @@ -3,10 +3,10 @@ -- The age of the table is 1 after the following statement 2: create table ao_@amname@_vacuum_cleanup2(a int, b int) using @amname@; -CREATE +CREATE TABLE -- The age of the table is 2 after the following statement 2: insert into ao_@amname@_vacuum_cleanup2 select i, i from generate_series(1, 100) i; -INSERT 100 +INSERT 0 100 -- The age of the table is 7 after the following 5 statements 2: update ao_@amname@_vacuum_cleanup2 set b = b + 1; UPDATE 100 @@ -50,13 +50,13 @@ VACUUM 1 | pg_aovisimap_ (2 rows) 2: end; -END +COMMIT -- Check that drop phase is not skipped, when there are concurrent serializable transactions. 1: create table ao_@amname@_vacuum_cleanup3(a int, b int) using @amname@; -CREATE +CREATE TABLE 1: insert into ao_@amname@_vacuum_cleanup3 select i, i from generate_series(1, 100) i; -INSERT 100 +INSERT 0 100 1: delete from ao_@amname@_vacuum_cleanup3; DELETE 100 @@ -136,14 +136,14 @@ COMMIT create or replace function show_aoseg(tabname text) returns table (segno int, tupcount bigint, modcount bigint, formatversion smallint, state smallint) as $$ declare tabrelid oid; /* in func */ tabsegrelid oid; /* in func */ tabsegrelname text; /* in func */ begin select tabname::regclass::oid into tabrelid; /* in func */ select segrelid from pg_appendonly where relid = tabrelid into tabsegrelid; /* in func */ select relname from pg_class where oid = tabsegrelid into tabsegrelname; /* in func */ return query execute 'select segno,tupcount,modcount,formatversion,state from pg_aoseg.' || tabsegrelname; /* in func */ end; /* in func */ $$ language plpgsql; -CREATE +CREATE FUNCTION create table vacuum_concurrent_test_@amname@ (a int, b int, c int) using @amname@; -CREATE +CREATE TABLE insert into vacuum_concurrent_test_@amname@ select 2, b, b from generate_series(1, 11) b; -INSERT 11 +INSERT 0 11 create index i_b_vacuum_concurrent_reader_@amname@ on vacuum_concurrent_test_@amname@(b); -CREATE +CREATE INDEX update vacuum_concurrent_test_@amname@ set b = b + 1; UPDATE 11 @@ -195,7 +195,7 @@ VACUUM 2 | 12 | 11 (11 rows) 1: end; -END +COMMIT -- start another reader after VACUUM 2: begin; @@ -246,7 +246,7 @@ VACUUM 2 | 12 | 11 (11 rows) 2: end; -END +COMMIT 1q: ... 2q: ... @@ -257,16 +257,16 @@ END -- the corresponding index entries should not be deleted. truncate table vacuum_concurrent_test_@amname@; -TRUNCATE +TRUNCATE TABLE insert into vacuum_concurrent_test_@amname@ select 2, b, b from generate_series(1, 5) b; -INSERT 5 +INSERT 0 5 delete from vacuum_concurrent_test_@amname@; DELETE 5 1: begin; BEGIN 1: insert into vacuum_concurrent_test_@amname@ select 2, b, b from generate_series(6, 10) b; -INSERT 5 +INSERT 0 5 2: vacuum vacuum_concurrent_test_@amname@; VACUUM @@ -457,6 +457,6 @@ reset gp_select_invisible; RESET drop table vacuum_concurrent_test_@amname@; -DROP +DROP TABLE drop function show_aoseg; -DROP +DROP FUNCTION diff --git a/src/test/isolation2/output/uao/vacuum_index_stats.source b/src/test/isolation2/output/uao/vacuum_index_stats.source index ac47b47913f..b73960fad8e 100644 --- a/src/test/isolation2/output/uao/vacuum_index_stats.source +++ b/src/test/isolation2/output/uao/vacuum_index_stats.source @@ -12,11 +12,11 @@ -- The new strategy would not impact table->reltuples updates. create table vacuum_index_stats_@amname@ (a int, b int, c int) using @amname@; -CREATE +CREATE TABLE insert into vacuum_index_stats_@amname@ select 2, b, b from generate_series(1, 11) b; -INSERT 11 +INSERT 0 11 create index i_b_vacuum_index_stats_@amname@ on vacuum_index_stats_@amname@(b); -CREATE +CREATE INDEX set gp_appendonly_compaction_threshold = 10; SET @@ -102,6 +102,6 @@ VACUUM 0Uq: ... drop table vacuum_index_stats_@amname@; -DROP +DROP TABLE reset gp_appendonly_compaction_threshold; RESET diff --git a/src/test/isolation2/output/uao/vacuum_self_function.source b/src/test/isolation2/output/uao/vacuum_self_function.source index dd0b87b5796..978de51501b 100644 --- a/src/test/isolation2/output/uao/vacuum_self_function.source +++ b/src/test/isolation2/output/uao/vacuum_self_function.source @@ -2,17 +2,17 @@ -- that was acquired before vacuum. -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; -INSERT 100 +INSERT 0 100 DELETE FROM ao WHERE a <= 30; DELETE 30 create or replace function myfunc() returns bigint as $$ begin /* inside a function */ perform pg_sleep(10); /* inside a function */ return (select count(*) from ao); /* inside a function */ end; /* inside a function */ $$ stable language plpgsql; -CREATE +CREATE FUNCTION -- Launch function into the background. 1&: select myfunc(); diff --git a/src/test/isolation2/output/uao/vacuum_self_serializable.source b/src/test/isolation2/output/uao/vacuum_self_serializable.source index fd70b62d4a1..87c8956a6f7 100644 --- a/src/test/isolation2/output/uao/vacuum_self_serializable.source +++ b/src/test/isolation2/output/uao/vacuum_self_serializable.source @@ -1,11 +1,11 @@ -- @Description Ensures that a vacuum with serializable works ok -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; -INSERT 100 +INSERT 0 100 DELETE FROM ao WHERE a <= 30; DELETE 30 diff --git a/src/test/isolation2/output/uao/vacuum_self_serializable2.source b/src/test/isolation2/output/uao/vacuum_self_serializable2.source index 6e78b5344a3..d9c35bde734 100644 --- a/src/test/isolation2/output/uao/vacuum_self_serializable2.source +++ b/src/test/isolation2/output/uao/vacuum_self_serializable2.source @@ -1,15 +1,15 @@ -- @Description Ensures that a vacuum with serializable works ok -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE DROP TABLE IF EXISTS ao2; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE CREATE TABLE ao2 (a INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; -INSERT 100 +INSERT 0 100 DELETE FROM ao WHERE a <= 30; DELETE 30 diff --git a/src/test/isolation2/output/uao/vacuum_self_serializable3.source b/src/test/isolation2/output/uao/vacuum_self_serializable3.source index 0ded4a3ed9b..0a44a62ce29 100644 --- a/src/test/isolation2/output/uao/vacuum_self_serializable3.source +++ b/src/test/isolation2/output/uao/vacuum_self_serializable3.source @@ -1,15 +1,15 @@ -- @Description Ensures that a vacuum with serializable works ok -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE DROP TABLE IF EXISTS ao2; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE CREATE TABLE ao2 (a INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 100) AS i; -INSERT 100 +INSERT 0 100 DELETE FROM ao WHERE a <= 30; DELETE 30 diff --git a/src/test/isolation2/output/uao/vacuum_while_insert.source b/src/test/isolation2/output/uao/vacuum_while_insert.source index ab89f7c2007..a876117ba54 100644 --- a/src/test/isolation2/output/uao/vacuum_while_insert.source +++ b/src/test/isolation2/output/uao/vacuum_while_insert.source @@ -1,51 +1,51 @@ -- @Description Ensures that a vacuum during insert operations is ok -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT) USING @amname@; -CREATE +CREATE TABLE insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 insert into ao select generate_series(1,1000); -INSERT 1000 +INSERT 0 1000 DELETE FROM ao WHERE a < 128; DELETE 2667 @@ -58,13 +58,13 @@ BEGIN 2: VACUUM ao; VACUUM 1<: <... completed> -INSERT +COMMIT 4<: <... completed> -INSERT +COMMIT 3: SELECT COUNT(*) FROM ao WHERE a = 1500; count ------- 40 (1 row) 3: INSERT INTO ao VALUES (0); -INSERT 1 +INSERT 0 1 diff --git a/src/test/isolation2/output/uao/vacuum_while_vacuum.source b/src/test/isolation2/output/uao/vacuum_while_vacuum.source index 4e7578ab986..492d19f7438 100644 --- a/src/test/isolation2/output/uao/vacuum_while_vacuum.source +++ b/src/test/isolation2/output/uao/vacuum_while_vacuum.source @@ -1,21 +1,21 @@ -- @Description Ensures that an vacuum while a vacuum operation is ok -- DROP TABLE IF EXISTS ao; -DROP +DROP TABLE CREATE TABLE ao (a INT, b INT) USING @amname@; -CREATE +CREATE TABLE INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 10000) AS i; -INSERT 10000 +INSERT 0 10000 INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 10000) AS i; -INSERT 10000 +INSERT 0 10000 INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 10000) AS i; -INSERT 10000 +INSERT 0 10000 INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 10000) AS i; -INSERT 10000 +INSERT 0 10000 INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 10000) AS i; -INSERT 10000 +INSERT 0 10000 INSERT INTO ao SELECT i as a, i as b FROM generate_series(1, 10000) AS i; -INSERT 10000 +INSERT 0 10000 DELETE FROM ao WHERE a < 1200; DELETE 7194 @@ -35,4 +35,4 @@ VACUUM 52806 (1 row) 3: INSERT INTO ao VALUES (0); -INSERT 1 +INSERT 0 1 diff --git a/src/test/isolation2/output/workfile_mgr_test.source b/src/test/isolation2/output/workfile_mgr_test.source index ecf5438ca72..341ed2cbd7e 100644 --- a/src/test/isolation2/output/workfile_mgr_test.source +++ b/src/test/isolation2/output/workfile_mgr_test.source @@ -1,27 +1,27 @@ CREATE OR REPLACE FUNCTION gp_workfile_mgr_test_on_master(testname text, numfiles int) RETURNS setof bool LANGUAGE C VOLATILE EXECUTE ON COORDINATOR AS '@abs_builddir@/isolation2_regress@DLSUFFIX@', 'gp_workfile_mgr_test_harness'; -CREATE +CREATE FUNCTION CREATE OR REPLACE FUNCTION gp_workfile_mgr_test_on_segments(testname text, numfiles int) RETURNS setof bool LANGUAGE C VOLATILE EXECUTE ON ALL SEGMENTS AS '@abs_builddir@/isolation2_regress@DLSUFFIX@', 'gp_workfile_mgr_test_harness'; -CREATE +CREATE FUNCTION CREATE FUNCTION gp_workfile_mgr_test(testname text, numfiles int) RETURNS SETOF BOOL AS $$ SELECT C.* FROM gp_workfile_mgr_test_on_master($1, $2) as C UNION ALL SELECT C.* FROM gp_workfile_mgr_test_on_segments($1, $2) as C $$ LANGUAGE SQL; -CREATE +CREATE FUNCTION CREATE OR REPLACE FUNCTION gp_workfile_mgr_create_workset(worksetname text, interXact bool, holdPin bool, closeFile bool) RETURNS setof void LANGUAGE C VOLATILE EXECUTE ON ALL SEGMENTS AS '@abs_builddir@/isolation2_regress@DLSUFFIX@', 'gp_workfile_mgr_create_workset'; -CREATE +CREATE FUNCTION CREATE OR REPLACE FUNCTION gp_workfile_mgr_create_empty_workset(worksetname text) RETURNS setof void LANGUAGE C VOLATILE EXECUTE ON ALL SEGMENTS AS '@abs_builddir@/isolation2_regress@DLSUFFIX@', 'gp_workfile_mgr_create_workset'; -CREATE +CREATE FUNCTION CREATE FUNCTION gp_workfile_mgr_cache_entries() RETURNS TABLE(segid int4, prefix text, size int8, operation text, slice int4, sessionid int4, commandid int4, numfiles int4) AS '$libdir/gp_workfile_mgr', 'gp_workfile_mgr_cache_entries' LANGUAGE C VOLATILE EXECUTE ON ALL SEGMENTS; -CREATE +CREATE FUNCTION -- Wait for at the most 1 min for backends to remove transient -- workfile sets as part of exit processing and then report long lived -- workfile sets. create or replace function report_workfile_entries() returns table(segid int4, prefix text, size int8, operation text, slice int4, numfiles int4) as $$ declare iterations int; /* in func */ cnt int; /* in func */ begin iterations := 120; /* wait at the most 1 min */ select count(*) into cnt from gp_workfile_mgr_cache_entries() w where w.prefix not like 'long_live_workset%'; /* in func */ while (iterations > 0) and (cnt > 0) loop select count(*) into cnt from gp_workfile_mgr_cache_entries() w where w.prefix not like 'long_live_workset%'; /* in func */ perform pg_sleep(0.5); /* sleep for half a second */ iterations := iterations - 1; /* in func */ end loop; /* in func */ return query select w.segid, w.prefix, w.size, w.operation, w.slice, w.numfiles from gp_workfile_mgr_cache_entries() w; /* in func */ end; /* in func */ $$ language plpgsql volatile execute on all segments; -CREATE +CREATE FUNCTION -- start_ignore !\retcode gpconfig -c gp_workfile_max_entries -v 32 --skipvalidation; @@ -67,9 +67,9 @@ CREATE ! mkdir -p '@testtablespace@/workfile_mgr'; 1: DROP TABLESPACE IF EXISTS work_file_test_ts; -DROP +DROP TABLESPACE 1: CREATE TABLESPACE work_file_test_ts LOCATION '@testtablespace@/workfile_mgr'; -CREATE +CREATE TABLESPACE 1: select gp_workfile_mgr_test('atomic_test', 0); gp_workfile_mgr_test @@ -123,7 +123,7 @@ CONTEXT: SQL function "gp_workfile_mgr_test" statement 1 (4 rows) 1: DROP TABLESPACE work_file_test_ts; -DROP +DROP TABLESPACE -- start_ignore !\retcode gpconfig -r gp_workfile_max_entries --skipvalidation; @@ -232,7 +232,7 @@ BEGIN 2 | long_live_workset_1 | 0 | long_live_workset | 1 | 0 (12 rows) 4: end; -END +COMMIT 4: select segid, prefix, size, operation, slice, numfiles from gp_workfile_mgr_cache_entries() order by (segid, prefix); segid | prefix | size | operation | slice | numfiles -------+----------------------+------+--------------------+-------+---------- @@ -275,7 +275,7 @@ BEGIN 2 | long_live_workset_1 | 0 | long_live_workset | 1 | 0 (9 rows) 4: abort; -ABORT +ROLLBACK 4: select segid, prefix, size, operation, slice, numfiles from gp_workfile_mgr_cache_entries() order by (segid, prefix); segid | prefix | size | operation | slice | numfiles -------+----------------------+------+--------------------+-------+---------- diff --git a/src/test/isolation2/sql_isolation_testcase.py b/src/test/isolation2/sql_isolation_testcase.py index 59e8212adec..5b188743120 100644 --- a/src/test/isolation2/sql_isolation_testcase.py +++ b/src/test/isolation2/sql_isolation_testcase.py @@ -15,7 +15,6 @@ limitations under the License. """ -import pg import pty import os import subprocess @@ -28,7 +27,18 @@ from optparse import OptionParser import traceback import select -import shutil +import psycopg2 +import io + +## FIXME: When converting 'INTERVAL' typed value to Python Object, psycopg2 doesn't +## recognize the literal string '@ 0'. It's probably caused by the 'DateStyle' GUC +## setting. It would be good to fix it in future. +def cast_interval(value, cur): + if value is None: + return None + return str(value) +INTERVAL = psycopg2.extensions.new_type((1186,), "INTERVAL", cast_interval) +psycopg2.extensions.register_type(INTERVAL) def is_digit(n): try: @@ -37,27 +47,22 @@ def is_digit(n): except ValueError: return False -def null_notice_receiver(notice): - ''' - Tests ignore notice messages when analyzing results, - so silently drop notices from the pg.connection - ''' - return - - class ConnectionInfo(object): __instance = None def __init__(self): self.max_content_id = 0 + self._conn_map = [] if ConnectionInfo.__instance is not None: raise Exception("ConnectionInfo is a singleton.") - query = ("SELECT content, hostname, port, role FROM gp_segment_configuration") - - con = pg.connect(dbname="postgres") - self._conn_map = con.query(query).getresult() - con.close() + with psycopg2.connect(dbname="postgres") as conn: + # Don't start transaction automatically. + conn.set_session(autocommit=True) + with conn.cursor() as cur: + cur.execute("SELECT content, hostname, port, role FROM gp_segment_configuration") + for row in cur: + self._conn_map.append(row) ConnectionInfo.__instance = self for content, _, _, _ in ConnectionInfo.__instance._conn_map: @@ -401,19 +406,12 @@ def connectdb(self, given_dbname, given_host = None, given_port = None, given_op retry = 1000 while retry: try: - if (given_port is None): - con = pg.connect(host= given_host, - opt= given_opt, - dbname= given_dbname, - user = given_user, - passwd = given_passwd) - else: - con = pg.connect(host= given_host, - port= given_port, - opt= given_opt, - dbname= given_dbname, - user = given_user, - passwd = given_passwd) + con = psycopg2.connect(host=given_host, + port=given_port, + options=given_opt, + dbname=given_dbname, + user=given_user, + password=given_passwd) break except Exception as e: if self.mode == "retrieve" and ("auth token is invalid" in str(e) or "Authentication failure" in str(e) or "does not exist" in str(e)): @@ -428,7 +426,8 @@ def connectdb(self, given_dbname, given_host = None, given_port = None, given_op else: raise if con is not None: - con.set_notice_receiver(null_notice_receiver) + # Don't start transaction automatically. + con.set_session(autocommit=True) return con def get_hostname_port(self, contentid, role): @@ -436,38 +435,35 @@ def get_hostname_port(self, contentid, role): Gets the port number/hostname combination of the contentid and role """ - query = ("SELECT hostname, port FROM gp_segment_configuration WHERE" - " content = %s AND role = '%s'") % (contentid, role) con = self.connectdb(self.dbname, given_opt="-c gp_role=utility") - r = con.query(query).getresult() - con.close() - if len(r) == 0: - raise Exception("Invalid content %s" % contentid) - if r[0][0] == socket.gethostname(): - return (None, int(r[0][1])) - return (r[0][0], int(r[0][1])) - - def printout_result(self, r): + with con.cursor() as cur: + cur.execute("SELECT hostname, port FROM gp_segment_configuration WHERE" + " content = %s AND role = %s", (contentid, role)) + r = cur.fetchall() + con.close() + if len(r) == 0 or len(r[0]) != 2: + raise Exception("Invalid content %s" % contentid) + if r[0][0] == socket.gethostname(): + return (None, int(r[0][1])) + return (r[0][0], int(r[0][1])) + + def printout_result(self, description, rows): """ - Print out a pygresql result set (a Query object, after the query + Print out a psycopg2 result set (a Query object, after the query has been executed), in a format that imitates the default formatting of psql. This isn't a perfect imitation: we left-justify all the fields and headers, whereas psql centers the header, and right-justifies numeric fields. But this is close enough, to make - gpdiff.pl recognize the result sets as such. (We used to just call - str(r), and let PyGreSQL do the formatting. But even though - PyGreSQL's default formatting is close to psql's, it's not close - enough.) + gpdiff.pl recognize the result sets as such. """ widths = [] + result = "" # Figure out the widths of each column. - fields = r.listfields() - for f in fields: - widths.append(len(str(f))) + for f in description: + widths.append(len(f.name)) - rset = r.getresult() - for row in rset: + for row in rows: colno = 0 for col in row: if col is None: @@ -476,26 +472,25 @@ def printout_result(self, r): colno = colno + 1 # Start printing. Header first. - result = "" colno = 0 - for f in fields: + for f in description: if colno > 0: result += "|" - result += " " + f.ljust(widths[colno]) + " " + result += " " + f.name.ljust(widths[colno]) + " " colno = colno + 1 result += "\n" # Then the bar ("----+----") colno = 0 - for f in fields: + for f in description: if colno > 0: result += "+" result += "".ljust(widths[colno] + 2, "-") - colno = colno + 1 + colno += 1 result += "\n" # Then the result set itself - for row in rset: + for row in rows: colno = 0 for col in row: if colno > 0: @@ -514,10 +509,10 @@ def printout_result(self, r): result += "\n" # Finally, the row count - if len(rset) == 1: + if len(rows) == 1: result += "(1 row)\n" else: - result += "(" + str(len(rset)) + " rows)\n" + result += "(" + str(len(rows)) + " rows)\n" return result @@ -526,20 +521,26 @@ def execute_command(self, command): Executes a given command """ try: - r = self.con.query(command) - if r is not None: - if type(r) == str: - # INSERT, UPDATE, etc that returns row count but not result set - echo_content = command[:-1].partition(" ")[0].upper() - return "%s %s" % (echo_content, r) + with self.con.cursor() as cur: + ## FIXME: Currently, psycopg2's cursor doesn't support executing 'COPY TO' + ## commands. We use the copy_expert() API to work around. + ## Issue: https://github.com/psycopg/psycopg2/issues/444 + if command.lower().startswith('copy'): + cur.copy_expert(command, io.StringIO()) else: - # SELECT or similar, print the result set without the command (type pg.Query) - return self.printout_result(r) - else: - # CREATE or other DDL without a result set or count - echo_content = command[:-1].partition(" ")[0].upper() - return echo_content - except Exception as e: + cur.execute(command) + if cur.description is not None: + return self.printout_result(cur.description, cur.fetchall()) + elif cur.statusmessage: + return str(cur.statusmessage) + return "" + except psycopg2.Error as e: + ## Normally, the exception is raised by the server and we can fetch the + ## error message via e.pgerror. However, there's some situation where the + ## exception is not raised by the server, e.g., ProgrammingError, we should + ## print out the error message directly to help debugging. + if e.pgerror: + return str(e.pgerror) return str(e) def do(self): @@ -601,11 +602,13 @@ def get_all_primary_contentids(self, dbname): if not dbname: dbname = self.dbname - con = pg.connect(dbname=dbname) - result = con.query("SELECT content FROM gp_segment_configuration WHERE role = 'p' order by content").getresult() - if len(result) == 0: - raise Exception("Invalid gp_segment_configuration contents") - return [int(content[0]) for content in result] + with psycopg2.connect(dbname=dbname) as con: + with con.cursor() as cur: + cur.execute("SELECT content FROM gp_segment_configuration WHERE role = 'p' order by content") + result = cur.fetchall() + if len(result) == 0: + raise Exception("Invalid gp_segment_configuration contents") + return [int(content[0]) for content in result] def __preprocess_sql(self, name, pre_run_cmd, sql, global_sh_executor): if not pre_run_cmd: @@ -915,13 +918,6 @@ class SQLIsolationTestCase: 2U: Executes a utility command connected to port 40000. - One difference to SQLTestCase is the output of INSERT. - SQLTestCase would output "INSERT 0 1" if one tuple is inserted. - SQLIsolationTestCase would output "INSERT 1". As the - SQLIsolationTestCase needs to have a more fine-grained control - over the execution order than possible with PSQL, it uses - the pygresql python library instead. - Connecting to a specific database: 1. If you specify a db_name metadata in the sql file, connect to that database in all open sessions. 2. If you want a specific session to be connected to a specific database , specify the sql as follows: diff --git a/src/test/singlenode_isolation2/sql/prevent_ao_wal.sql b/src/test/singlenode_isolation2/sql/prevent_ao_wal.sql index cfee9b0dc43..ea90eb81495 100644 --- a/src/test/singlenode_isolation2/sql/prevent_ao_wal.sql +++ b/src/test/singlenode_isolation2/sql/prevent_ao_wal.sql @@ -32,14 +32,18 @@ -- Create tables (AO, AOCO) -1U: CREATE TABLE ao_foo (n int) WITH (appendonly=true); +CREATE TABLE -1U: CREATE TABLE aoco_foo (n int, m int) WITH (appendonly=true, orientation=column); +CREATE TABLE -- Switch WAL file -1U: SELECT true FROM pg_switch_wal(); -- Insert data (AO) -1U: INSERT INTO ao_foo SELECT generate_series(1,10); +INSERT 0 10 -- Insert data (AOCO) -1U: INSERT INTO aoco_foo SELECT generate_series(1,10), generate_series(1,10); +INSERT 0 10 -- Delete data and run vacuum (AO) -1U: DELETE FROM ao_foo WHERE n > 5; -1U: VACUUM; @@ -62,8 +66,10 @@ -1U: SELECT true FROM pg_switch_wal(); -- Insert data (AO) -1U: INSERT INTO ao_foo SELECT generate_series(1,10); +INSERT 0 10 -- Insert data (AOCO) -1U: INSERT INTO aoco_foo SELECT generate_series(1,10), generate_series(1,10); +INSERT 0 10 -- Delete data and run vacuum (AO) -1U: DELETE FROM ao_foo WHERE n > 5; -1U: VACUUM; @@ -74,8 +80,10 @@ -- Validate wal records ! last_wal_file=$(psql -At -c "SELECT pg_walfile_name(pg_current_wal_lsn())" postgres) && pg_waldump ${last_wal_file} -p ${COORDINATOR_DATA_DIRECTORY}/pg_wal -r appendonly; --1U: DROP TABLE ao_foo; +-1U: DROP TABLE ao_foo; +DROP TABLE -1U: DROP TABLE aoco_foo; +DROP TABLE -- Reset wal_level !\retcode gpconfig -r wal_level --masteronly; From c3f33c410eee434498f9099a473dd2c82e5718f4 Mon Sep 17 00:00:00 2001 From: Xing Guo Date: Tue, 18 Jul 2023 15:55:30 +0800 Subject: [PATCH 4/7] Replace pygresql with psycopg2 for gpload. (#16001) This is the last patch for replacing pygresql with psycopg2 in Greenplum. This patch mainly targets the gpload. Benefits for replacing pygresql with psycopg2. - Psycopg2 is maintained actively we have encountered bugs that haven't been fixed by the upstream yet, e.g., https://github.com/greenplum-db/gpdb/pull/13953. - Psycopg2 is provided by Rocky Linux and Ubuntu. That is to say, we don't need to vendor it ourselves. - Possibly remove the `PYTHONPATH` from `greenplum_path.sh`, which is good for users that they don't need to worry about their Python environment being overwritten by Greenplum. Co-authored-by: Chen Mulong Co-authored-by: Xiaoxiao He --- gpMgmt/bin/gpload.py | 347 +++++++++--------- gpMgmt/bin/gpload_test/gpload2/TEST_REMOTE.py | 64 ++-- .../gpload_test/gpload2/TEST_local_base.py | 80 ++-- gpMgmt/bin/gpload_test/gpload2/query205.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query207.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query211.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query220.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query233.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query241.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query244.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query259.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query260.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query31.ans | 4 +- gpMgmt/bin/gpload_test/gpload2/query312.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query37.ans | 4 +- gpMgmt/bin/gpload_test/gpload2/query402.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query497.ans | 5 +- gpMgmt/bin/gpload_test/gpload2/query522.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query523.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query529.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query532.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query533.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query60.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query604.ans | 4 +- gpMgmt/bin/gpload_test/gpload2/query65.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query652.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query662.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query664.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query665.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query666.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query667.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query68.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query69.ans | 2 +- gpMgmt/bin/gpload_test/gpload2/query75.ans | 12 +- gpMgmt/bin/gpload_test/gpload2/query76.ans | 10 +- gpMgmt/bin/gpload_test/gpload2/query77.ans | 18 +- .../bin/gppylib/test/unit/test_unit_gpload.py | 7 +- 37 files changed, 288 insertions(+), 319 deletions(-) diff --git a/gpMgmt/bin/gpload.py b/gpMgmt/bin/gpload.py index a1696947bbc..4b0afc8890c 100755 --- a/gpMgmt/bin/gpload.py +++ b/gpMgmt/bin/gpload.py @@ -35,21 +35,14 @@ sys.exit(2) import platform +import psycopg2 +from psycopg2 import extras -try: - import pg -except ImportError: - try: - from pygresql import pg - except Exception as e: - pass -except Exception as e: - print(repr(e)) - errorMsg = "gpload was unable to import The PyGreSQL Python module (pg.py) - %s\n" % str(e) - sys.stderr.write(str(errorMsg)) - errorMsg = "Please check if you have the correct Visual Studio redistributable package installed.\n" - sys.stderr.write(str(errorMsg)) - sys.exit(2) +def Escape(query_str): + return psycopg2.extensions.QuotedString(query_str).getquoted()[1:-1].decode() + +def escape_string(string): + return Escape(string) import hashlib import datetime,getpass,os,signal,socket,threading,time,traceback,re @@ -724,25 +717,6 @@ def match_notice_obj(notice): else: return 0 - -def notice_processor_Notice(notice): - # process the notice in main branch - # notice is a class which is different in 6X, we need a new function to process - global NUM_WARN_ROWS - if windowsPlatform == True: - # We don't have a pygresql with our notice fix, so skip for windows. - # This means we will not get any warnings on windows (MPP10989). - return - theNotices = notice.message - messageNumber = 0 - if isinstance(theNotices, list): - while messageNumber < len(theNotices) and NUM_WARN_ROWS==0: - NUM_WARN_ROWS = match_notice_obj(theNotices[messageNumber]) - messageNumber+=1 - else: - NUM_WARN_ROWS = match_notice_obj(theNotices) - - def notice_processor(notice): global NUM_WARN_ROWS if windowsPlatform == True: @@ -1757,9 +1731,9 @@ def setup_connection(self, recurse = 0): """ Connect to the backend """ - if self.db != None: - self.db.close() - self.db = None + if self.conn != None: + self.conn.close() + self.conn = None if self.options.W: if self.options.password==None: self.options.password = getpass.getpass() @@ -1778,19 +1752,20 @@ def setup_connection(self, recurse = 0): " host=" + str(self.options.h) + " port=" + str(self.options.p) + " database=" + str(self.options.d)) - self.db = pg.DB( dbname=self.options.d - , host=self.options.h - , port=self.options.p - , user=self.options.U - , passwd=self.options.password - ) + self.conn = psycopg2.connect(dbname=self.options.d, + host=self.options.h, + port=self.options.p, + user=self.options.U, + password=self.options.password) + self.conn.set_session(autocommit=True) self.log(self.DEBUG, "Successfully connected to database") if noGpVersion == False: # Get GPDB version - curs = self.db.query("SELECT version()") - self.gpdb_version = GpVersion(curs.getresult()[0][0]) - self.log(self.DEBUG, "GPDB version is: %s" % self.gpdb_version) + with self.conn.cursor() as cur: + cur.execute("SELECT version()") + self.gpdb_version = GpVersion(cur.fetchall()[0][0]) + self.log(self.DEBUG, "GPDB version is: %s" % self.gpdb_version) except Exception as e: errorMessage = str(e) @@ -1884,13 +1859,15 @@ def read_table_metadata(self): WHERE c.relname = '%s' AND pg_catalog.pg_table_is_visible(c.oid);""" % quote_unident(self.table) - resultList = self.db.query(queryString).getresult() + with self.conn.cursor() as cur: + cur.execute(queryString) + resultList = cur.fetchall() - if len(resultList) > 0: - self.schema = (resultList[0])[0] - self.log(self.INFO, "setting schema '%s' for table '%s'" % (self.schema, quote_unident(self.table))) - else: - self.log(self.ERROR, "table %s not found in any database schema" % self.table) + if len(resultList) > 0: + self.schema = (resultList[0])[0] + self.log(self.INFO, "setting schema '%s' for table '%s'" % (self.schema, quote_unident(self.table))) + else: + self.log(self.ERROR, "table %s not found in any database schema" % self.table) queryString = """select nt.nspname as table_schema, @@ -1913,41 +1890,45 @@ def read_table_metadata(self): count = 0 self.into_columns = [] self.into_columns_dict = dict() - resultList = self.db.query(queryString).dictresult() - while count < len(resultList): - row = resultList[count] - count += 1 - ct = str(row['data_type']) - if ct == 'bigserial': - ct = 'bigint' - elif ct == 'serial': - ct = 'int4' - name = row['column_name'] - name = quote_ident(name) - has_seq = row['has_sequence'] - if has_seq == str('f') or has_seq==False: - has_seq_bool = False - if has_seq == str('t') or has_seq==True: - has_sql_bool = True - i = [name,ct,None, has_seq_bool] - # i: [column name, column data type, mapping target, has_sequence] - self.into_columns.append(i) - self.into_columns_dict[name] = i - self.log(self.DEBUG, "found input column: " + str(i)) - if count == 0: - # see if it's a permissions issue or it actually doesn't exist - tableName = quote_unident(self.table) - tableSchema = quote_unident(self.schema) - sql = """select 1 from pg_class c, pg_namespace n - where c.relname = '%s' and - n.nspname = '%s' and - n.oid = c.relnamespace""" % (tableName, tableSchema) - resultList = self.db.query(sql).getresult() - if len(resultList) > 0: - self.log(self.ERROR, "permission denied for table %s.%s" % \ - (tableSchema, tableName)) - else: - self.log(self.ERROR, 'table %s.%s does not exist in database %s'% (tableSchema, tableName, self.options.d)) + with self.conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as cur: + cur.execute(queryString) + resultList = cur.fetchall() + while count < len(resultList): + row = resultList[count] + count += 1 + ct = str(row['data_type']) + if ct == 'bigserial': + ct = 'bigint' + elif ct == 'serial': + ct = 'int4' + name = row['column_name'] + name = quote_ident(name) + has_seq = row['has_sequence'] + if has_seq == str('f') or has_seq==False: + has_seq_bool = False + if has_seq == str('t') or has_seq==True: + has_sql_bool = True + i = [name,ct,None, has_seq_bool] + # i: [column name, column data type, mapping target, has_sequence] + self.into_columns.append(i) + self.into_columns_dict[name] = i + self.log(self.DEBUG, "found input column: " + str(i)) + if count == 0: + # see if it's a permissions issue or it actually doesn't exist + tableName = quote_unident(self.table) + tableSchema = quote_unident(self.schema) + sql = """select 1 from pg_class c, pg_namespace n + where c.relname = '%s' and + n.nspname = '%s' and + n.oid = c.relnamespace""" % (tableName, tableSchema) + with self.conn.cursor() as cur: + cur.execute(sql) + resultList = cur.fetchall() + if len(resultList) > 0: + self.log(self.ERROR, "permission denied for table %s.%s" % \ + (tableSchema, tableName)) + else: + self.log(self.ERROR, 'table %s.%s does not exist in database %s'% (tableSchema, tableName, self.options.d)) def read_mapping(self): ''' @@ -2190,8 +2171,10 @@ def get_table_oid(self, tableName): if tableName: sql = "select %s::regclass::oid" % quote(quote_unident(tableName)) try: - resultList = self.db.query(sql).getresult() - return resultList[0][0] + with self.conn.cursor() as cur: + cur.execute(sql) + resultList = cur.fetchall() + return resultList[0][0] except Exception as e: pass return None @@ -2322,15 +2305,19 @@ def create_external_table(self): encodingCode = None encodingStr = self.getconfig('gpload:input:encoding', str, None) if encodingStr is None: - result = self.db.query("SHOW SERVER_ENCODING").getresult() - if len(result) > 0: - encodingStr = result[0][0] + with self.conn.cursor() as cur: + cur.execute("SHOW SERVER_ENCODING") + result = cur.fetchall() + if len(result) > 0: + encodingStr = result[0][0] if encodingStr: sql = "SELECT pg_char_to_encoding('%s')" % encodingStr - result = self.db.query(sql).getresult() - if len(result) > 0: - encodingCode = result[0][0] + with self.conn.cursor() as cur: + cur.execute(sql) + result = cur.fetchall() + if len(result) > 0: + encodingCode = result[0][0] limitStr = self.getconfig('gpload:input:error_limit',int, None) if self.log_errors and not limitStr: @@ -2370,11 +2357,13 @@ def create_external_table(self): AND n.nspname <> 'pg_catalog' AND n.nspname <> 'information_schema' AND n.nspname !~ '^pg_toast'""" - result = self.db.query(sql).getresult() - if len(result) > 0: - self.extSchemaTable = self.get_schematable(quote_unident(self.extSchemaName), self.extTableName) - self.log(self.INFO, "reusing external staging table %s" % self.extSchemaTable) - return + with self.conn.cursor() as cur: + cur.execute(sql) + result = cur.fetchall() + if len(result) > 0: + self.extSchemaTable = self.get_schematable(self.extSchemaName, self.extTableName) + self.log(self.INFO, "reusing external staging table %s" % self.extSchemaTable) + return # staging table is not specified, we need to find it manually else: # process the single quotes in order to successfully find an existing external table to reuse. @@ -2386,17 +2375,19 @@ def create_external_table(self): sql = self.get_reuse_exttable_query(formatType, self.formatOpts, limitStr, from_cols, self.extSchemaName, self.log_errors, encodingCode) - resultList = self.db.query(sql).getresult() - if len(resultList) > 0: - # found an external table to reuse. no need to create one. we're done here. - self.extTableName = (resultList[0])[0] - # fast match result is only table name, so we need add schema info - if self.fast_match: - self.extSchemaTable = self.get_schematable(quote_unident(self.extSchemaName), self.extTableName) - else: - self.extSchemaTable = self.extTableName - self.log(self.INFO, "reusing external table %s" % self.extSchemaTable) - return + with self.conn.cursor() as cur: + cur.execute(sql) + resultList = cur.fetchall() + if len(resultList) > 0: + # found an external table to reuse. no need to create one. we're done here. + self.extTableName = (resultList[0])[0] + # fast match result is only table name, so we need add schema info + if self.fast_match: + self.extSchemaTable = self.get_schematable(self.extSchemaName, self.extTableName) + else: + self.extSchemaTable = self.extTableName + self.log(self.INFO, "reusing external table %s" % self.extSchemaTable) + return # didn't find an existing external table suitable for reuse. Format a reusable # name and issue a CREATE EXTERNAL TABLE on it. Hopefully we can use it next time @@ -2428,7 +2419,8 @@ def create_external_table(self): sql += "segment reject limit %s "%limitStr try: - self.db.query(sql.encode('utf-8')) + with self.conn.cursor() as cur: + cur.execute(sql) except Exception as e: self.log(self.ERROR, 'could not run SQL "%s": %s' % (sql, str(e))) @@ -2446,7 +2438,9 @@ def get_distribution_key(self): sql = '''select * from pg_get_table_distributedby('%s.%s'::regclass::oid)'''% (self.schema, self.table) try: - dk_text = self.db.query(sql.encode('utf-8')).getresult() + with self.conn.cursor() as cur: + cur.execute(sql) + dk_text = cur.fetchall() except Exception as e: self.log(self.ERROR, 'could not run SQL "%s": %s ' % (sql, str(e))) @@ -2470,11 +2464,13 @@ def create_staging_table(self): distcols = self.get_distribution_key() sql = "SELECT * FROM pg_class WHERE relname LIKE 'temp_gpload_reusable_%%';" - resultList = self.db.query(sql).getresult() - if len(resultList) > 0: - self.log(self.WARN, """Old style, reusable tables named "temp_gpload_reusable_*" from a previous versions were found. - Cloudberry recommends running "DROP TABLE temp_gpload_reusable_..." on each table. This only needs to be done once.""") - + with self.conn.cursor() as cur: + cur.execute(sql) + resultList = cur.fetchall() + if len(resultList) > 0: + self.log(self.WARN, """Old style, reusable tables named "temp_gpload_reusable_*" from a previous versions were found. + Greenplum recommends running "DROP TABLE temp_gpload_reusable_..." on each table. This only needs to be done once.""") + # If the 'reuse tables' option was specified we now try to find an # already existing staging table in the catalog which will match # the one that we need to use. It must meet the reuse conditions @@ -2491,20 +2487,19 @@ def create_staging_table(self): # create a string from all reuse conditions for staging tables and ancode it conditions_str = self.get_staging_conditions_string(target_table_name, target_columns, distcols).encode() encoding_conditions = hashlib.md5(conditions_str).hexdigest() + table_name = 'staging_gpload_reusable_%s'% (encoding_conditions) + sql = self.get_reuse_staging_table_query(table_name) + with self.conn.cursor() as cur: + cur.execute(sql) + resultList = cur.fetchall() - sql = self.get_reuse_staging_table_query(encoding_conditions) - resultList = self.db.query(sql).getresult() - - if len(resultList) > 0: - - # found a temp table to reuse. no need to create one. we're done here. - self.staging_table_name = (resultList[0])[0] - self.log(self.INFO, "reusing staging table %s" % self.staging_table_name) - - # truncate it so we don't use old data - self.do_truncate(self.staging_table_name) - - return + if len(resultList) > 0: + # found a temp table to reuse. no need to create one. we're done here. + self.staging_table_name = self.get_schematable(self.extSchemaName, table_name) + self.log(self.INFO, "reusing staging table %s" % self.staging_table_name) + # truncate it so we don't use old data + self.do_truncate(self.staging_table_name) + return # didn't find an existing staging table suitable for reuse. Format a reusable # name and issue a CREATE TABLE on it (without TEMP!). Hopefully we can use it @@ -2541,27 +2536,31 @@ def create_staging_table(self): self.log(self.LOG, sql) if not self.options.D: - self.db.query(sql) + with self.conn.cursor() as cur: + cur.execute(sql) if not self.reuse_tables: self.cleanupSql.append('DROP TABLE IF EXISTS %s' % self.staging_table_name) def count_errors(self): - # callback function is setted before insert - # notice processor will be called automaticly + notice_processor(self.conn.notices) if self.log_errors and not self.options.D: # make sure we only get errors for our own instance if not self.reuse_tables: - queryStr = "select count(*) from gp_read_error_log('%s')" % pg.escape_string(self.extSchemaTable) - results = self.db.query(queryStr).getresult() - return (results[0])[0] + queryStr = "select count(*) from gp_read_error_log('%s')" % escape_string(self.extSchemaTable) + with self.conn.cursor() as cur: + cur.execute(queryStr) + results = cur.fetchall() + return (results[0])[0] else: # reuse_tables - queryStr = "select count(*) from gp_read_error_log('%s') where cmdtime > to_timestamp(%s)" % (pg.escape_string(self.extSchemaTable), self.startTimestamp) - results = self.db.query(queryStr).getresult() - global NUM_WARN_ROWS - NUM_WARN_ROWS = (results[0])[0] - return (results[0])[0] + queryStr = "select count(*) from gp_read_error_log('%s') where cmdtime > to_timestamp(%s)" % (escape_string(self.extSchemaTable), self.startTimestamp) + with self.conn.cursor() as cur: + cur.execute(queryStr) + results = cur.fetchall() + global NUM_WARN_ROWS + NUM_WARN_ROWS = (results[0])[0] + return (results[0])[0]; return 0 def report_errors(self): @@ -2575,7 +2574,7 @@ def report_errors(self): # if reuse_table is set, error message is not deleted. if errors and self.log_errors and self.reuse_tables: self.log(self.WARN, "Please use following query to access the detailed error") - self.log(self.WARN, "select * from gp_read_error_log('{0}') where cmdtime > to_timestamp('{1}')".format(pg.escape_string(self.extSchemaTable), self.startTimestamp)) + self.log(self.WARN, "select * from gp_read_error_log('{0}') where cmdtime > to_timestamp('{1}')".format(escape_string(self.extSchemaTable), self.startTimestamp)) self.exitValue = 1 if errors else 0 @@ -2603,9 +2602,9 @@ def do_insert(self, dest): self.log(self.LOG, sql) if not self.options.D: try: - # we need to set the notice receiver function before do insert - self.db.set_notice_receiver(notice_processor_Notice) - self.rowsInserted = self.db.query(sql.encode('utf-8')) + with self.conn.cursor() as cur: + cur.execute(sql) + self.rowsInserted = cur.rowcount except Exception as e: # We need to be a bit careful about the error since it may contain non-unicode characters strE = e.__str__().encode().decode('unicode-escape') @@ -2699,7 +2698,9 @@ def do_update(self,fromname,index): self.log(self.LOG, sql) if not self.options.D: try: - self.rowsUpdated = self.db.query(sql.encode('utf-8')) + with self.conn.cursor() as cur: + cur.execute(sql) + self.rowsUpdated = cur.rowcount except Exception as e: # We need to be a bit careful about the error since it may contain non-unicode characters strE = str(str(e), errors = 'ignore') @@ -2725,14 +2726,15 @@ def get_table_dist_key(self): "c.relnamespace = n.oid and " + \ "n.nspname = '%s' and c.relname = '%s'; " % (quote_unident(self.schema), quote_unident(self.table)) - resultList = self.db.query(sql).getresult() - attrs = [] - count = 0 - while count < len(resultList): - attrs.append((resultList[count])[0]) - count = count + 1 - - return attrs + with self.conn.cursor() as cur: + cur.execute(sql) + resultList = cur.fetchall() + attrs = [] + count = 0 + while count < len(resultList): + attrs.append((resultList[count])[0]) + count = count + 1 + return attrs def table_supports_update(self): """ Check wether columns being updated are distribution key.""" @@ -2789,7 +2791,8 @@ def do_method_merge(self): self.log(self.LOG, sql) if not self.options.D: try: - self.db.query(sql.encode('utf-8')) + with self.conn.cursor() as cur: + cur.execute(sql) except Exception as e: strE = str(str(e), errors = 'ignore') strF = str(str(sql), errors = 'ignore') @@ -2810,7 +2813,9 @@ def do_method_merge(self): self.log(self.LOG, sql) if not self.options.D: try: - self.rowsInserted = self.db.query(sql.encode('utf-8')) + with self.conn.cursor() as cur: + cur.execute(sql) + self.rowsInserted = cur.rowcount except Exception as e: # We need to be a bit careful about the error since it may contain non-unicode characters strE = str(str(e), errors = 'ignore') @@ -2822,7 +2827,8 @@ def do_truncate(self, tblname): if not self.options.D: try: truncateSQLtext = "truncate %s" % tblname - self.db.query(truncateSQLtext.encode('utf-8')) + with self.conn.cursor() as cur: + cur.execute(truncateSQLtext) except Exception as e: self.log(self.ERROR, 'could not execute truncate target %s: %s' % (tblname, str(e))) @@ -2843,8 +2849,9 @@ def do_method(self): truncate = False self.reuse_tables = False - if not self.options.no_auto_trans: - self.db.query("BEGIN") + if not self.options.no_auto_trans and not method=='insert': + with self.conn.cursor() as cur: + cur.execute("BEGIN") self.extSchemaName = self.getconfig('gpload:external:schema', str, None) if self.extSchemaName == '%': @@ -2880,7 +2887,8 @@ def do_method(self): self.log(self.LOG, "Pre-SQL from user: %s" % before) if not self.options.D: try: - self.db.query(before.encode('utf-8')) + with self.conn.cursor() as cur: + cur.execute(before) except Exception as e: self.log(self.ERROR, 'could not execute SQL in sql:before "%s": %s' % (before, str(e))) @@ -2903,15 +2911,15 @@ def do_method(self): self.log(self.LOG, "Post-SQL from user: %s" % after) if not self.options.D: try: - self.db.query(after.encode('utf-8')) + with self.conn.cursor() as cur: + cur.execute(after) except Exception as e: self.log(self.ERROR, 'could not execute SQL in sql:after "%s": %s' % (after, str(e))) - if not self.options.no_auto_trans: - self.db.query("COMMIT") - - + if not self.options.no_auto_trans and not method=='insert': + with self.conn.cursor() as cur: + cur.execute("COMMIT") def stop_gpfdists(self): if self.subprocesses: @@ -2948,7 +2956,7 @@ def run2(self): self.log(self.INFO, 'running time: %.2f seconds'%(time.time()-start)) def run(self): - self.db = None + self.conn = None self.rowsInserted = 0 self.rowsUpdated = 0 signal.signal(signal.SIGINT, handle_kill) @@ -2979,14 +2987,15 @@ def run(self): for a in self.cleanupSql: try: self.log(self.DEBUG, a) - self.db.query(a) + with self.conn.cursor() as cur: + cur.execute(a) except (Exception, SystemExit): traceback.print_exc(file=self.logfile) self.logfile.flush() traceback.print_exc() - if self.db != None: - self.db.close() + if self.conn != None: + self.conn.close() self.log(self.INFO, 'rows Inserted = ' + str(self.rowsInserted)) self.log(self.INFO, 'rows Updated = ' + str(self.rowsUpdated)) diff --git a/gpMgmt/bin/gpload_test/gpload2/TEST_REMOTE.py b/gpMgmt/bin/gpload_test/gpload2/TEST_REMOTE.py index ae1618f78cf..eb59c129dae 100755 --- a/gpMgmt/bin/gpload_test/gpload2/TEST_REMOTE.py +++ b/gpMgmt/bin/gpload_test/gpload2/TEST_REMOTE.py @@ -11,7 +11,7 @@ import re import subprocess from shutil import copyfile -import pg +import psycopg2 """ Global Values @@ -275,44 +275,34 @@ def copy_data(source='',target=''): copyfile(os.path.join('data', source), target) def get_table_name(): - try: - db = pg.DB(dbname='reuse_gptest' - ,host='localhost' - ,port=int(PGPORT) - ) - except Exception as e: - errorMessage = str(e) - print(('could not connect to database: ' + errorMessage)) - queryString = """SELECT relname - from pg_class - WHERE relname - like 'ext_gpload_reusable%' - OR relname - like 'staging_gpload_reusable%';""" - resultList = db.query(queryString.encode('utf-8')).getresult() - return resultList + with psycopg2.connect(dbname='reuse_gptest', + host='localhost', + port=int(PGPORT)) as conn: + with conn.cursor() as cur: + queryString = """SELECT relname + from pg_class + WHERE relname + like 'ext_gpload_reusable%' + OR relname + like 'staging_gpload_reusable%';""" + cur.execute(queryString) + resultList = cur.fetchall() + return resultList def drop_tables(): - try: - db = pg.DB(dbname='reuse_gptest' - ,host='localhost' - ,port=int(PGPORT) - ) - except Exception as e: - errorMessage = str(e) - print(('could not connect to database: ' + errorMessage)) - - list = get_table_name() - for i in list: - name = i[0] - match = re.search('ext_gpload',name) - if match: - queryString = "DROP EXTERNAL TABLE %s" % name - db.query(queryString.encode('utf-8')) - - else: - queryString = "DROP TABLE %s" % name - db.query(queryString.encode('utf-8')) + table_list = get_table_name() + with psycopg2.connect(dbname='reuse_gptest', + host='localhost', + port=int(PGPORT)) as conn: + with conn.cursor() as cur: + for i in table_list: + name = i[0] + match = re.search('ext_gpload',name) + if match: + queryString = "DROP EXTERNAL TABLE %s" % name + else: + queryString = "DROP TABLE %s" % name + cur.execute(queryString) class PSQLError(Exception): ''' diff --git a/gpMgmt/bin/gpload_test/gpload2/TEST_local_base.py b/gpMgmt/bin/gpload_test/gpload2/TEST_local_base.py index 5c47e724ff3..6aa60f9d8bc 100755 --- a/gpMgmt/bin/gpload_test/gpload2/TEST_local_base.py +++ b/gpMgmt/bin/gpload_test/gpload2/TEST_local_base.py @@ -12,6 +12,7 @@ import re #import yaml import pytest +import psycopg2 from gppylib.commands.gp import get_coordinatordatadir @@ -19,20 +20,6 @@ import subprocess32 as subprocess except: import subprocess -try: - import pg -except ImportError: - try: - from pygresql import pg - except Exception as e: - pass -except Exception as e: - print(repr(e)) - errorMsg = "gpload was unable to import The PyGreSQL Python module (pg.py) - %s\n" % str(e) - sys.stderr.write(str(errorMsg)) - errorMsg = "Please check if you have the correct Visual Studio redistributable package installed.\n" - sys.stderr.write(str(errorMsg)) - sys.exit(2) def get_port_from_conf(): file = get_coordinatordatadir()+'/postgresql.conf' @@ -414,49 +401,38 @@ def copy_data(source='',target=''): def get_table_name(): - try: - db = pg.DB(dbname='reuse_gptest' - ,host='localhost' - ,port=int(PGPORT) - ) - except Exception as e: - errorMessage = str(e) - print ('could not connect to database: ' + errorMessage) - queryString = """SELECT sch.table_schema, cls.relname - FROM pg_class AS cls, information_schema.tables AS sch - WHERE - (cls.relname LIKE 'ext_gpload_reusable%' - OR - relname LIKE 'staging_gpload_reusable%') - AND cls.relname=sch.table_name;""" - resultList = db.query(queryString.encode('utf-8')).getresult() - print(resultList) - return resultList + with psycopg2.connect(dbname='reuse_gptest', + host='localhost', + port=int(PGPORT)) as conn: + with conn.cursor() as cur: + queryString = """SELECT sch.table_schema, cls.relname + FROM pg_class AS cls, information_schema.tables AS sch + WHERE + (cls.relname LIKE 'ext_gpload_reusable%' + OR + relname LIKE 'staging_gpload_reusable%') + AND cls.relname=sch.table_name;""" + cur.execute(queryString) + resultList = cur.fetchall() + return resultList def drop_tables(): '''drop external and staging tables''' - try: - db = pg.DB(dbname='reuse_gptest' - ,host='localhost' - ,port=int(PGPORT) - ) - except Exception as e: - errorMessage = str(e) - print ('could not connect to database: ' + errorMessage) - tableList = get_table_name() - for i in tableList: - schema = i[0] - name = i[1] - match = re.search('ext_gpload',name) - if match: - queryString = 'DROP EXTERNAL TABLE "%s"."%s";'%(schema, name) - db.query(queryString.encode('utf-8')) - - else: - queryString = 'DROP TABLE "%s"."%s";'%(schema, name) - db.query(queryString.encode('utf-8')) + with psycopg2.connect(dbname='reuse_gptest', + host='localhost', + port=int(PGPORT)) as conn: + with conn.cursor() as cur: + for i in tableList: + schema = i[0] + name = i[1] + match = re.search('ext_gpload',name) + if match: + queryString = 'DROP EXTERNAL TABLE "%s"."%s";'%(schema, name) + else: + queryString = 'DROP TABLE "%s"."%s";'%(schema, name) + cur.execute(queryString) class PSQLError(Exception): ''' diff --git a/gpMgmt/bin/gpload_test/gpload2/query205.ans b/gpMgmt/bin/gpload_test/gpload2/query205.ans index e47d90653e6..542c9597b12 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query205.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query205.ans @@ -2,7 +2,7 @@ 2021-11-29 11:56:45|INFO|setting schema 'public' for table 'texttable2' 2021-11-29 11:56:45|INFO|started gpfdist -p 8081 -P 8082 -f "/home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt" -t 30 2021-11-29 11:56:45|INFO|did not find an external table to reuse. creating ext_gpload_reusable_5e8c16ac_50c8_11ec_a3c6_0050569e2380 -2021-11-29 11:56:45|ERROR|could not run SQL "create external table ext_gpload_reusable_5e8c16ac_50c8_11ec_a3c6_0050569e2380("s1" text,"s2" text)location('gpfdist://10.117.190.10:8081//home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt') format'text' (delimiter 'Ÿ' null '\N' escape '\' ) encoding'UTF8' ": ERROR: COPY delimiter must be a single one-byte character, or 'off' +2021-11-29 11:56:45|ERROR|could not run SQL "create external table ext_gpload_reusable_5e8c16ac_50c8_11ec_a3c6_0050569e2380("s1" text,"s2" text)location('gpfdist://10.117.190.10:8081//home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt') format'text' (delimiter 'Ÿ' null '\N' escape '\' ) encoding'UTF8' ": COPY delimiter must be a single one-byte character, or 'off' 2021-11-29 11:56:45|INFO|rows Inserted = 0 2021-11-29 11:56:45|INFO|rows Updated = 0 diff --git a/gpMgmt/bin/gpload_test/gpload2/query207.ans b/gpMgmt/bin/gpload_test/gpload2/query207.ans index bde4034f5af..332aff46d38 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query207.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query207.ans @@ -2,7 +2,7 @@ 2020-12-17 15:38:22|INFO|setting schema 'public' for table 'texttable2' 2020-12-17 15:38:22|INFO|started gpfdist -p 8081 -P 8082 -f "pathto/data_file.txt" -t 30 2020-12-17 15:38:22|INFO|reusing external table ext_gpload_reusable_6f2dfb50_4035_11eb_b7f6_00505698d059 -2020-12-17 15:38:22|ERROR|ERROR: missing data for column "s2" (seg0 slice1 10.152.8.113:7002 pid=6654) +2020-12-17 15:38:22|ERROR|missing data for column "s2" (seg0 slice1 10.152.8.113:7002 pid=6654) CONTEXT: External table ext_gpload_reusable_6f2dfb50_4035_11eb_b7f6_00505698d059, line 1 of gpfdist://*:pathto/data_file.txt: "123456789 ab c d" encountered while running INSERT INTO public."texttable2" ("s1","s2") SELECT "s1","s2" FROM ext_gpload_reusable_6f2dfb50_4035_11eb_b7f6_00505698d059 2020-12-17 15:38:22|INFO|rows Inserted = 0 diff --git a/gpMgmt/bin/gpload_test/gpload2/query211.ans b/gpMgmt/bin/gpload_test/gpload2/query211.ans index 086b23498e8..f9e732da4e6 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query211.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query211.ans @@ -2,7 +2,7 @@ 2020-12-18 16:59:08|INFO|setting schema 'public' for table 'texttable2' 2020-12-18 16:59:08|INFO|started gpfdist -p 8081 -P 8082 -f "pathto/data_file.txt" -t 30 2020-12-18 16:59:08|INFO|did not find an external table to reuse. creating ext_gpload_reusable_49ed34de_410f_11eb_bbac_00505698d059 -2020-12-18 16:59:08|ERROR|ERROR: extra data after last expected column (seg2 slice1 10.152.8.113:7004 pid=2301) +2020-12-18 16:59:08|ERROR|extra data after last expected column (seg2 slice1 10.152.8.113:7004 pid=2301) CONTEXT: External table ext_gpload_reusable_49ed34de_410f_11eb_bbac_00505698d059, line 1 of gpfdist://*:pathto/data_file.txt: "a|||b" encountered while running INSERT INTO public."texttable2" ("s1","s2") SELECT "s1","s2" FROM ext_gpload_reusable_49ed34de_410f_11eb_bbac_00505698d059 2020-12-18 16:59:08|INFO|rows Inserted = 0 diff --git a/gpMgmt/bin/gpload_test/gpload2/query220.ans b/gpMgmt/bin/gpload_test/gpload2/query220.ans index 77139e22a90..af6249e4be0 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query220.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query220.ans @@ -2,7 +2,7 @@ 2020-12-21 10:55:38|INFO|setting schema 'public' for table 'texttable1' 2020-12-21 10:55:38|INFO|started gpfdist -p 8081 -P 8082 -f "pathto/data_file.txt" -t 30 2020-12-21 10:55:38|INFO|did not find an external table to reuse. creating ext_gpload_reusable_015f190a_4338_11eb_b807_00505698d059 -2020-12-21 10:55:38|ERROR|ERROR: missing data for column "n8" (seg0 slice1 10.152.8.113:7002 pid=3859) +2020-12-21 10:55:38|ERROR|missing data for column "n8" (seg0 slice1 10.152.8.113:7002 pid=3859) CONTEXT: External table ext_gpload_reusable_015f190a_4338_11eb_b807_00505698d059, line 1 of gpfdist://*:pathto/data_file.txt: "aaa|qwer|shjhjg|2012-06-01 15:30:30|1|111|834567|45.67|789.123|7.12345|123.456789" encountered while running INSERT INTO public."texttable1" ("s1","s2","s3","dt","n1","n2","n3","n4","n5","n6","n7","n8") SELECT "s1","s2","s3","dt","n1","n2","n3","n4","n5","n6","n7","n8" FROM ext_gpload_reusable_015f190a_4338_11eb_b807_00505698d059 2020-12-21 10:55:38|INFO|rows Inserted = 0 diff --git a/gpMgmt/bin/gpload_test/gpload2/query233.ans b/gpMgmt/bin/gpload_test/gpload2/query233.ans index 1a0ac829822..d2bf87c241d 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query233.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query233.ans @@ -2,7 +2,7 @@ 2021-11-29 11:56:55|INFO|setting schema 'public' for table 'texttable2' 2021-11-29 11:56:55|INFO|started gpfdist -p 8081 -P 8082 -f "/home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt" -t 30 2021-11-29 11:56:55|INFO|did not find an external table to reuse. creating ext_gpload_reusable_64b5f930_50c8_11ec_ad50_0050569e2380 -2021-11-29 11:56:55|ERROR|could not run SQL "create external table ext_gpload_reusable_64b5f930_50c8_11ec_ad50_0050569e2380("s1" text,"s2" text)location('gpfdist://10.117.190.10:8081//home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt') format'text' (delimiter '|' null 'E''\x08E'\'' escape '\' ) encoding'UTF8' ": ERROR: syntax error at or near "\" +2021-11-29 11:56:55|ERROR|could not run SQL "create external table ext_gpload_reusable_64b5f930_50c8_11ec_ad50_0050569e2380("s1" text,"s2" text)location('gpfdist://10.117.190.10:8081//home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt') format'text' (delimiter '|' null 'E''\x08E'\'' escape '\' ) encoding'UTF8' ": syntax error at or near "\" LINE 1: ....txt') format'text' (delimiter '|' null 'E''\x08E'\'' escape... ^ diff --git a/gpMgmt/bin/gpload_test/gpload2/query241.ans b/gpMgmt/bin/gpload_test/gpload2/query241.ans index 89f88129cec..09f834db98a 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query241.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query241.ans @@ -2,7 +2,7 @@ 2021-01-04 16:30:12|INFO|setting schema 'public' for table 'texttable' 2021-01-04 16:30:12|INFO|started gpfdist -p 8081 -P 8082 -f "pathto/data_file.txt" -t 30 2021-01-04 16:30:12|INFO|did not find an external table to reuse. creating ext_gpload_reusable_0ff6e3e6_4e67_11eb_9d70_00505698d059 -2021-01-04 16:30:12|ERROR|ERROR: character with byte sequence 0xad 0xe5 in encoding "GBK" has no equivalent in encoding "UTF8" (seg1 slice1 10.152.8.113:7003 pid=20453) +2021-01-04 16:30:12|ERROR|character with byte sequence 0xad 0xe5 in encoding "GBK" has no equivalent in encoding "UTF8" (seg1 slice1 10.152.8.113:7003 pid=20453) CONTEXT: External table ext_gpload_reusable_0ff6e3e6_4e67_11eb_9d70_00505698d059, line 1 of file gpfdist://*:pathto/data_file.txt encountered while running INSERT INTO public."texttable" ("s1","s2","s3","dt","n1","n2","n3","n4","n5","n6","n7") SELECT "s1","s2","s3","dt","n1","n2","n3","n4","n5","n6","n7" FROM ext_gpload_reusable_0ff6e3e6_4e67_11eb_9d70_00505698d059 2021-01-04 16:30:12|INFO|rows Inserted = 0 diff --git a/gpMgmt/bin/gpload_test/gpload2/query244.ans b/gpMgmt/bin/gpload_test/gpload2/query244.ans index 4349fd2fa78..316c5b6bb21 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query244.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query244.ans @@ -2,7 +2,7 @@ 2021-01-04 16:35:29|INFO|setting schema 'public' for table 'texttable2' 2021-01-04 16:35:29|INFO|started gpfdist -p 8081 -P 8082 -f "pathto/data_file.txt" -t 30 2021-01-04 16:35:29|INFO|did not find an external table to reuse. creating ext_gpload_reusable_ccfc0c6e_4e67_11eb_bac2_00505698d059 -2021-01-04 16:35:29|ERROR|ERROR: invalid byte sequence for encoding "UTF8": 0xd6 0xd0 (seg0 slice1 10.152.8.113:7002 pid=21163) +2021-01-04 16:35:29|ERROR|invalid byte sequence for encoding "UTF8": 0xd6 0xd0 (seg0 slice1 10.152.8.113:7002 pid=21163) CONTEXT: External table ext_gpload_reusable_ccfc0c6e_4e67_11eb_bac2_00505698d059, line 1 of file gpfdist://*:pathto/data_file.txt encountered while running INSERT INTO public."texttable2" ("s1","s2") SELECT "s1","s2" FROM ext_gpload_reusable_ccfc0c6e_4e67_11eb_bac2_00505698d059 2021-01-04 16:35:29|INFO|rows Inserted = 0 diff --git a/gpMgmt/bin/gpload_test/gpload2/query259.ans b/gpMgmt/bin/gpload_test/gpload2/query259.ans index 44553764526..da5c847fec1 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query259.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query259.ans @@ -2,7 +2,7 @@ 2021-11-29 11:57:05|INFO|setting schema 'public' for table 'texttable2' 2021-11-29 11:57:05|INFO|started gpfdist -p 8081 -P 8082 -f "/home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt" -t 30 2021-11-29 11:57:05|INFO|did not find an external table to reuse. creating ext_gpload_reusable_6adbab20_50c8_11ec_94a0_0050569e2380 -2021-11-29 11:57:05|ERROR|could not run SQL "create external table ext_gpload_reusable_6adbab20_50c8_11ec_94a0_0050569e2380("s1" text,"s2" text)location('gpfdist://10.117.190.10:8081//home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt') format'text' (delimiter '|' null '\N' escape '\' newline 'LFCR' ) encoding'UTF8' ": ERROR: invalid value for NEWLINE "LFCR" +2021-11-29 11:57:05|ERROR|could not run SQL "create external table ext_gpload_reusable_6adbab20_50c8_11ec_94a0_0050569e2380("s1" text,"s2" text)location('gpfdist://10.117.190.10:8081//home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt') format'text' (delimiter '|' null '\N' escape '\' newline 'LFCR' ) encoding'UTF8' ": invalid value for NEWLINE "LFCR" HINT: Valid options are: 'LF', 'CRLF' and 'CR'. 2021-11-29 11:57:05|INFO|rows Inserted = 0 diff --git a/gpMgmt/bin/gpload_test/gpload2/query260.ans b/gpMgmt/bin/gpload_test/gpload2/query260.ans index 0019311b50c..8256642f596 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query260.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query260.ans @@ -2,7 +2,7 @@ 2021-11-30 15:00:23|INFO|setting schema 'public' for table 'texttable2' 2021-11-30 15:00:23|INFO|started gpfdist -p 8081 -P 8082 -f "pathto/data_file.csv" -t 30 2021-11-30 15:00:23|INFO|did not find an external table to reuse. creating ext_gpload_reusable_30a0dcd0_51ab_11ec_839b_0050569e2380 -2021-11-30 15:00:23|ERROR|could not run SQL "create external table ext_gpload_reusable_30a0dcd0_51ab_11ec_839b_0050569e2380("s1" text,"s2" text)location('gpfdist://*:pathto/data_file.csv') format'csv' (delimiter ',' null '' escape '"' quote '"' newline 'LFCR' ) encoding'UTF8' ": ERROR: invalid value for NEWLINE "LFCR" +2021-11-30 15:00:23|ERROR|could not run SQL "create external table ext_gpload_reusable_30a0dcd0_51ab_11ec_839b_0050569e2380("s1" text,"s2" text)location('gpfdist://*:pathto/data_file.csv') format'csv' (delimiter ',' null '' escape '"' quote '"' newline 'LFCR' ) encoding'UTF8' ": invalid value for NEWLINE "LFCR" HINT: Valid options are: 'LF', 'CRLF' and 'CR'. 2021-11-30 15:00:23|INFO|rows Inserted = 0 diff --git a/gpMgmt/bin/gpload_test/gpload2/query31.ans b/gpMgmt/bin/gpload_test/gpload2/query31.ans index f01dc093e85..e43ec31c74f 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query31.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query31.ans @@ -3,7 +3,7 @@ 2018-07-20 09:06:30|INFO|started gpfdist -p 8081 -P 8082 -f "/home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt" -t 30 2018-07-20 09:06:30|INFO|did not find a staging table to reuse. creating staging_gpload_reusable_9faa546d615fa55cc3e9e2cee6f130b0 2018-07-20 09:06:30|INFO|reusing external table ext_gpload_reusable_30024be2_8bfc_11e8_83d4_0242ac110002 -2018-07-20 09:06:30|ERROR|ERROR: column "n8" does not exist +2018-07-20 09:06:30|ERROR|column "n8" does not exist LINE 1: ..."s2","s3","dt","n1","n2","n3","n4","n5","n6","n7","n8" FROM ... ^ encountered while running INSERT INTO staging_gpload_reusable_9faa546d615fa55cc3e9e2cee6f130b0 ("s1","s2","s3","dt","n1","n2","n3","n4","n5","n6","n7","n8") SELECT "s1","s2","s3","dt","n1","n2","n3","n4","n5","n6","n7","n8" FROM ext_gpload_reusable_30024be2_8bfc_11e8_83d4_0242ac110002 @@ -16,7 +16,7 @@ LINE 1: ..."s2","s3","dt","n1","n2","n3","n4","n5","n6","n7","n8" FROM ... 2018-07-20 09:06:30|INFO|started gpfdist -p 8081 -P 8082 -f "/home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt" -t 30 2018-07-20 09:06:30|INFO|did not find a staging table to reuse. creating staging_gpload_reusable_9faa546d615fa55cc3e9e2cee6f130b0 2018-07-20 09:06:30|INFO|reusing external table ext_gpload_reusable_30024be2_8bfc_11e8_83d4_0242ac110002 -2018-07-20 09:06:30|ERROR|ERROR: column "n8" does not exist +2018-07-20 09:06:30|ERROR|column "n8" does not exist LINE 1: ..."s2","s3","dt","n1","n2","n3","n4","n5","n6","n7","n8" FROM ... ^ encountered while running INSERT INTO staging_gpload_reusable_9faa546d615fa55cc3e9e2cee6f130b0 ("s1","s2","s3","dt","n1","n2","n3","n4","n5","n6","n7","n8") SELECT "s1","s2","s3","dt","n1","n2","n3","n4","n5","n6","n7","n8" FROM ext_gpload_reusable_30024be2_8bfc_11e8_83d4_0242ac110002 diff --git a/gpMgmt/bin/gpload_test/gpload2/query312.ans b/gpMgmt/bin/gpload_test/gpload2/query312.ans index 84bea6cc455..030f88c59de 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query312.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query312.ans @@ -2,7 +2,7 @@ 2020-12-17 15:57:28|INFO|setting schema 'public' for table 'texttable' 2020-12-17 15:57:28|INFO|started gpfdist -p 8081 -P 8082 -f "pathto/data_file.txt" -t 30 2020-12-17 15:57:28|INFO|did not find an external table to reuse. creating ext_gpload_reusable_823e0c46_403d_11eb_ba00_000c299afcc5 -2020-12-17 15:57:29|ERROR|ERROR: segment reject limit reached, aborting operation (seg0 slice1 127.0.0.1:6000 pid=3953) +2020-12-17 15:57:29|ERROR|segment reject limit reached, aborting operation (seg0 slice1 127.0.0.1:6000 pid=3953) DETAIL: Last error was: invalid input syntax for type smallint: "invalid string", column n1 CONTEXT: External table ext_gpload_reusable_823e0c46_403d_11eb_ba00_000c299afcc5, line 4 of gpfdist://*:pathto/data_file.txt, column n1 encountered while running INSERT INTO public."texttable" ("s1","s2","s3","dt","n1","n2","n3","n4","n5","n6","n7") SELECT "s1","s2","s3","dt","n1","n2","n3","n4","n5","n6","n7" FROM ext_gpload_reusable_823e0c46_403d_11eb_ba00_000c299afcc5 diff --git a/gpMgmt/bin/gpload_test/gpload2/query37.ans b/gpMgmt/bin/gpload_test/gpload2/query37.ans index c51d7cdcd7d..b0050f24435 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query37.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query37.ans @@ -5,7 +5,7 @@ HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sur 2021-11-29 11:57:32|INFO|started gpfdist -p 8081 -P 8082 -f "/home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt" -t 30 2021-11-29 11:57:32|INFO|did not find a staging table to reuse. creating staging_gpload_reusable_afbaac0da7ced19791c9ab9c537f41d3 2021-11-29 11:57:32|INFO|did not find an external table to reuse. creating ext_gpload_reusable_7ac93e9e_50c8_11ec_821e_0050569e2380 -2021-11-29 11:57:32|ERROR|could not run SQL "create external table ext_gpload_reusable_7ac93e9e_50c8_11ec_821e_0050569e2380("s1" text,"s2" text,"s3" text,"dt" timestamp without time zone,"n1" smallint,"n2" integer,"n3" bigint,"n4" numeric,"n5" numeric,"n6" real,"n7" double precision)location('gpfdist://10.117.190.10:8081//home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt') format'text' (delimiter '|' null '\N' escape '\' ) encoding'xxxx' ": ERROR: xxxx is not a valid encoding name +2021-11-29 11:57:32|ERROR|could not run SQL "create external table ext_gpload_reusable_7ac93e9e_50c8_11ec_821e_0050569e2380("s1" text,"s2" text,"s3" text,"dt" timestamp without time zone,"n1" smallint,"n2" integer,"n3" bigint,"n4" numeric,"n5" numeric,"n6" real,"n7" double precision)location('gpfdist://10.117.190.10:8081//home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt') format'text' (delimiter '|' null '\N' escape '\' ) encoding'xxxx' ": xxxx is not a valid encoding name 2021-11-29 11:57:32|INFO|rows Inserted = 0 2021-11-29 11:57:32|INFO|rows Updated = 0 @@ -18,7 +18,7 @@ HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sur 2021-11-29 11:57:32|INFO|started gpfdist -p 8081 -P 8082 -f "/home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt" -t 30 2021-11-29 11:57:32|INFO|did not find a staging table to reuse. creating staging_gpload_reusable_afbaac0da7ced19791c9ab9c537f41d3 2021-11-29 11:57:32|INFO|did not find an external table to reuse. creating ext_gpload_reusable_7ae5d7e8_50c8_11ec_9979_0050569e2380 -2021-11-29 11:57:32|ERROR|could not run SQL "create external table ext_gpload_reusable_7ae5d7e8_50c8_11ec_9979_0050569e2380("s1" text,"s2" text,"s3" text,"dt" timestamp without time zone,"n1" smallint,"n2" integer,"n3" bigint,"n4" numeric,"n5" numeric,"n6" real,"n7" double precision)location('gpfdist://10.117.190.10:8081//home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt') format'text' (delimiter '|' null '\N' escape '\' ) encoding'xxxx' ": ERROR: xxxx is not a valid encoding name +2021-11-29 11:57:32|ERROR|could not run SQL "create external table ext_gpload_reusable_7ae5d7e8_50c8_11ec_9979_0050569e2380("s1" text,"s2" text,"s3" text,"dt" timestamp without time zone,"n1" smallint,"n2" integer,"n3" bigint,"n4" numeric,"n5" numeric,"n6" real,"n7" double precision)location('gpfdist://10.117.190.10:8081//home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt') format'text' (delimiter '|' null '\N' escape '\' ) encoding'xxxx' ": xxxx is not a valid encoding name 2021-11-29 11:57:32|INFO|rows Inserted = 0 2021-11-29 11:57:32|INFO|rows Updated = 0 diff --git a/gpMgmt/bin/gpload_test/gpload2/query402.ans b/gpMgmt/bin/gpload_test/gpload2/query402.ans index b2b699b307e..9ec5a34c349 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query402.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query402.ans @@ -2,7 +2,7 @@ 2021-11-30 15:17:58|INFO|setting schema 'public' for table 'texttable' 2021-11-30 15:17:58|INFO|started gpfdist -p 8081 -P 8082 -f "pathto/data_file.txt" -t 30 2021-11-30 15:17:58|INFO|did not find an external table to reuse. creating non_ext_schema_test.ext_gpload_reusable_a53b654a_51ad_11ec_b1b3_0050569e2380 -2021-11-30 15:17:58|ERROR|could not run SQL "create external table non_ext_schema_test.ext_gpload_reusable_a53b654a_51ad_11ec_b1b3_0050569e2380("s1" text,"s2" text,"s3" text,"dt" timestamp without time zone,"n1" smallint,"n2" integer,"n3" bigint,"n4" numeric,"n5" numeric,"n6" real,"n7" double precision)location('gpfdist://*:pathto/data_file.txt') format'text' (delimiter '|' null '\N' escape '\' ) encoding'UTF8' ": ERROR: schema "non_ext_schema_test" does not exist +2021-11-30 15:17:58|ERROR|could not run SQL "create external table non_ext_schema_test.ext_gpload_reusable_a53b654a_51ad_11ec_b1b3_0050569e2380("s1" text,"s2" text,"s3" text,"dt" timestamp without time zone,"n1" smallint,"n2" integer,"n3" bigint,"n4" numeric,"n5" numeric,"n6" real,"n7" double precision)location('gpfdist://*:pathto/data_file.txt') format'text' (delimiter '|' null '\N' escape '\' ) encoding'UTF8' ": schema "non_ext_schema_test" does not exist 2021-11-30 15:17:58|INFO|rows Inserted = 0 2021-11-30 15:17:58|INFO|rows Updated = 0 diff --git a/gpMgmt/bin/gpload_test/gpload2/query497.ans b/gpMgmt/bin/gpload_test/gpload2/query497.ans index 8a9dd85417e..9d291185652 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query497.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query497.ans @@ -5,7 +5,10 @@ HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sur 2021-01-04 16:55:52|INFO|started gpfdist -p 8081 -P 8082 -f "/home/cc/repo/gpdb/gpMgmt/bin/gpload_test/gpload2/data/external_file_01.txt" -t 30 2021-01-04 16:55:52|INFO|reusing staging table STAGING_GPLOAD_REUSABLE 2021-01-04 16:55:52|INFO|did not find an external table to reuse. creating ext_gpload_reusable_a651e6f8_4e6a_11eb_b8a4_7085c2381836 -2021-01-04 16:55:53|ERROR|unexpected error -- backtrace written to log file +2021-01-04 16:55:52|ERROR|column "non_col" does not exist +LINE 1: ...ble."s1" and into_table."s2"=from_table."s2" and non_col = ... + ^ + encountered while running update public."texttable" into_table set "n2"=from_table."n2" from staging_gpload_reusable_4b4814f7db18b678f1605a0caec3c1fe from_table where into_table."n1"=from_table."n1" and into_table."s1"=from_table."s1" and into_table."s2"=from_table."s2" and non_col = 5 2021-01-04 16:55:53|INFO|rows Inserted = 0 2021-01-04 16:55:53|INFO|rows Updated = 0 2021-01-04 16:55:53|INFO|data formatting errors = 0 diff --git a/gpMgmt/bin/gpload_test/gpload2/query522.ans b/gpMgmt/bin/gpload_test/gpload2/query522.ans index 5114fb13fad..79634a5feaa 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query522.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query522.ans @@ -7,7 +7,7 @@ CREATE TABLE 2021-01-07 16:25:52|INFO|setting schema 'public' for table 'mapping_test' 2021-01-07 16:25:52|INFO|started gpfdist -p 8081 -P 8082 -f "/home/cc/repo/gpdb/gpMgmt/bin/gpload_test/gpload2/data/column_mapping_01.txt" -t 30 2021-01-07 16:25:52|INFO|did not find an external table to reuse. creating ext_gpload_reusable_f42535ca_50c1_11eb_a32e_7085c2381836 -2021-01-07 16:25:52|ERROR|ERROR: column "n3" does not exist +2021-01-07 16:25:52|ERROR|column "n3" does not exist LINE 1: ...blic."mapping_test" ("s1","s2","s3") SELECT c1,c2,n3 FROM ex... ^ HINT: Perhaps you meant to reference the column "ext_gpload_reusable_f42535ca_50c1_11eb_a32e_7085c2381836.c3" or the column "mapping_test.s3". diff --git a/gpMgmt/bin/gpload_test/gpload2/query523.ans b/gpMgmt/bin/gpload_test/gpload2/query523.ans index 2faf394b2a4..e9b6bff5bd8 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query523.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query523.ans @@ -7,7 +7,7 @@ CREATE TABLE 2021-01-07 16:26:05|INFO|setting schema 'public' for table 'mapping_test' 2021-01-07 16:26:06|INFO|started gpfdist -p 8081 -P 8082 -f "/home/cc/repo/gpdb/gpMgmt/bin/gpload_test/gpload2/data/column_mapping_01.txt" -t 30 2021-01-07 16:26:06|INFO|did not find an external table to reuse. creating ext_gpload_reusable_fc7440a4_50c1_11eb_a0a7_7085c2381836 -2021-01-07 16:26:06|ERROR|ERROR: column "s4" is of type integer but expression is of type text +2021-01-07 16:26:06|ERROR|column "s4" is of type integer but expression is of type text LINE 1: ...blic."mapping_test" ("s2","s3","s4") SELECT c2,c3,c1 FROM ex... ^ HINT: You will need to rewrite or cast the expression. diff --git a/gpMgmt/bin/gpload_test/gpload2/query529.ans b/gpMgmt/bin/gpload_test/gpload2/query529.ans index 092c9478e23..4f10bb12c7b 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query529.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query529.ans @@ -7,7 +7,7 @@ CREATE TABLE 2021-01-07 16:37:32|INFO|setting schema 'public' for table 'mapping_test' 2021-01-07 16:37:32|INFO|started gpfdist -p 8081 -P 8082 -f "/home/cc/repo/gpdb/gpMgmt/bin/gpload_test/gpload2/data/column_mapping_01.txt" -t 30 2021-01-07 16:37:32|INFO|did not find an external table to reuse. creating ext_gpload_reusable_959774bc_50c3_11eb_b301_7085c2381836 -2021-01-07 16:37:32|ERROR|ERROR: function rocket_bites(unknown) does not exist +2021-01-07 16:37:32|ERROR|function rocket_bites(unknown) does not exist LINE 1: INSERT INTO public."mapping_test" ("s1") SELECT rocket_bites... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. diff --git a/gpMgmt/bin/gpload_test/gpload2/query532.ans b/gpMgmt/bin/gpload_test/gpload2/query532.ans index 98d7ea1ee9a..244ad2f3be6 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query532.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query532.ans @@ -12,7 +12,7 @@ HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sur 2021-01-07 17:38:14|INFO|started gpfdist -p 8081 -P 8082 -f "/home/cc/repo/gpdb/gpMgmt/bin/gpload_test/gpload2/data/column_mapping_01.txt" -t 30 2021-01-07 17:38:14|INFO|did not find a staging table to reuse. creating staging_gpload_reusable_edcb757d70ae1c70cdd2f7d15496f54b 2021-01-07 17:38:14|INFO|did not find an external table to reuse. creating ext_gpload_reusable_102fae3a_50cc_11eb_b6c8_7085c2381836 -2021-01-07 17:38:14|ERROR|ERROR: column "s4" is of type integer but expression is of type text +2021-01-07 17:38:14|ERROR|column "s4" is of type integer but expression is of type text LINE 1: ...5c64da950cfbc41ff55 ("s1","s2","s4") SELECT c1,c3,c2 FROM ex... ^ HINT: You will need to rewrite or cast the expression. diff --git a/gpMgmt/bin/gpload_test/gpload2/query533.ans b/gpMgmt/bin/gpload_test/gpload2/query533.ans index 809573e625a..64d947128fa 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query533.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query533.ans @@ -12,7 +12,7 @@ HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sur 2021-01-07 17:38:26|INFO|started gpfdist -p 8081 -P 8082 -f "/home/cc/repo/gpdb/gpMgmt/bin/gpload_test/gpload2/data/column_mapping_01.txt" -t 30 2021-01-07 17:38:26|INFO|did not find a staging table to reuse. creating staging_gpload_reusable_edcb757d70ae1c70cdd2f7d15496f54b 2021-01-07 17:38:26|INFO|did not find an external table to reuse. creating ext_gpload_reusable_1777c5e2_50cc_11eb_bb05_7085c2381836 -2021-01-07 17:38:26|ERROR|ERROR: column "s4" is of type integer but expression is of type text +2021-01-07 17:38:26|ERROR|column "s4" is of type integer but expression is of type text LINE 1: ...5c64da950cfbc41ff55 ("s1","s2","s4") SELECT c1,c3,c2 FROM ex... ^ HINT: You will need to rewrite or cast the expression. diff --git a/gpMgmt/bin/gpload_test/gpload2/query60.ans b/gpMgmt/bin/gpload_test/gpload2/query60.ans index 2d1c9dc10bf..673ff09913b 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query60.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query60.ans @@ -20,7 +20,7 @@ 2020-12-07 09:57:17|INFO|setting schema 'public' for table 'texttable' 2020-12-07 09:57:17|INFO|started gpfdist -p 8081 -P 8082 -f "pathto/data_file.txt" -t 30 2020-12-07 09:57:17|INFO|did not find an external table to reuse. creating ext_gpload_reusable_89036be0_382f_11eb_95c3_00505698707d -2020-12-07 09:57:18|ERROR|ERROR: connection with gpfdist failed for "gpfdist://*:pathto/data_file.txt", effective url: "http://*:pathto/data_file.txt": error code = 111 (Connection refused); (seg1 slice1 10.152.8.160:7003 pid=4267) +2020-12-07 09:57:18|ERROR|connection with gpfdist failed for "gpfdist://*:pathto/data_file.txt", effective url: "http://*:pathto/data_file.txt": error code = 111 (Connection refused); (seg1 slice1 10.152.8.160:7003 pid=4267) encountered while running INSERT INTO public."texttable" ("s1","s2","s3","dt","n1","n2","n3","n4","n5","n6","n7") SELECT "s1","s2","s3","dt","n1","n2","n3","n4","n5","n6","n7" FROM ext_gpload_reusable_89036be0_382f_11eb_95c3_00505698707d 2020-12-07 09:57:18|INFO|rows Inserted = 0 2020-12-07 09:57:18|INFO|rows Updated = 0 diff --git a/gpMgmt/bin/gpload_test/gpload2/query604.ans b/gpMgmt/bin/gpload_test/gpload2/query604.ans index a245c1a586b..a8fb8e49529 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query604.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query604.ans @@ -1,8 +1,8 @@ 2021-01-17 20:28:18|INFO|gpload session started 2021-01-17 20:28:18 2021-01-17 20:28:18|INFO|setting schema 'public' for table 'texttable' 2021-01-17 20:28:18|INFO|started gpfdist -p 8081 -P 8082 -f "/home/gpadmin/temp/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt" -t 30 -2021-01-17 20:28:18|INFO|reusing external staging table staging_test -2021-01-17 20:28:18|ERROR|ERROR: column "n8" does not exist +2021-01-17 20:28:18|INFO|reusing external staging table "STAGING_test" +2021-01-17 20:28:18|ERROR|column "n8" does not exist LINE 1: ..."s2","s3","dt","n1","n2","n3","n4","n5","n6","n7","n8" FROM ... ^ HINT: There is a column named "n8" in table "texttable", but it cannot be referenced from this part of the query. diff --git a/gpMgmt/bin/gpload_test/gpload2/query65.ans b/gpMgmt/bin/gpload_test/gpload2/query65.ans index 574bc77fb24..442d8ce5e12 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query65.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query65.ans @@ -2,7 +2,7 @@ 2021-01-08 16:05:19|INFO|setting schema 'public' for table 'texttable' 2021-01-08 16:05:19|INFO|started gpfdist -p 8081 -P 8082 -f "pathto/data_file.txt pathto/data_file1.txt pathto/data_file99.txt" -t 30 2021-01-08 16:05:19|INFO|did not find an external table to reuse. creating ext_gpload_reusable_3fe4da80_5188_11eb_bc9e_00505698707d -2021-01-08 16:05:20|ERROR|ERROR: http response code 404 from gpfdist (gpfdist://*:pathto/data_file.txt%pathto/data_file1.txt%pathto/data_file99.txt): HTTP/1.0 404 file not found (seg0 slice1 10.152.8.160:7002 pid=18998) +2021-01-08 16:05:20|ERROR|http response code 404 from gpfdist (gpfdist://*:pathto/data_file.txt%pathto/data_file1.txt%pathto/data_file99.txt): HTTP/1.0 404 file not found (seg0 slice1 10.152.8.160:7002 pid=18998) encountered while running INSERT INTO public."texttable" ("s1","s2","s3","dt","n1","n2","n3","n4","n5","n6","n7") SELECT "s1","s2","s3","dt","n1","n2","n3","n4","n5","n6","n7" FROM ext_gpload_reusable_3fe4da80_5188_11eb_bc9e_00505698707d 2021-01-08 16:05:20|INFO|rows Inserted = 0 2021-01-08 16:05:20|INFO|rows Updated = 0 diff --git a/gpMgmt/bin/gpload_test/gpload2/query652.ans b/gpMgmt/bin/gpload_test/gpload2/query652.ans index 65314566d42..e0904221073 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query652.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query652.ans @@ -1,7 +1,7 @@ 2021-01-04 19:52:14|INFO|gpload session started 2021-01-04 19:52:14 2021-01-04 19:52:14|INFO|setting schema 'public' for table 'texttable_652' 2021-01-04 19:52:14|INFO|started gpfdist -p 8081 -P 8082 -f "/home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data/external_file_01.txt" -t 30 -2021-01-04 19:52:14|ERROR|could not execute SQL in sql:before "INSERT INTO test_652 VALUES(1)": ERROR: relation "test_652" does not exist +2021-01-04 19:52:14|ERROR|could not execute SQL in sql:before "INSERT INTO test_652 VALUES(1)": relation "test_652" does not exist LINE 1: INSERT INTO test_652 VALUES(1) ^ diff --git a/gpMgmt/bin/gpload_test/gpload2/query662.ans b/gpMgmt/bin/gpload_test/gpload2/query662.ans index d88ee406f42..9eb0144afd1 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query662.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query662.ans @@ -2,7 +2,7 @@ 2021-01-11 18:03:26|INFO|setting schema 'public' for table 'texttable_662' 2021-01-11 18:03:26|INFO|started gpfdist -p 8081 -P 8082 -f "/home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data/external_file_01.txt" -t 30 2021-01-11 18:03:26|INFO|did not find an external table to reuse. creating ext_gpload_reusable_3f87f84c_53f4_11eb_8b61_005056983e1a -2021-01-11 18:03:26|ERROR|could not execute SQL in sql:after "INSERT INTO test_662 VALUES(1)": ERROR: relation "test_662" does not exist +2021-01-11 18:03:26|ERROR|could not execute SQL in sql:after "INSERT INTO test_662 VALUES(1)": relation "test_662" does not exist LINE 1: INSERT INTO test_662 VALUES(1) ^ diff --git a/gpMgmt/bin/gpload_test/gpload2/query664.ans b/gpMgmt/bin/gpload_test/gpload2/query664.ans index 794c289b470..bffb8338e58 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query664.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query664.ans @@ -1,7 +1,7 @@ 2021-01-11 18:56:05|INFO|gpload session started 2021-01-11 18:56:05 2021-01-11 18:56:05|INFO|setting schema 'public' for table 'texttable_664' 2021-01-11 18:56:05|INFO|started gpfdist -p 8081 -P 8082 -f "/home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data/external_file_01.txt" -t 30 -2021-01-11 18:56:05|ERROR|could not execute SQL in sql:before "INSERT INTO test_664_before VALUES('a')": ERROR: invalid input syntax for type integer: "a" +2021-01-11 18:56:05|ERROR|could not execute SQL in sql:before "INSERT INTO test_664_before VALUES('a')": invalid input syntax for type integer: "a" LINE 1: INSERT INTO test_664_before VALUES('a') ^ diff --git a/gpMgmt/bin/gpload_test/gpload2/query665.ans b/gpMgmt/bin/gpload_test/gpload2/query665.ans index 8a005605cca..c634c40d808 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query665.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query665.ans @@ -2,7 +2,7 @@ 2021-01-11 18:56:59|INFO|setting schema 'public' for table 'texttable_665' 2021-01-11 18:56:59|INFO|started gpfdist -p 8081 -P 8082 -f "/home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data/external_file_01.txt" -t 30 2021-01-11 18:56:59|INFO|did not find an external table to reuse. creating ext_gpload_reusable_ba362bb6_53fb_11eb_a8b6_005056983e1a -2021-01-11 18:56:59|ERROR|could not execute SQL in sql:after "INSERT INTO test_665_after VALUES('a')": ERROR: invalid input syntax for type integer: "a" +2021-01-11 18:56:59|ERROR|could not execute SQL in sql:after "INSERT INTO test_665_after VALUES('a')": invalid input syntax for type integer: "a" LINE 1: INSERT INTO test_665_after VALUES('a') ^ diff --git a/gpMgmt/bin/gpload_test/gpload2/query666.ans b/gpMgmt/bin/gpload_test/gpload2/query666.ans index a2ebf47574a..85e34e6e217 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query666.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query666.ans @@ -1,7 +1,7 @@ 2021-01-11 19:18:24|INFO|gpload session started 2021-01-11 19:18:24 2021-01-11 19:18:24|INFO|setting schema 'public' for table 'texttable_666' 2021-01-11 19:18:24|INFO|started gpfdist -p 8081 -P 8082 -f "/home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data/external_file_01.txt" -t 30 -2021-01-11 19:18:24|ERROR|could not execute SQL in sql:before "INSERT INTO test_666_before VALUES('a')": ERROR: invalid input syntax for type integer: "a" +2021-01-11 19:18:24|ERROR|could not execute SQL in sql:before "INSERT INTO test_666_before VALUES('a')": invalid input syntax for type integer: "a" LINE 1: INSERT INTO test_666_before VALUES('a') ^ diff --git a/gpMgmt/bin/gpload_test/gpload2/query667.ans b/gpMgmt/bin/gpload_test/gpload2/query667.ans index 89653613c34..205403e8ce2 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query667.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query667.ans @@ -5,7 +5,7 @@ HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sur 2021-01-11 19:20:03|INFO|started gpfdist -p 8081 -P 8082 -f "/home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data/external_file_01.txt" -t 30 2021-01-11 19:20:03|INFO|did not find a staging table to reuse. creating staging_gpload_reusable_08aff1d5e0be087569323178726e90f6 2021-01-11 19:20:03|INFO|did not find an external table to reuse. creating ext_gpload_reusable_f39a934e_53fe_11eb_898a_005056983e1a -2021-01-11 19:20:04|ERROR|could not execute SQL in sql:after "INSERT INTO test_667_after VALUES('a')": ERROR: invalid input syntax for type integer: "a" +2021-01-11 19:20:04|ERROR|could not execute SQL in sql:after "INSERT INTO test_667_after VALUES('a')": invalid input syntax for type integer: "a" LINE 1: INSERT INTO test_667_after VALUES('a') ^ diff --git a/gpMgmt/bin/gpload_test/gpload2/query68.ans b/gpMgmt/bin/gpload_test/gpload2/query68.ans index 808eff402fd..fcd3dfde0ff 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query68.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query68.ans @@ -5,7 +5,7 @@ HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sur 2021-01-08 16:05:22|INFO|started gpfdist -p 8081 -P 8082 -f "pathto/data_file2.txt" -t 30 2021-01-08 16:05:22|INFO|did not find a staging table to reuse. creating staging_gpload_reusable_a1101b5024707ea34f55e778f329e548 2021-01-08 16:05:22|INFO|did not find an external table to reuse. creating ext_gpload_reusable_418b1b42_5188_11eb_93db_00505698707d -2021-01-08 16:05:22|ERROR|ERROR: column "Field1" is of type bigint but expression is of type text +2021-01-08 16:05:22|ERROR|column "Field1" is of type bigint but expression is of type text LINE 1: ...bb31496d7e9a13bd29b90 ("Field1","Field#2") SELECT "Field1","... ^ HINT: You will need to rewrite or cast the expression. diff --git a/gpMgmt/bin/gpload_test/gpload2/query69.ans b/gpMgmt/bin/gpload_test/gpload2/query69.ans index c157448556b..fce4bb8c984 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query69.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query69.ans @@ -5,7 +5,7 @@ HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sur 2021-01-08 16:28:20|INFO|started gpfdist -p 8081 -P 8082 -f "pathto/data_file2.txt" -t 30 2021-01-08 16:28:20|INFO|did not find a staging table to reuse. creating staging_gpload_reusable_a1101b5024707ea34f55e778f329e548 2021-01-08 16:28:20|INFO|did not find an external table to reuse. creating ext_gpload_reusable_770f4452_518b_11eb_98a2_00505698707d -2021-01-08 16:28:20|ERROR|ERROR: column "Field1" is of type bigint but expression is of type text +2021-01-08 16:28:20|ERROR|column "Field1" is of type bigint but expression is of type text LINE 1: ...bb31496d7e9a13bd29b90 ("Field1","Field#2") SELECT "Field1","... ^ HINT: You will need to rewrite or cast the expression. diff --git a/gpMgmt/bin/gpload_test/gpload2/query75.ans b/gpMgmt/bin/gpload_test/gpload2/query75.ans index dd5b01b3add..9bfe7c6edf0 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query75.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query75.ans @@ -14,7 +14,11 @@ HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sur 2021-08-10 14:56:46|INFO|started gpfdist -p 8081 -P 8082 -f "/home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt" -t 30 2021-08-10 14:56:46|INFO|did not find a staging table to reuse. creating staging_gpload_reusable_5171458efa83aaf8c5bc7004bae85d5b 2021-08-10 14:56:46|INFO|reusing external table ext_gpload_reusable_2092c476_f9a8_11eb_b503_0050569e2380 -2021-08-10 14:56:46|ERROR|unexpected error -- backtrace written to log file +2021-08-10 14:56:46|ERROR|column "列" does not exist +LINE 1: ..." FROM (SELECT *, row_number() OVER (PARTITION BY 列#2) AS g... + ^ +HINT: Perhaps you meant to reference the column "staging_gpload_reusable_77874e55aae34d59751eb574ff0f5cf7.列1" or the column "chinese表.列1". + encountered while running INSERT INTO public."chinese表" ("列1","列#2","lie3") (SELECT from_table."列1",from_table."列#2",from_table."lie3" FROM (SELECT *, row_number() OVER (PARTITION BY 列#2) AS gpload_row_number FROM staging_gpload_reusable_77874e55aae34d59751eb574ff0f5cf7) AS from_table WHERE gpload_row_number=1) 2021-08-10 14:56:46|INFO|rows Inserted = 0 2021-08-10 14:56:46|INFO|rows Updated = 8 2021-08-10 14:56:46|INFO|data formatting errors = 0 @@ -33,7 +37,11 @@ HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sur 2021-08-10 14:56:46|INFO|started gpfdist -p 8081 -P 8082 -f "/home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt" -t 30 2021-08-10 14:56:46|INFO|did not find a staging table to reuse. creating staging_gpload_reusable_5171458efa83aaf8c5bc7004bae85d5b 2021-08-10 14:56:46|INFO|reusing external table ext_gpload_reusable_2092c476_f9a8_11eb_b503_0050569e2380 -2021-08-10 14:56:46|ERROR|unexpected error -- backtrace written to log file +2021-08-10 14:56:46|ERROR|column "列" does not exist +LINE 1: ..." FROM (SELECT *, row_number() OVER (PARTITION BY 列#2) AS g... + ^ +HINT: Perhaps you meant to reference the column "staging_gpload_reusable_77874e55aae34d59751eb574ff0f5cf7.列1" or the column "chinese表.列1". + encountered while running INSERT INTO public."chinese表" ("列1","列#2","lie3") (SELECT from_table."列1",from_table."列#2",from_table."lie3" FROM (SELECT *, row_number() OVER (PARTITION BY 列#2) AS gpload_row_number FROM staging_gpload_reusable_77874e55aae34d59751eb574ff0f5cf7) AS from_table WHERE gpload_row_number=1) 2021-08-10 14:56:46|INFO|rows Inserted = 0 2021-08-10 14:56:46|INFO|rows Updated = 8 2021-08-10 14:56:46|INFO|data formatting errors = 0 diff --git a/gpMgmt/bin/gpload_test/gpload2/query76.ans b/gpMgmt/bin/gpload_test/gpload2/query76.ans index cb958591c94..26872cf30e8 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query76.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query76.ans @@ -3,18 +3,12 @@ LINE 13: and pgext.fmtopts like '%delimiter '';'' nu... ^ HINT: Use the escape string syntax for backslashes, e.g., E'\\'. WARNING: nonstandard use of escape in a string literal -LINE 1: ...pathto/data_file.txt') format'text' (delimiter ';' null '\N' escap... - ^ -HINT: Use the escape string syntax for escapes, e.g., E'\r\n'. WARNING: nonstandard use of \' in a string literal -LINE 1: ...xt') format'text' (delimiter ';' null '\N' escape '\' ) enco... - ^ -HINT: Use '' to write quotes in strings, or use the escape string syntax (E'...'). 2021-11-29 15:29:03|INFO|gpload session started 2021-11-29 15:29:03 2021-11-29 15:29:03|INFO|setting schema 'public' for table 'chinese表' 2021-11-29 15:29:03|INFO|started gpfdist -p 8081 -P 8082 -f "pathto/data_file.txt" -t 30 2021-11-29 15:29:03|INFO|did not find an external table to reuse. creating ext_gpload_reusable_075bc846_50e6_11ec_8cb7_0050569e2380 -2021-11-29 15:29:03|ERROR|could not run SQL "create external table ext_gpload_reusable_075bc846_50e6_11ec_8cb7_0050569e2380("列1" text,"列#2" int,"lie3" timestamp)location('gpfdist://*:pathto/data_file.txt') format'text' (delimiter ';' null '\N' escape '\' ) encoding'UTF8' ": ERROR: syntax error at or near "UTF8" +2021-11-29 15:29:03|ERROR|could not run SQL "create external table ext_gpload_reusable_075bc846_50e6_11ec_8cb7_0050569e2380("列1" text,"列#2" int,"lie3" timestamp)location('gpfdist://*:pathto/data_file.txt') format'text' (delimiter ';' null '\N' escape '\' ) encoding'UTF8' ": syntax error at or near "UTF8" LINE 1: ...'text' (delimiter ';' null '\N' escape '\' ) encoding'UTF8' ^ @@ -41,7 +35,7 @@ HINT: Use the escape string syntax for backslashes, e.g., E'\\'. 2021-11-29 15:29:04|INFO|started gpfdist -p 8081 -P 8082 -f "pathto/data_file.txt" -t 30 2021-11-29 15:29:04|INFO|did not find a staging table to reuse. creating staging_gpload_reusable_5171458efa83aaf8c5bc7004bae85d5b 2021-11-29 15:29:04|INFO|did not find an external table to reuse. creating ext_gpload_reusable_07a3c70e_50e6_11ec_9873_0050569e2380 -2021-11-29 15:29:04|ERROR|could not run SQL "create external table ext_gpload_reusable_07a3c70e_50e6_11ec_9873_0050569e2380(列1 text,列#2 int,lie3 timestamp)location('gpfdist://*:pathto/data_file.txt') format'text' (delimiter ';' null '\N' escape '\' ) encoding'UTF8' ": ERROR: syntax error at or near "#" +2021-11-29 15:29:04|ERROR|could not run SQL "create external table ext_gpload_reusable_07a3c70e_50e6_11ec_9873_0050569e2380(列1 text,列#2 int,lie3 timestamp)location('gpfdist://*:pathto/data_file.txt') format'text' (delimiter ';' null '\N' escape '\' ) encoding'UTF8' ": syntax error at or near "#" LINE 1: ...(列1 text,列#2 int,lie... ^ diff --git a/gpMgmt/bin/gpload_test/gpload2/query77.ans b/gpMgmt/bin/gpload_test/gpload2/query77.ans index cfeacc66960..02d530e7eaa 100644 --- a/gpMgmt/bin/gpload_test/gpload2/query77.ans +++ b/gpMgmt/bin/gpload_test/gpload2/query77.ans @@ -3,18 +3,12 @@ LINE 13: and pgext.fmtopts like '%delimiter '';'' nu... ^ HINT: Use the escape string syntax for backslashes, e.g., E'\\'. WARNING: nonstandard use of escape in a string literal -LINE 1: .../data_file.txt') format'text' (delimiter ';' null '\N' escap... - ^ -HINT: Use the escape string syntax for escapes, e.g., E'\r\n'. WARNING: nonstandard use of \' in a string literal -LINE 1: ...xt') format'text' (delimiter ';' null '\N' escape '\' ) enco... - ^ -HINT: Use '' to write quotes in strings, or use the escape string syntax (E'...'). 2021-11-29 11:57:13|INFO|gpload session started 2021-11-29 11:57:13 2021-11-29 11:57:13|INFO|setting schema 'public' for table 'testspecialchar' 2021-11-29 11:57:13|INFO|started gpfdist -p 8081 -P 8082 -f "/home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt" -t 30 2021-11-29 11:57:13|INFO|did not find an external table to reuse. creating ext_gpload_reusable_6f40f210_50c8_11ec_89e8_0050569e2380 -2021-11-29 11:57:13|ERROR|could not run SQL "create external table ext_gpload_reusable_6f40f210_50c8_11ec_89e8_0050569e2380("Field1" text,"Field#2" text)location('gpfdist://10.117.190.10:8081//home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt') format'text' (delimiter ';' null '\N' escape '\' ) encoding'UTF8' ": ERROR: syntax error at or near "UTF8" +2021-11-29 11:57:13|ERROR|could not run SQL "create external table ext_gpload_reusable_6f40f210_50c8_11ec_89e8_0050569e2380("Field1" text,"Field#2" text)location('gpfdist://10.117.190.10:8081//home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt') format'text' (delimiter ';' null '\N' escape '\' ) encoding'UTF8' ": syntax error at or near "UTF8" LINE 1: ...'text' (delimiter ';' null '\N' escape '\' ) encoding'UTF8' ^ @@ -22,26 +16,18 @@ LINE 1: ...'text' (delimiter ';' null '\N' escape '\' ) encoding'UTF8' 2021-11-29 11:57:13|INFO|rows Updated = 0 2021-11-29 11:57:13|INFO|data formatting errors = 0 2021-11-29 11:57:13|INFO|gpload failed -NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'Field1' as the Apache Cloudberry data distribution key for this table. -HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew. WARNING: nonstandard use of \\ in a string literal LINE 13: and pgext.fmtopts like '%delimiter '';'' nu... ^ HINT: Use the escape string syntax for backslashes, e.g., E'\\'. WARNING: nonstandard use of escape in a string literal -LINE 1: .../data_file.txt') format'text' (delimiter ';' null '\N' escap... - ^ -HINT: Use the escape string syntax for escapes, e.g., E'\r\n'. WARNING: nonstandard use of \' in a string literal -LINE 1: ...xt') format'text' (delimiter ';' null '\N' escape '\' ) enco... - ^ -HINT: Use '' to write quotes in strings, or use the escape string syntax (E'...'). 2021-11-29 11:57:13|INFO|gpload session started 2021-11-29 11:57:13 2021-11-29 11:57:13|INFO|setting schema 'public' for table 'testspecialchar' 2021-11-29 11:57:13|INFO|started gpfdist -p 8081 -P 8082 -f "/home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt" -t 30 2021-11-29 11:57:13|INFO|did not find a staging table to reuse. creating staging_gpload_reusable_40df9a45044f2d17b97f89bbbc58f24f 2021-11-29 11:57:13|INFO|did not find an external table to reuse. creating ext_gpload_reusable_6f5c6568_50c8_11ec_ae2f_0050569e2380 -2021-11-29 11:57:13|ERROR|could not run SQL "create external table ext_gpload_reusable_6f5c6568_50c8_11ec_ae2f_0050569e2380("Field1" text,"Field#2" text)location('gpfdist://10.117.190.10:8081//home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt') format'text' (delimiter ';' null '\N' escape '\' ) encoding'UTF8' ": ERROR: syntax error at or near "UTF8" +2021-11-29 11:57:13|ERROR|could not run SQL "create external table ext_gpload_reusable_6f5c6568_50c8_11ec_ae2f_0050569e2380("Field1" text,"Field#2" text)location('gpfdist://10.117.190.10:8081//home/gpadmin/workspace/gpdb/gpMgmt/bin/gpload_test/gpload2/data_file.txt') format'text' (delimiter ';' null '\N' escape '\' ) encoding'UTF8' ": syntax error at or near "UTF8" LINE 1: ...'text' (delimiter ';' null '\N' escape '\' ) encoding'UTF8' ^ diff --git a/gpMgmt/bin/gppylib/test/unit/test_unit_gpload.py b/gpMgmt/bin/gppylib/test/unit/test_unit_gpload.py index ccc19515257..1d5dd2ae774 100755 --- a/gpMgmt/bin/gppylib/test/unit/test_unit_gpload.py +++ b/gpMgmt/bin/gppylib/test/unit/test_unit_gpload.py @@ -33,8 +33,11 @@ def help_test_with_config(self, gpload_param, expected_begin_value, expected_com print(gpload_param) gploader = gpload(gpload_param) gploader.read_config() - gploader.db = self - gploader.db.query = Mock(side_effect=self.mockQuery) + gploader.conn = Mock() + gploader.conn.cursor.return_value = Mock() + gploader.conn.cursor.return_value.__enter__ = Mock(return_value=Mock(spec=['fetchall', 'execute'])) + gploader.conn.cursor.return_value.__exit__ = Mock(return_value=False) + gploader.conn.cursor.return_value.__enter__.return_value.execute = Mock(side_effect=self.mockQuery) gploader.do_method_merge = Mock(side_effect=self.mockDoNothing) gploader.do_method_update = Mock(side_effect=self.mockDoNothing) gploader.do_method_insert = Mock(side_effect=self.mockDoNothing) From 55e02648dbfadf1e952afbcdfa803676d13c6073 Mon Sep 17 00:00:00 2001 From: Xing Guo Date: Mon, 31 Jul 2023 20:23:23 +0800 Subject: [PATCH 5/7] Replace pygresql with psycopg2 for gpMgmt tools. (#15988) This is the last patch for replacing pygresql with psycopg2 in Greenplum. This patch mainly targets the gpMgmt tools. Benefits for replacing pygresql with psycopg2. - Psycopg2 is maintained actively we have encountered bugs that haven't been fixed by the upstream yet, e.g., https://github.com/greenplum-db/gpdb/pull/13953. - Psycopg2 is provided by Rocky Linux and Ubuntu. That is to say, we don't need to vendor it ourselves. - Last but not least, we got a chance to clean up leacy codes during the removal process, e.g., https://github.com/greenplum-db/gpdb/pull/15983. After this patch, we need to do the following things. - Add psycopg2 as a dependency of the rpm/deb package. - Remove the pygresql source code tarball from the gpdb repo. - Tidy up READMEs and requirements.txt files. --------- Co-authored-by: Chen Mulong Co-authored-by: Xiaoxiao He Co-authored-by: zhrt123 Co-authored-by: Piyush Chandwadkar Co-authored-by: Praveen Kumar <36772398+kpraveen457@users.noreply.github.com> --- gpMgmt/bin/analyzedb | 17 +- gpMgmt/bin/gpactivatestandby | 5 +- gpMgmt/bin/gpcheckcat | 788 ++++++++++-------- .../gpcheckcat_modules/foreign_key_check.py | 39 +- .../leaked_schema_dropper.py | 13 +- .../orphaned_toast_tables_check.py | 8 +- .../unique_index_violation_check.py | 32 +- gpMgmt/bin/gpconfig | 3 +- gpMgmt/bin/gpexpand | 16 +- gpMgmt/bin/gpload.py | 9 +- gpMgmt/bin/gpmovemirrors | 5 +- gpMgmt/bin/gppylib/commands/base.py | 4 +- gpMgmt/bin/gppylib/commands/pg.py | 1 + .../test/unit/test_unit_pg_base_backup.py | 113 +++ gpMgmt/bin/gppylib/db/catalog.py | 4 +- gpMgmt/bin/gppylib/db/dbconn.py | 64 +- .../db/test/unit/test_cluster_dbconn.py | 2 +- gpMgmt/bin/gppylib/gpcatalog.py | 14 +- .../operations/segment_reconfigurer.py | 37 +- .../unit/test_unit_segment_reconfigurer.py | 37 +- .../operations/test/unit/test_unit_utils.py | 2 +- .../gppylib/operations/test_utils_helper.py | 4 +- gpMgmt/bin/gppylib/programs/clsSystemState.py | 6 +- .../test/unit/test_unit_foreign_key_check.py | 13 +- .../gppylib/test/unit/test_unit_gpcheckcat.py | 56 +- .../gppylib/test/unit/test_unit_gpconfig.py | 3 +- .../gppylib/test/unit/test_unit_gpstate.py | 4 +- .../unit/test_unit_leaked_schema_dropper.py | 46 +- .../test_unit_unique_index_violation_check.py | 32 +- gpMgmt/bin/gppylib/utils.py | 13 +- gpMgmt/bin/gpsd | 24 +- gpMgmt/bin/minirepro | 32 +- gpMgmt/sbin/gpsegstop.py | 1 - .../behave/mgmt_utils/steps/mgmt_utils.py | 55 +- .../steps/replication_slots_utils.py | 11 +- gpMgmt/test/behave_utils/gpexpand_dml.py | 50 +- gpMgmt/test/behave_utils/utils.py | 13 +- .../gp_replica_check/gp_replica_check.py | 16 +- python-dependencies.txt | 1 + 39 files changed, 936 insertions(+), 657 deletions(-) diff --git a/gpMgmt/bin/analyzedb b/gpMgmt/bin/analyzedb index cc51e265927..1cae7b6c55d 100755 --- a/gpMgmt/bin/analyzedb +++ b/gpMgmt/bin/analyzedb @@ -25,16 +25,15 @@ from contextlib import closing import pipes # for shell-quoting, pipes.quote() import fcntl import itertools - +import psycopg2 try: - import pg - from gppylib import gplog, pgconf, userinput from gppylib.commands.base import Command, WorkerPool, Worker from gppylib.operations import Operation from gppylib.gpversion import GpVersion from gppylib.db import dbconn from gppylib.operations.unix import CheckDir, CheckFile, MakeDir + from gppylib.utils import escape_string except ImportError as e: sys.exit('Cannot import modules. Please check that you have sourced greenplum_path.sh. Detail: ' + str(e)) @@ -172,7 +171,7 @@ def validate_schema_exists(pg_port, dbname, schema): try: dburl = dbconn.DbURL(port=pg_port, dbname=dbname) conn = dbconn.connect(dburl) - count = dbconn.querySingleton(conn, "select count(*) from pg_namespace where nspname='%s';" % pg.escape_string(schema)) + count = dbconn.querySingleton(conn, "select count(*) from pg_namespace where nspname='%s';" % escape_string(schema)) if count == 0: raise ExceptionNoStackTraceNeeded("Schema %s does not exist in database %s." % (schema, dbname)) finally: @@ -219,7 +218,7 @@ def get_partition_state_tuples(pg_port, dbname, catalog_schema, partition_info): try: modcount_sql = "select to_char(coalesce(sum(modcount::bigint), 0), '999999999999999999999') from gp_dist_random('%s.%s')" % (catalog_schema, tupletable) modcount = dbconn.querySingleton(conn, modcount_sql) - except pg.DatabaseError as e: + except psycopg2.DatabaseError as e: if "does not exist" in str(e): logger.info("Table %s.%s (%s) no longer exists and will not be analyzed", schemaname, partition_name, tupletable) else: @@ -982,7 +981,7 @@ def get_oid_str(table_list): def regclass_schema_tbl(schema, tbl): schema_tbl = "%s.%s" % (escape_identifier(schema), escape_identifier(tbl)) - return "to_regclass('%s')" % (pg.escape_string(schema_tbl)) + return "to_regclass('%s')" % (escape_string(schema_tbl)) # Escape double-quotes in a string, so that the resulting string is suitable for @@ -1250,7 +1249,7 @@ def validate_tables(conn, tablenames): while curr_batch < nbatches: batch = tablenames[curr_batch * batch_size:(curr_batch + 1) * batch_size] - oid_str = ','.join(map((lambda x: "('%s')" % pg.escape_string(x)), batch)) + oid_str = ','.join(map((lambda x: "('%s')" % escape_string(x)), batch)) if not oid_str: break @@ -1266,7 +1265,7 @@ def get_include_cols_from_exclude(conn, schema, table, exclude_cols): """ Given a list of excluded columns of a table, get the list of included columns """ - quoted_exclude_cols = ','.join(["'%s'" % pg.escape_string(x) for x in exclude_cols]) + quoted_exclude_cols = ','.join(["'%s'" % escape_string(x) for x in exclude_cols]) oid_str = regclass_schema_tbl(schema, table) cols = run_sql(conn, GET_INCLUDED_COLUMNS_FROM_EXCLUDE_SQL % (oid_str, quoted_exclude_cols)) @@ -1282,7 +1281,7 @@ def validate_columns(conn, schema, table, column_list): return sql = VALIDATE_COLUMN_NAMES_SQL % (regclass_schema_tbl(schema, table), - ','.join(["'%s'" % pg.escape_string(x) for x in column_list])) + ','.join(["'%s'" % escape_string(x) for x in column_list])) valid_col_count = dbconn.querySingleton(conn, sql) if int(valid_col_count) != len(column_list): diff --git a/gpMgmt/bin/gpactivatestandby b/gpMgmt/bin/gpactivatestandby index 4c2069f0970..914d20120d0 100755 --- a/gpMgmt/bin/gpactivatestandby +++ b/gpMgmt/bin/gpactivatestandby @@ -21,10 +21,9 @@ import time import shutil import tempfile from datetime import datetime, timedelta - +import psycopg2 # import GPDB modules try: - import pg as pygresql from gppylib.commands import unix, gp, pg from gppylib.db import dbconn from gppylib.gpparseopts import OptParser, OptChecker, OptionGroup, SUPPRESS_HELP @@ -341,7 +340,7 @@ def promote_standby(coordinator_data_dir): dbconn.execSQL(conn, 'CHECKPOINT') conn.close() return True - except pygresql.InternalError as e: + except (psycopg2.InternalError, psycopg2.OperationalError) as e: pass time.sleep(1) diff --git a/gpMgmt/bin/gpcheckcat b/gpMgmt/bin/gpcheckcat index 00c2e4b21f3..9bb50d7feb1 100755 --- a/gpMgmt/bin/gpcheckcat +++ b/gpMgmt/bin/gpcheckcat @@ -28,23 +28,20 @@ import re import sys import time from functools import reduce - +import psycopg2 +from psycopg2 import extras +from contextlib import closing try: from gppylib import gplog - from gppylib.db import dbconn from gppylib.gpcatalog import * from gppylib.commands.unix import * from gppylib.commands.gp import conflict_with_gpexpand from gppylib.system.info import * - from pgdb import DatabaseError from gpcheckcat_modules.unique_index_violation_check import UniqueIndexViolationCheck from gpcheckcat_modules.leaked_schema_dropper import LeakedSchemaDropper from gpcheckcat_modules.repair import Repair from gpcheckcat_modules.foreign_key_check import ForeignKeyCheck from gpcheckcat_modules.orphaned_toast_tables_check import OrphanedToastTablesCheck - - import pg - except ImportError as e: sys.exit('Error: unable to import module: ' + str(e)) @@ -138,7 +135,7 @@ class Global(): self.dbname = None self.firstdb = None self.alldb = [] - self.db = {} + self.conn = {} self.tmpdir = None self.reset_stmt_queues() @@ -207,30 +204,27 @@ def usage(exitarg=None): ############################### def getversion(): - db = connect() - curs = db.query(''' - select regexp_replace(version(), - E'.*PostgreSQL [^ ]+ .Apache Cloudberry ([1-9]+.[0-9]+|main).*', - E'\\\\1') as ver;''') - - row = curs.getresult()[0] - version = row[0] - - logger.debug('got version %s' % version) - return version - + with closing(connect()) as conn: + with conn.cursor() as curs: + curs.execute(''' + select regexp_replace(version(), + E'.*PostgreSQL [^ ]+ .Greenplum Database ([1-9]+.[0-9]+|main).*', + E'\\\\1') as ver;''') + row = curs.fetchone() + version = row[0] + logger.debug('got version %s' % version) + return version ############################### def getalldbs(): """ get all connectable databases """ - db = connect() - curs = db.query(''' - select datname from pg_database where datallowconn order by datname ''') - row = curs.getresult() - return row - + with closing(connect()) as conn: + with conn.cursor() as curs: + curs.execute('''select datname from pg_database where datallowconn order by datname''') + row = curs.fetchall() + return row ############################### def parseCommandLine(): @@ -343,19 +337,21 @@ def connect(user=None, password=None, host=None, port=None, try: logger.debug('connecting to %s:%s %s' % (host, port, database)) - db = pg.connect(host=host, port=port, user=user, - passwd=password, dbname=database, opt=options) - - except pg.InternalError as ex: + conn = psycopg2.connect(host=host, port=port, user=user, + password=password, dbname=database, options=options) + ## Don't execute query in a transaction block. + conn.set_session(autocommit=True) + except (psycopg2.InternalError, psycopg2.OperationalError) as ex: logger.fatal('could not connect to %s: "%s"' % (database, str(ex).strip())) exit(1) logger.debug('connected with %s:%s %s' % (host, port, database)) - return db + return conn -############# +# NOTE: We cannot use connect2() with contextmanager, since we manage the connection +# ourselves. def connect2(cfgrec, user=None, password=None, database=None, utilityMode=True): host = cfgrec['address'] port = cfgrec['port'] @@ -367,22 +363,22 @@ def connect2(cfgrec, user=None, password=None, database=None, utilityMode=True): key = "%s.%s.%s.%s.%s.%s.%s" % (host, port, datadir, user, password, database, str(utilityMode)) - conns = GV.db.get(key) + conns = GV.conn.get(key) if conns: return conns[0] conn = connect(host=host, port=port, user=user, password=password, database=database, utilityMode=utilityMode) if conn: - GV.db[key] = [conn, cfgrec] + GV.conn[key] = [conn, cfgrec] return conn class execThread(Thread): - def __init__(self, cfg, db, qry): + def __init__(self, cfg, conn, qry): self.cfg = cfg - self.db = db + self.conn = conn self.qry = qry self.curs = None self.error = None @@ -390,11 +386,11 @@ class execThread(Thread): def run(self): try: - self.curs = self.db.query(self.qry) + self.curs = self.conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) + self.curs.execute(self.qry) except BaseException as e: self.error = e - def processThread(threads): batch = [] for th in threads: @@ -423,9 +419,9 @@ def connect2run(qry, col=None): # parallelise queries for dbid in GV.cfg: c = GV.cfg[dbid] - db = connect2(c) + conn = connect2(c) - thread = execThread(c, db, qry) + thread = execThread(c, conn, qry) thread.start() logger.debug('launching query thread %s for dbid %i' % (thread.name, dbid)) @@ -445,8 +441,8 @@ def connect2run(qry, col=None): err = [] for [cfg, curs] in batch: if col is None: - col = curs.listfields() - for row in curs.dictresult(): + col = [desc[0] for desc in curs.description] + for row in curs.fetchall(): err.append([cfg, col, row]) return err @@ -464,7 +460,6 @@ def formatErr(c, col, row): ############# def getGPConfiguration(): cfg = {} - db = connect() # note that in 4.0, sql commands cannot be run against the segment mirrors directly # so we filter out non-primary segment databases in the query qry = ''' @@ -474,13 +469,14 @@ def getGPConfiguration(): FROM gp_segment_configuration WHERE (role = 'p' or content < 0 ) ''' - curs = db.query(qry) - for row in curs.dictresult(): - if row['content'] == -1 and not row['isprimary']: - continue # skip standby coordinator - cfg[row['dbid']] = row - db.close() - return cfg + with closing(connect()) as conn: + with conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as curs: + curs.execute(qry) + for row in curs.fetchall(): + if row['content'] == -1 and not row['isprimary']: + continue # skip standby coordinator + cfg[row['dbid']] = row + return cfg def checkDistribPolicy(): logger.info('-----------------------------------') @@ -494,27 +490,27 @@ def checkDistribPolicy(): where pk.contype in('p', 'u') and d.policytype = 'p' and d.distkey = '' ''' - db = connect2(GV.cfg[GV.coordinator_dbid]) try: - curs = db.query(qry) - err = [] - for row in curs.dictresult(): - err.append([GV.cfg[GV.coordinator_dbid], ('nspname', 'relname', 'constraint'), row]) - - if not err: - logger.info('[OK] randomly distributed tables') - else: - GV.checkStatus = False - setError(ERROR_REMOVE) - logger.info('[FAIL] randomly distributed tables') - logger.error('pg_constraint has %d issue(s)' % len(err)) - logger.error(qry) - for e in err: - logger.error(formatErr(e[0], e[1], e[2])) - for e in err: - cons = e[2] - removeIndexConstraint(cons['nspname'], cons['relname'], - cons['constraint']) + conn = connect2(GV.cfg[GV.coordinator_dbid]) + with conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as curs: + curs.execute(qry) + err = [] + for row in curs.fetchall(): + err.append([GV.cfg[GV.coordinator_dbid], ('nspname', 'relname', 'constraint'), row]) + + if not err: + logger.info('[OK] randomly distributed tables') + else: + GV.checkStatus = False + setError(ERROR_REMOVE) + logger.info('[FAIL] randomly distributed tables') + logger.error('pg_constraint has %d issue(s)' % len(err)) + logger.error(qry) + for e in err: + logger.error(formatErr(e[0], e[1], e[2])) + cons = e[2] + removeIndexConstraint(cons['nspname'], cons['relname'], + cons['constraint']) except Exception as e: setError(ERROR_NOREPAIR) myprint('[ERROR] executing test: checkDistribPolicy') @@ -536,22 +532,23 @@ def checkDistribPolicy(): and not d.distkey::int2[] operator(pg_catalog.<@) pk.conkey ''' try: - curs = db.query(qry) - - err = [] - for row in curs.dictresult(): - err.append([GV.cfg[GV.coordinator_dbid], ('nspname', 'relname', 'constraint'), row]) - - if not err: - logger.info('[OK] unique constraints') - else: - GV.checkStatus = False - setError(ERROR_REMOVE) - logger.info('[FAIL] unique constraints') - logger.error('pg_constraint has %d issue(s)' % len(err)) - logger.error(qry) - for e in err: logger.error(formatErr(e[0], e[1], e[2])) + conn = connect2(GV.cfg[GV.coordinator_dbid]) + with conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as curs: + err = [] + curs.execute(qry) + for row in curs.fetchall(): + err.append([GV.cfg[GV.coordinator_dbid], ('nspname', 'relname', 'constraint'), row]) + + if not err: + logger.info('[OK] unique constraints') + else: + GV.checkStatus = False + setError(ERROR_REMOVE) + logger.info('[FAIL] unique constraints') + logger.error('pg_constraint has %d issue(s)' % len(err)) + logger.error(qry) for e in err: + logger.error(formatErr(e[0], e[1], e[2])) cons = e[2] removeIndexConstraint(cons['nspname'], cons['relname'], cons['constraint']) @@ -567,7 +564,6 @@ def checkPartitionIntegrity(): logger.info('-----------------------------------') logger.info('Checking pg_partition ...') err = [] - db = connect() # Check for the numsegments value of parent and child partition from the gp_distribution_policy table qry = ''' @@ -579,53 +575,55 @@ def checkPartitionIntegrity(): and not (inhrelid in (select ftrelid from pg_catalog.pg_foreign_table) and child.numsegments = NULL); ''' try: - curs = db.query(qry) - cols = ('inhparent', 'inhrelid', 'numsegments_parent', 'numsegments_child') - col_names = { - 'inhparent': 'table', - 'inhrelid': 'affected child', - 'numsegments_parent': 'parent numsegments value', - 'numsegments_child': 'child numsegments value', - } - - err = [] - for row in curs.dictresult(): - err.append([GV.cfg[GV.coordinator_dbid], cols, row]) - - if not err: - logger.info('[OK] partition numsegments check') - else: - err_count = len(err) - GV.checkStatus = False - setError(ERROR_REMOVE) - logger.info('[FAIL] partition numsegments check') - logger.error('partition numsegments check found %d issue(s)' % err_count) - if err_count > 100: - logger.error(qry) + with closing(connect()) as conn: + with conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as curs: + curs.execute(qry) + cols = ('inhparent', 'inhrelid', 'numsegments_parent', 'numsegments_child') + col_names = { + 'inhparent': 'table', + 'inhrelid': 'affected child', + 'numsegments_parent': 'parent numsegments value', + 'numsegments_child': 'child numsegments value', + } + + err = [] + for row in curs.fetchall(): + err.append([GV.cfg[GV.coordinator_dbid], cols, row]) + + if not err: + logger.info('[OK] partition numsegments check') + else: + err_count = len(err) + GV.checkStatus = False + setError(ERROR_REMOVE) + logger.info('[FAIL] partition numsegments check') + logger.error('partition numsegments check found %d issue(s)' % err_count) + if err_count > 100: + logger.error(qry) - myprint( - '[ERROR]: child partition(s) have different numsegments value ' - 'from the root partition. Check the gpcheckcat log for details.' - ) - logger.error('The following tables have different numsegments value (showing at most 100 rows):') + myprint( + '[ERROR]: child partition(s) have different numsegments value ' + 'from the root partition. Check the gpcheckcat log for details.' + ) + logger.error('The following tables have different numsegments value (showing at most 100 rows):') - # report at most 100 rows, for brevity - err = err[:100] + # report at most 100 rows, for brevity + err = err[:100] - for index, e in enumerate(err): - cfg = e[0] - col = e[1] - row = e[2] + for index, e in enumerate(err): + cfg = e[0] + col = e[1] + row = e[2] - if index == 0: - logger.error("--------") - logger.error(" " + " | ".join(map(col_names.get, col))) - logger.error(" " + "-+-".join(['-' * len(col_names[x]) for x in col])) + if index == 0: + logger.error("--------") + logger.error(" " + " | ".join(map(col_names.get, col))) + logger.error(" " + "-+-".join(['-' * len(col_names[x]) for x in col])) - logger.error(" " + " | ".join([str(row[x]) for x in col])) + logger.error(" " + " | ".join([str(row[x]) for x in col])) - if err_count > 100: - logger.error(" ...") + if err_count > 100: + logger.error(" ...") except Exception as e: setError(ERROR_NOREPAIR) @@ -648,74 +646,74 @@ def checkPartitionIntegrity(): and (select isleaf from pg_partition_tree(inhparent) where relid = inhrelid)); ''' try: - curs = db.query(qry) - cols = ('inhparent', 'inhrelid', 'dby_parent', 'dby_child') - col_names = { - 'inhparent': 'table', - 'inhrelid': 'affected child', - 'dby_parent': 'table distribution key', - 'dby_child': 'child distribution key', - } - - err = [] - for row in curs.dictresult(): - err.append([GV.cfg[GV.coordinator_dbid], cols, row]) - - if not err: - logger.info('[OK] partition distribution policy check') - else: - GV.checkStatus = False - setError(ERROR_REMOVE) - logger.info('[FAIL] partition distribution policy check') - logger.error('partition distribution policy check found %d issue(s)' % len(err)) - if len(err) > 100: - logger.error(qry) - - myprint( - '[ERROR]: child partition(s) are distributed differently from ' - 'the root partition, and must be manually redistributed, for ' - 'some tables. Check the gpcheckcat log for details.' - ) - logger.error('The following tables must be manually redistributed:') - - count = 0 - for e in err: - cfg = e[0] - col = e[1] - row = e[2] - - # TODO: generate a repair script for this row. This is - # difficult, since we can't redistribute child partitions - # directly. - - # report at most 100 rows, for brevity - if count == 100: - logger.error("...") - count += 1 - if count > 100: - continue - - if count == 0: - logger.error("--------") - logger.error(" " + " | ".join(map(col_names.get, col))) - logger.error(" " + "-+-".join(['-' * len(col_names[x]) for x in col])) - - logger.error(" " + " | ".join([str(row[x]) for x in col])) - count += 1 - - logger.error( - 'Execute an ALTER TABLE ... SET DISTRIBUTED BY statement, with ' - 'the desired distribution key, on the partition root for each ' - 'affected table.' - ) + with closing(connect()) as conn: + with conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as curs: + curs.execute(qry) + cols = ('inhparent', 'inhrelid', 'dby_parent', 'dby_child') + col_names = { + 'inhparent': 'table', + 'inhrelid': 'affected child', + 'dby_parent': 'table distribution key', + 'dby_child': 'child distribution key', + } + + err = [] + for row in curs.fetchall(): + err.append([GV.cfg[GV.coordinator_dbid], cols, row]) + + if not err: + logger.info('[OK] partition distribution policy check') + else: + GV.checkStatus = False + setError(ERROR_REMOVE) + logger.info('[FAIL] partition distribution policy check') + logger.error('partition distribution policy check found %d issue(s)' % len(err)) + if len(err) > 100: + logger.error(qry) + + myprint( + '[ERROR]: child partition(s) are distributed differently from ' + 'the root partition, and must be manually redistributed, for ' + 'some tables. Check the gpcheckcat log for details.' + ) + logger.error('The following tables must be manually redistributed:') + + count = 0 + for e in err: + cfg = e[0] + col = e[1] + row = e[2] + + # TODO: generate a repair script for this row. This is + # difficult, since we can't redistribute child partitions + # directly. + + # report at most 100 rows, for brevity + if count == 100: + logger.error("...") + count += 1 + if count > 100: + continue + + if count == 0: + logger.error("--------") + logger.error(" " + " | ".join(map(col_names.get, col))) + logger.error(" " + "-+-".join(['-' * len(col_names[x]) for x in col])) + + logger.error(" " + " | ".join([str(row[x]) for x in col])) + count += 1 + + logger.error( + 'Execute an ALTER TABLE ... SET DISTRIBUTED BY statement, with ' + 'the desired distribution key, on the partition root for each ' + 'affected table.' + ) except Exception as e: setError(ERROR_NOREPAIR) myprint('[ERROR] executing test: checkPartitionIntegrity') myprint(' Execution error: ' + str(e)) - db.close() - checkPoliciesRepair() ############# @@ -782,7 +780,7 @@ Produce repair scripts to remove dangling entries of gp_fastsequence: ''' -def removeFastSequence(db): +def removeFastSequence(conn): ''' MPP-14758: gp_fastsequence does not get cleanup after a failed transaction (AO/CO) Note: this is slightly different from the normal foreign key check @@ -808,14 +806,15 @@ def removeFastSequence(db): ON r.gp_segment_id = cfg.content WHERE cfg.role = 'p'; """ - curs = db.query(qry) - for row in curs.dictresult(): - seg = row['dbid'] # dbid of targeted segment - name = 'gp_fastsequence tuple' # for comment purposes - table = 'gp_fastsequence' # table name - cols = {'objid': row['objid']} # column name and value - objname = 'gp_fastsequence' # for comment purposes - buildRemove(seg, name, table, cols, objname) + with conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as curs: + curs.execute(qry) + for row in curs.fetchall(): + seg = row['dbid'] # dbid of targeted segment + name = 'gp_fastsequence tuple' # for comment purposes + table = 'gp_fastsequence' # table name + cols = {'objid': row['objid']} # column name and value + objname = 'gp_fastsequence' # for comment purposes + buildRemove(seg, name, table, cols, objname) except Exception as e: logger.error('removeFastSequence: ' + str(e)) @@ -877,42 +876,41 @@ def drop_leaked_schemas(leaked_schema_dropper, dbname): logger.info('-----------------------------------') logger.info('Checking for leaked temporary schemas') - db_connection = connect(database=dbname) try: - dropped_schemas = leaked_schema_dropper.drop_leaked_schemas(db_connection) - if not dropped_schemas: - logger.info('[OK] temporary schemas') - else: - logger.info('[FAIL] temporary schemas') - myprint("Found and dropped %d unbound temporary schemas" % len(dropped_schemas)) - logger.error('Dropped leaked schemas \'%s\' in the database \'%s\'' % (dropped_schemas, dbname)) + with closing(connect(database=dbname)) as conn: + dropped_schemas = leaked_schema_dropper.drop_leaked_schemas(conn) + if not dropped_schemas: + logger.info('[OK] temporary schemas') + else: + logger.info('[FAIL] temporary schemas') + myprint("Found and dropped %d unbound temporary schemas" % len(dropped_schemas)) + logger.error('Dropped leaked schemas \'%s\' in the database \'%s\'' % (dropped_schemas, dbname)) except Exception as e: setError(ERROR_NOREPAIR) myprint(' Execution error: ' + str(e)) - finally: - db_connection.close() def checkDepend(): # Check for dependencies on non-existent objects logger.info('-----------------------------------') logger.info('Checking Object Dependencies') - db = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) + conn = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) + with conn.cursor() as curs: - # Catalogs that link up to pg_depend/pg_shdepend - qry = """ - select relname from pg_class c - where relkind='r' - and relnamespace=%d - and exists (select 1 from pg_attribute a where attname = 'oid' and a.attrelid = c.oid) - """ % PG_CATALOG_OID - curs = db.query(qry) - catalogs = [] - for row in curs.getresult(): - catalogs.append(row[0]) - - checkDependJoinCatalog(catalogs) - checkCatalogJoinDepend(catalogs) + # Catalogs that link up to pg_depend/pg_shdepend + qry = """ + select relname from pg_class c + where relkind='r' + and relnamespace=%d + and exists (select 1 from pg_attribute a where attname = 'oid' and a.attrelid = c.oid) + """ % PG_CATALOG_OID + curs.execute(qry) + catalogs = [] + for row in curs.fetchall(): + catalogs.append(row[0]) + + checkDependJoinCatalog(catalogs) + checkCatalogJoinDepend(catalogs) def checkDependJoinCatalog(catalogs): # Construct subquery that will verify that all (classid, objid) @@ -1069,7 +1067,6 @@ def checkOwners(): # # - Between 3.3 and 4.0 the ao segment columns migrated from pg_class # to pg_appendonly. - db = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) qry = ''' select distinct n.nspname, coalesce(o.relname, c.relname) as relname, a.rolname, m.rolname as coordinator_rolname @@ -1086,20 +1083,21 @@ def checkOwners(): where c.relowner <> r.relowner ''' try: - curs = db.query(qry) - - rows = [] - for row in curs.dictresult(): - rows.append(row) - - if len(rows) == 0: - logger.info('[OK] table ownership') - else: - GV.checkStatus = False - setError(ERROR_REMOVE) - logger.info('[FAIL] table ownership') - logger.error('found %d table ownership issue(s)' % len(rows)) - logger.error('%s' % qry) + conn = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) + with conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as curs: + curs.execute(qry) + rows = [] + for row in curs.fetchall(): + rows.append(row) + + if len(rows) == 0: + logger.info('[OK] table ownership') + else: + GV.checkStatus = False + setError(ERROR_REMOVE) + logger.info('[FAIL] table ownership') + logger.error('found %d table ownership issue(s)' % len(rows)) + logger.error('%s' % qry) for row in rows[0:100]: logger.error(' %s.%s relowner %s != %s' % (row['nspname'], row['relname'], row['rolname'], @@ -1123,7 +1121,6 @@ def checkOwners(): # - Ignore implementation types of pg_class entries - they should be # in the check above since ALTER TABLE is required to fix them, not # ALTER TYPE. - db = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) qry = ''' select distinct n.nspname, t.typname, a.rolname, m.rolname as coordinator_rolname from gp_dist_random('pg_type') r @@ -1134,27 +1131,28 @@ def checkOwners(): where r.typowner <> t.typowner ''' try: - curs = db.query(qry) + conn = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) + with conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as curs: + curs.execute(qry) - rows = [] - for row in curs.dictresult(): - rows.append(row) + rows = [] + for row in curs.fetchall(): + rows.append(row) - if len(rows) == 0: - logger.info('[OK] type ownership') - else: - GV.checkStatus = False - setError(ERROR_NOREPAIR) - logger.info('[FAIL] type ownership') - logger.error('found %d type ownership issue(s)' % len(rows)) - logger.error('%s' % qry) + if len(rows) == 0: + logger.info('[OK] type ownership') + else: + GV.checkStatus = False + setError(ERROR_NOREPAIR) + logger.info('[FAIL] type ownership') + logger.error('found %d type ownership issue(s)' % len(rows)) + logger.error('%s' % qry) for row in rows[0:100]: logger.error(' %s.%s typeowner %s != %s' % (row['nspname'], row['typname'], row['rolname'], row['coordinator_rolname'])) if len(rows) > 100: logger.error("...") - except Exception as e: setError(ERROR_NOREPAIR) myprint("[ERROR] executing test: check type ownership") @@ -1178,15 +1176,14 @@ def checkOwners(): def closeDbs(): - for key, conns in GV.db.items(): - db = conns[0] - db.close() - GV.db = {} # remove everything + for key, conns in GV.conn.items(): + conn = conns[0] + conn.close() + GV.conn = {} # remove everything # ------------------------------------------------------------------------------- def getCatObj(namestr): - db = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) try: cat = GV.catalog.getCatalogTable(namestr) except Exception as e: @@ -1256,25 +1253,25 @@ def checkTableACL(cat): # Execute the query try: - db = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) - curs = db.query(qry) - nrows = curs.ntuples() - - if nrows == 0: - logger.info('[OK] Cross consistency acl check for ' + catname) - else: - GV.checkStatus = False - setError(ERROR_NOREPAIR) - GV.aclStatus = False - logger.info('[FAIL] Cross consistency acl check for ' + catname) - logger.error(' %s acl check has %d issue(s)' % (catname, nrows)) - - fields = curs.listfields() - gplog.log_literal(logger, logging.ERROR, " " + " | ".join(fields)) - for row in curs.getresult(): - gplog.log_literal(logger, logging.ERROR, " " + " | ".join(map(str, row))) - processACLResult(catname, fields, curs.getresult()) + conn = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) + with conn.cursor() as curs: + curs = db.execute(qry) + nrows = curs.rowcount + if nrows == 0: + logger.info('[OK] Cross consistency acl check for ' + catname) + else: + GV.checkStatus = False + setError(ERROR_NOREPAIR) + GV.aclStatus = False + logger.info('[FAIL] Cross consistency acl check for ' + catname) + logger.error(' %s acl check has %d issue(s)' % (catname, nrows)) + + fields = [desc[0] for desc in curs.description] + gplog.log_literal(logger, logging.ERROR, " " + " | ".join(fields)) + for row in curs.getresult(): + gplog.log_literal(logger, logging.ERROR, " " + " | ".join(map(str, row))) + processACLResult(catname, fields, curs.getresult()) except Exception as e: setError(ERROR_NOREPAIR) GV.aclStatus = False @@ -1295,9 +1292,9 @@ def checkForeignKey(cat_tables=None): if not cat_tables: cat_tables = GV.catalog.getCatalogTables() - db_connection = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) + conn = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) try: - foreign_key_check = ForeignKeyCheck(db_connection, logger, GV.opt['-S'], autoCast) + foreign_key_check = ForeignKeyCheck(conn, logger, GV.opt['-S'], autoCast) foreign_key_issues = foreign_key_check.runCheck(cat_tables) if foreign_key_issues: GV.checkStatus = False @@ -1307,13 +1304,14 @@ def checkForeignKey(cat_tables=None): processForeignKeyResult(catname, pkcatname, fields, results) if catname == 'gp_fastsequence' and pkcatname == 'pg_class': setError(ERROR_REMOVE) - removeFastSequence(db_connection) + removeFastSequence(conn) else: setError(ERROR_NOREPAIR) except Exception as ex: setError(ERROR_NOREPAIR) GV.foreignKeyStatus = False myprint(' Execution error: ' + str(ex)) + # ------------------------------------------------------------------------------- @@ -1391,40 +1389,39 @@ def checkTableMissingEntry(cat): # Execute the query try: - db = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) - curs = db.query(qry) - nrows = curs.ntuples() - results = curs.getresult() - fields = curs.listfields() - - if nrows != 0: - results = filterSpuriousFailures(catname, fields, results) - nrows = len(results) - - if nrows == 0: - logger.info('[OK] Checking for missing or extraneous entries for ' + catname) - else: - if catname in ['pg_constraint']: - logger_with_level = logger.warning - log_level = logging.WARNING + conn = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) + with conn.cursor() as curs: + curs.execute(qry) + nrows = curs.rowcount + results = curs.fetchall() + fields = [desc[0] for desc in curs.description] + + if nrows != 0: + results = filterSpuriousFailures(catname, fields, results) + nrows = len(results) + + if nrows == 0: + logger.info('[OK] Checking for missing or extraneous entries for ' + catname) else: - GV.checkStatus = False - GV.missingEntryStatus = False - logger_with_level = logger.error - log_level = logging.ERROR - - logger.info(('[%s] Checking for missing or extraneous entries for ' + catname) % - ('WARNING' if log_level == logging.WARNING else 'FAIL')) - logger_with_level(' %s has %d issue(s)' % (catname, nrows)) - gplog.log_literal(logger, log_level, " " + " | ".join(fields)) + if catname in ['pg_constraint']: + logger_with_level = logger.warning + log_level = logging.WARNING + else: + GV.checkStatus = False + GV.missingEntryStatus = False + logger_with_level = logger.error + log_level = logging.ERROR + + logger.info(('[%s] Checking for missing or extraneous entries for ' + catname) % + ('WARNING' if log_level == logging.WARNING else 'FAIL')) + logger_with_level(' %s has %d issue(s)' % (catname, nrows)) + gplog.log_literal(logger, log_level, " " + " | ".join(fields)) for row in results: gplog.log_literal(logger, log_level, " " + " | ".join(map(str, row))) processMissingDuplicateEntryResult(catname, fields, results, "missing") if catname == 'pg_type': generateVerifyFile(catname, fields, results, 'missing_extraneous') - return results - except Exception as e: setError(ERROR_NOREPAIR) GV.missingEntryStatus = False @@ -1434,8 +1431,8 @@ def checkTableMissingEntry(cat): class checkAOSegVpinfoThread(execThread): - def __init__(self, cfg, db): - execThread.__init__(self, cfg, db, None) + def __init__(self, cfg, conn): + execThread.__init__(self, cfg, conn, None) def run(self): aoseg_query = """ @@ -1447,9 +1444,10 @@ class checkAOSegVpinfoThread(execThread): try: # Read the list of aoseg tables from the database - curs = self.db.query(aoseg_query) + curs = self.conn.cursor() + curs.execute(aoseg_query) - for relname, relid, segrelid, segrelname, attr_count in curs.getresult(): + for relname, relid, segrelid, segrelname, attr_count in curs.fetchall(): # We check vpinfo consistency only for segs that are in state # AOSEG_STATE_DEFAULT and which are not RESERVED_SEGNO. # RESERVED_SEGNO can have a different number of attributes than @@ -1459,8 +1457,8 @@ class checkAOSegVpinfoThread(execThread): # The vpinfo for RESERVED_SEGNO will have more columns than # relnatts in that case. qry = "SELECT distinct(length(vpinfo)) FROM pg_aoseg.%s where state = 1 and segno <> 0;" % (segrelname) - vpinfo_curs = self.db.query(qry) - nrows = vpinfo_curs.ntuples() + curs.execute(qry) + nrows = curs.rowcount if nrows == 0: continue elif nrows > 1: @@ -1475,7 +1473,7 @@ class checkAOSegVpinfoThread(execThread): logger.error(qry) continue - vpinfo_length = vpinfo_curs.getresult()[0][0] + vpinfo_length = curs.fetchone()[0] # vpinfo is bytea type, the length of the first 3 fields is 12 bytes, and the size of AOCSVPInfoEntry is 16 # typedef struct AOCSVPInfo @@ -1508,8 +1506,85 @@ def checkAOSegVpinfo(): # parallelise check for dbid in GV.cfg: cfg = GV.cfg[dbid] - db_connection = connect2(cfg) - thread = checkAOSegVpinfoThread(cfg, db_connection) + conn = connect2(cfg) + thread = checkAOSegVpinfoThread(cfg, conn) + thread.start() + logger.debug('launching check thread %s for dbid %i' % + (thread.name, dbid)) + threads.append(thread) + + if (i % GV.opt['-B']) == 0: + processThread(threads) + threads = [] + + i += 1 + + processThread(threads) + +class checkAOLastrownumThread(execThread): + def __init__(self, cfg, conn): + execThread.__init__(self, cfg, conn, None) + + # pg_attribute_encoding.lastrownums[segno], if exists, should have a corresponding entry in gp_fastsequence with + # an objid same as segno. And the value of pg_attribute_encoding.lastrownums[segno] should fall in the range of + # [0, {last_sequence}] where {last_sequence} is the current gp_fastsequence value with the corresponding objid. + # Note that objmod starts from 0 but the array index starts from 1. + def run(self): + aolastrownum_query = """ + SELECT + c.relname, + ao.relid, + ae.attnum, + ae.lastrownums, + f.objmod, + f.last_sequence, + ae.lastrownums[f.objmod + 1] AS lastrownum + FROM + pg_attribute_encoding ae + JOIN pg_appendonly ao ON ae.attrelid = ao.relid + LEFT JOIN gp_fastsequence f ON ao.segrelid = f.objid + JOIN pg_class c ON ao.relid = c.oid + WHERE + f.last_sequence IS NULL + OR f.last_sequence < ae.lastrownums[f.objmod + 1] + OR ae.lastrownums[f.objmod + 1] < 0; + """ + + try: + # Execute the query + curs = self.conn.cursor() + curs.execute(aolastrownum_query) + nrows = curs.rowcount + + if nrows == 0: + logger.info('[OK] AO lastrownums check for pg_attribute_encoding') + else: + GV.checkStatus = False + # we could not fix this issue automatically + setError(ERROR_NOREPAIR) + logger.info('[FAIL] AO lastrownums check for pg_attribute_encoding') + for relname, relid, attnum, lastrownums, objmod, last_sequence, last_rownum in curs.fetchall(): + logger.error(" found inconsistent last_rownum {rownum} with last_sequence {seqnum} of aoseg {segno} for table '{relname}' attribute {attnum} on segment {content}" + .format(rownum = last_rownum, + seqnum = last_sequence, + segno = objmod, + relname = relname, + attnum = attnum, + content = self.cfg['content'])) + + except Exception as e: + GV.checkStatus = False + self.error = e + +# for test "ao_lastrownums" +def checkAOLastrownums(): + threads = [] + i = 1 + # parallelise check + for dbid in GV.cfg: + cfg = GV.cfg[dbid] + conn = connect2(cfg) + thread = checkAOLastrownumThread(cfg, conn) thread.start() logger.debug('launching check thread %s for dbid %i' % (thread.name, dbid)) @@ -1663,9 +1738,10 @@ def checkTableInconsistentEntry(cat): # Execute the query try: - db = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) - curs = db.query(qry) - nrows = curs.ntuples() + conn = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) + curs = conn.cursor() + curs.execute(qry) + nrows = curs.rowcount if nrows == 0: logger.info('[OK] Checking for inconsistent entries for ' + catname) @@ -1676,16 +1752,14 @@ def checkTableInconsistentEntry(cat): logger.info('[FAIL] Checking for inconsistent entries for ' + catname) logger.error(' %s has %d issue(s)' % (catname, nrows)) - fields = curs.listfields() + fields = [desc[0] for desc in curs.description] gplog.log_literal(logger, logging.ERROR, " " + " | ".join(fields)) - for row in curs.getresult(): + results = curs.fetchall() + for row in results: gplog.log_literal(logger, logging.ERROR, " " + " | ".join(map(str, row))) - results = curs.getresult() processInconsistentEntryResult(catname, pkey, fields, results) if catname == 'pg_type': generateVerifyFile(catname, fields, results, 'duplicate') - - except Exception as e: setError(ERROR_NOREPAIR) GV.inconsistentEntryStatus = False @@ -1799,9 +1873,10 @@ def checkTableDuplicateEntry(cat): # Execute the query try: - db = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) - curs = db.query(qry) - nrows = curs.ntuples() + conn = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) + curs = conn.cursor() + curs.execute(qry) + nrows = curs.rowcount if nrows == 0: logger.info('[OK] Checking for duplicate entries for ' + catname) @@ -1813,7 +1888,7 @@ def checkTableDuplicateEntry(cat): fields = curs.listfields() gplog.log_literal(logger, logging.ERROR, " " + " | ".join(fields)) - results = curs.getresult() + results = curs.fetchall() for row in results: gplog.log_literal(logger, logging.ERROR, " " + " | ".join(map(str, row))) processMissingDuplicateEntryResult(catname, fields, results, "duplicate") @@ -1862,9 +1937,9 @@ def duplicateEntryQuery(catname, pkey): def checkUniqueIndexViolation(): logger.info('-----------------------------------') logger.info('Performing check: checking for violated unique indexes') - db_connection = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) + conn = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) - violations = UniqueIndexViolationCheck().runCheck(db_connection) + violations = UniqueIndexViolationCheck().runCheck(conn) checkname = 'unique index violation(s)' if violations: @@ -1901,9 +1976,9 @@ def checkOrphanedToastTables(): logger.info('-----------------------------------') logger.info('Performing check: checking for orphaned TOAST tables') - db_connection = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) + conn = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) checker = OrphanedToastTablesCheck() - check_passed = checker.runCheck(db_connection) + check_passed = checker.runCheck(conn) checkname = 'orphaned toast table(s)' if check_passed: @@ -2424,12 +2499,14 @@ def getOidFromPK(catname, pkeys): pkeystr=pkeystr) try: - db = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) - curs = db.query(qry) - if (len(curs.dictresult()) == 0): + conn = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) + curs = conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) + curs.execute(qry) + results = curs.fetchall() + if (len(results) == 0): raise QueryException("No such entry '%s' in %s" % (pkeystr, catname)) - return curs.dictresult().pop()['oid'] + return results.pop()['oid'] except Exception as e: setError(ERROR_NOREPAIR) @@ -2441,10 +2518,11 @@ def getOidFromPK(catname, pkeys): def getClassOidForRelfilenode(relfilenode): qry = "SELECT oid FROM pg_class WHERE relfilenode = %d;" % (relfilenode) try: - dburl = dbconn.DbURL(hostname=GV.opt['-h'], port=GV.opt['-p'], dbname=GV.dbname) - conn = dbconn.connect(dburl) - oid = dbconn.queryRow(conn, qry)[0] - return oid + with closing(connect()) as conn: + with conn.cursor() as curs: + curs.execute(qry) + oid = curs.fetchone()[0] + return oid except Exception as e: setError(ERROR_NOREPAIR) myprint(' Execution error: ' + str(e)) @@ -2464,10 +2542,12 @@ def getResourceTypeOid(oid): """ % (oid, oid) try: - db = connect() - curs = db.query(qry) - if len(curs.dictresult()) == 0: return 0 - return curs.dictresult().pop()['oid'] + with closing(connect()) as conn: + with conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as curs: + curs.execute(qry) + results = curs.fetchall() + if len(results) == 0: return 0 + return results.pop()['oid'] except Exception as e: setError(ERROR_NOREPAIR) myprint(' Execution error: ' + str(e)) @@ -3062,7 +3142,7 @@ class GPObject: # Collect all tables with missing issues for later reporting if len(self.missingIssues): - db = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) + conn = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) oid_query = "select (select nspname from pg_namespace where oid=relnamespace) || '.' || relname from pg_class where oid=%d" type_query = "select (select nspname from pg_namespace where oid=relnamespace) || '.' || relname from pg_class where reltype=%d" for issues in self.missingIssues.values() : @@ -3070,19 +3150,23 @@ class GPObject: # Get schemaname.tablename corresponding to oid for key in issue.pkeys: if 'relid' in key or key in ['ev_class', 'reloid']: - table_list = db.query(oid_query % issue.pkeys[key]).getresult() + curs = conn.cursor() + curs.execute(oid_query % issue.pkeys[key]) + table_list = curs.fetchone() if table_list: if issue.type == 'missing': - GV.missing_attr_tables.append( (table_list[0][0], issue.segids) ) + GV.missing_attr_tables.append( (table_list[0], issue.segids) ) else: - GV.extra_attr_tables.append( (table_list[0][0], issue.segids) ) + GV.extra_attr_tables.append( (table_list[0], issue.segids) ) elif key == 'oid': - table_list = db.query(type_query % issue.pkeys[key]).getresult() + curs = conn.cursor() + curs.execute(type_query % issue.pkeys[key]) + table_list = curs.fetchone() if table_list: if issue.type == 'missing': - GV.missing_attr_tables.append( (table_list[0][0], issue.segids) ) + GV.missing_attr_tables.append( (table_list[0], issue.segids) ) else: - GV.extra_attr_tables.append( (table_list[0][0], issue.segids) ) + GV.extra_attr_tables.append( (table_list[0], issue.segids) ) def __cmp__(self, other): @@ -3231,9 +3315,11 @@ def getRelInfo(objects): """.format(oids=','.join(map(str, oids))) try: - db = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) - curs = db.query(qry) - for row in curs.getresult(): + conn = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) + curs = conn.cursor() + curs.execute(qry) + results = curs.fetchall() + for row in results: (oid, relname, nspname, relkind, paroid) = row objects[oid, 'pg_class'].setRelInfo(relname, nspname, relkind, paroid) diff --git a/gpMgmt/bin/gpcheckcat_modules/foreign_key_check.py b/gpMgmt/bin/gpcheckcat_modules/foreign_key_check.py index ad4c1543fae..5ac49972110 100644 --- a/gpMgmt/bin/gpcheckcat_modules/foreign_key_check.py +++ b/gpMgmt/bin/gpcheckcat_modules/foreign_key_check.py @@ -2,6 +2,7 @@ from gppylib.gplog import * from gppylib.gpcatalog import * +from contextlib import closing import re class ForeignKeyCheck: @@ -105,25 +106,25 @@ def checkTableForeignKey(self, cat): def _validate_relation(self, catname, fkeystr, pkcatname, pkeystr, qry): issue_list = [] try: - curs = self.db_connection.query(qry) - nrows = curs.ntuples() - - if nrows == 0: - self.logger.info('[OK] Foreign key check for %s(%s) referencing %s(%s)' % - (catname, fkeystr, pkcatname, pkeystr)) - else: - self.logger.info('[FAIL] Foreign key check for %s(%s) referencing %s(%s)' % - (catname, fkeystr, pkcatname, pkeystr)) - self.logger.error(' %s has %d issue(s): entry has NULL reference of %s(%s)' % - (catname, nrows, pkcatname, pkeystr)) - - fields = curs.listfields() - log_literal(self.logger, logging.ERROR, " " + " | ".join(fields)) - for row in curs.getresult(): - log_literal(self.logger, logging.ERROR, " " + " | ".join(map(str, row))) - results = curs.getresult() - issue_list.append((pkcatname, fields, results)) - + with closing(self.db_connection.cursor()) as curs: + curs.execute(qry) + nrows = curs.rowcount + + if nrows == 0: + self.logger.info('[OK] Foreign key check for %s(%s) referencing %s(%s)' % + (catname, fkeystr, pkcatname, pkeystr)) + else: + self.logger.info('[FAIL] Foreign key check for %s(%s) referencing %s(%s)' % + (catname, fkeystr, pkcatname, pkeystr)) + self.logger.error(' %s has %d issue(s): entry has NULL reference of %s(%s)' % + (catname, nrows, pkcatname, pkeystr)) + + fields = [desc[0] for desc in curs.description] + log_literal(self.logger, logging.ERROR, " " + " | ".join(fields)) + results = curs.fetchall() + for row in results: + log_literal(self.logger, logging.ERROR, " " + " | ".join(map(str, row))) + issue_list.append((pkcatname, fields, results)) except Exception as e: err_msg = '[ERROR] executing: Foreign key check for catalog table {0}. Query : \n {1}\n'.format(catname, qry) err_msg += str(e) diff --git a/gpMgmt/bin/gpcheckcat_modules/leaked_schema_dropper.py b/gpMgmt/bin/gpcheckcat_modules/leaked_schema_dropper.py index 87e55a5cf7b..dc7cfacb32f 100644 --- a/gpMgmt/bin/gpcheckcat_modules/leaked_schema_dropper.py +++ b/gpMgmt/bin/gpcheckcat_modules/leaked_schema_dropper.py @@ -35,16 +35,19 @@ class LeakedSchemaDropper: """ def __get_leaked_schemas(self, db_connection): - leaked_schemas = db_connection.query(self.leaked_schema_query) + with db_connection.cursor() as curs: + curs.execute(self.leaked_schema_query) + leaked_schemas = curs.fetchall() - if not leaked_schemas: - return [] + if not leaked_schemas: + return [] - return [row[0] for row in leaked_schemas.getresult() if row[0]] + return [row[0] for row in leaked_schemas if row[0]] def drop_leaked_schemas(self, db_connection): leaked_schemas = self.__get_leaked_schemas(db_connection) for leaked_schema in leaked_schemas: escaped_schema_name = escapeDoubleQuoteInSQLString(leaked_schema) - db_connection.query('DROP SCHEMA IF EXISTS %s CASCADE;' % (escaped_schema_name)) + with db_connection.cursor() as curs: + curs.execute('DROP SCHEMA IF EXISTS %s CASCADE;' % (escaped_schema_name)) return leaked_schemas diff --git a/gpMgmt/bin/gpcheckcat_modules/orphaned_toast_tables_check.py b/gpMgmt/bin/gpcheckcat_modules/orphaned_toast_tables_check.py index 21ec8d18047..a76ef560867 100644 --- a/gpMgmt/bin/gpcheckcat_modules/orphaned_toast_tables_check.py +++ b/gpMgmt/bin/gpcheckcat_modules/orphaned_toast_tables_check.py @@ -4,6 +4,8 @@ from collections import namedtuple from gpcheckcat_modules.orphan_toast_table_issues import OrphanToastTableIssue, DoubleOrphanToastTableIssue, ReferenceOrphanToastTableIssue, DependencyOrphanToastTableIssue, MismatchOrphanToastTableIssue +import psycopg2 +from psycopg2 import extras OrphanedTable = namedtuple('OrphanedTable', 'oid catname') @@ -117,8 +119,10 @@ def __init__(self): """ def runCheck(self, db_connection): - orphaned_toast_tables = db_connection.query(self.orphaned_toast_tables_query).dictresult() - if len(orphaned_toast_tables) == 0: + curs = db_connection.cursor(cursor_factory=psycopg2.extras.DictCursor) + curs.execute(self.orphaned_toast_tables_query) + orphaned_toast_tables = curs.fetchall() + if curs.rowcount == 0: return True for row in orphaned_toast_tables: diff --git a/gpMgmt/bin/gpcheckcat_modules/unique_index_violation_check.py b/gpMgmt/bin/gpcheckcat_modules/unique_index_violation_check.py index 47999f5c59c..6778401f31a 100644 --- a/gpMgmt/bin/gpcheckcat_modules/unique_index_violation_check.py +++ b/gpMgmt/bin/gpcheckcat_modules/unique_index_violation_check.py @@ -34,22 +34,24 @@ def __init__(self): ) as violations """ - def runCheck(self, db_connection): - unique_indexes = db_connection.query(self.unique_indexes_query).getresult() - violations = [] + def runCheck(self, conn): + with conn.cursor() as cur: + cur.execute(self.unique_indexes_query) + unique_indexes = cur.fetchall() + violations = [] - for (table_oid, index_name, table_name, column_names) in unique_indexes: - column_names = ",".join(column_names) - sql = self.get_violated_segments_query(table_name, column_names) - violated_segments = db_connection.query(sql).getresult() - if violated_segments: - violations.append(dict(table_oid=table_oid, - table_name=table_name, - index_name=index_name, - column_names=column_names, - violated_segments=[row[0] for row in violated_segments])) - - return violations + for (table_oid, index_name, table_name, column_names) in unique_indexes: + column_names = ",".join(column_names) + sql = self.get_violated_segments_query(table_name, column_names) + cur.execute(sql) + violated_segments = cur.fetchall() + if violated_segments: + violations.append(dict(table_oid=table_oid, + table_name=table_name, + index_name=index_name, + column_names=column_names, + violated_segments=[row[0] for row in violated_segments])) + return violations def get_violated_segments_query(self, table_name, column_names): return self.violated_segments_query % ( diff --git a/gpMgmt/bin/gpconfig b/gpMgmt/bin/gpconfig index 7bd3023ea85..464e9d79440 100755 --- a/gpMgmt/bin/gpconfig +++ b/gpMgmt/bin/gpconfig @@ -15,7 +15,7 @@ import os import sys import re - +from psycopg2 import DatabaseError try: from gppylib.gpparseopts import OptParser, OptChecker from gppylib.gparray import GpArray @@ -25,7 +25,6 @@ try: from gppylib.commands.gp import * from gppylib.db import dbconn from gppylib.userinput import * - from pg import DatabaseError from gpconfig_modules.segment_guc import SegmentGuc from gpconfig_modules.database_segment_guc import DatabaseSegmentGuc from gpconfig_modules.file_segment_guc import FileSegmentGuc diff --git a/gpMgmt/bin/gpexpand b/gpMgmt/bin/gpexpand index 562fad58213..57cd6618773 100755 --- a/gpMgmt/bin/gpexpand +++ b/gpMgmt/bin/gpexpand @@ -17,10 +17,10 @@ import signal import traceback from collections import defaultdict from time import strftime, sleep - +import psycopg2 +from psycopg2 import DatabaseError, OperationalError +from psycopg2 import extras try: - import pg, pgdb - from gppylib.commands.unix import * from gppylib.commands.gp import * from gppylib.gparray import GpArray, MODE_NOT_SYNC, STATUS_DOWN @@ -32,9 +32,7 @@ try: from gppylib.operations.startSegments import MIRROR_MODE_MIRRORLESS from gppylib.system import configurationInterface, configurationImplGpdb from gppylib.system.environment import GpCoordinatorEnvironment - from pgdb import DatabaseError - from gppylib.gpcatalog import COORDINATOR_ONLY_TABLES_MAPPED - from gppylib.gpcatalog import COORDINATOR_ONLY_TABLES_NON_MAPPED + from gppylib.gpcatalog import COORDINATOR_ONLY_TABLES from gppylib.operations.package import SyncPackages from gppylib.operations.utils import ParallelOperation from gppylib.parseutils import line_reader, check_values, canonicalize_address @@ -1864,7 +1862,7 @@ WHERE expansionStopped) dbconn.execSQL(self.conn, sql) self.conn.close() - except pgdb.OperationalError: + except OperationalError: pass except Exception: # schema doesn't exist. Cancel or error during setup @@ -1916,7 +1914,7 @@ WHERE def connect_database(self, dbname): test_url = copy.deepcopy(self.dburl) test_url.pgdb = dbname - c = dbconn.connect(test_url, encoding='UTF8', allowSystemTableMods=True) + c = dbconn.connect(test_url, encoding='UTF8', allowSystemTableMods=True, cursorFactory=psycopg2.extras.NamedTupleCursor) return c def sync_packages(self): @@ -2157,7 +2155,7 @@ class ExpandCommand(SQLCommand): try: status_conn = dbconn.connect(self.status_url, encoding='UTF8') - table_conn = dbconn.connect(self.table_url, encoding='UTF8') + table_conn = dbconn.connect(self.table_url, encoding='UTF8', cursorFactory=psycopg2.extras.NamedTupleCursor) except DatabaseError as ex: if self.options.verbose: logger.exception(ex) diff --git a/gpMgmt/bin/gpload.py b/gpMgmt/bin/gpload.py index 4b0afc8890c..39abc206db4 100755 --- a/gpMgmt/bin/gpload.py +++ b/gpMgmt/bin/gpload.py @@ -37,13 +37,6 @@ import platform import psycopg2 from psycopg2 import extras - -def Escape(query_str): - return psycopg2.extensions.QuotedString(query_str).getquoted()[1:-1].decode() - -def escape_string(string): - return Escape(string) - import hashlib import datetime,getpass,os,signal,socket,threading,time,traceback,re import subprocess @@ -555,6 +548,8 @@ def is_keyword(tab): else: return False +def escape_string(string): + return psycopg2.extensions.QuotedString(string).getquoted()[1:-1].decode() def caseInsensitiveDictLookup(key, dictionary): """ diff --git a/gpMgmt/bin/gpmovemirrors b/gpMgmt/bin/gpmovemirrors index 7220a0f897e..cd78c3b2771 100755 --- a/gpMgmt/bin/gpmovemirrors +++ b/gpMgmt/bin/gpmovemirrors @@ -10,10 +10,8 @@ import os import sys import signal import itertools - +from psycopg2 import DatabaseError try: - import pg - from gppylib.commands.unix import * from gppylib.commands.gp import * from gppylib.commands.pg import PgControlData @@ -23,7 +21,6 @@ try: from gppylib.db import dbconn from gppylib.userinput import * from gppylib.operations.startSegments import * - from pgdb import DatabaseError from gppylib import gparray, gplog, pgconf, userinput, utils from gppylib.parseutils import line_reader, check_values, canonicalize_address from gppylib.operations.segment_tablespace_locations import get_tablespace_locations diff --git a/gpMgmt/bin/gppylib/commands/base.py b/gpMgmt/bin/gppylib/commands/base.py index 98481425071..35f2bf4e4f1 100755 --- a/gpMgmt/bin/gppylib/commands/base.py +++ b/gpMgmt/bin/gppylib/commands/base.py @@ -29,7 +29,6 @@ from gppylib import gplog from gppylib import gpsubprocess -from pg import DB logger = gplog.get_default_logger() @@ -637,8 +636,7 @@ def cancel(self): # if self.conn is not set we cannot cancel. if self.cancel_conn: - DB(self.cancel_conn).cancel() - + self.cancel_conn.cancel() class CommandNotFoundException(Exception): def __init__(self, cmd, paths): diff --git a/gpMgmt/bin/gppylib/commands/pg.py b/gpMgmt/bin/gppylib/commands/pg.py index a2af133c28f..8ae45dbccfa 100644 --- a/gpMgmt/bin/gppylib/commands/pg.py +++ b/gpMgmt/bin/gppylib/commands/pg.py @@ -12,6 +12,7 @@ from .unix import * from gppylib.commands.base import * from gppylib.commands.gp import RECOVERY_REWIND_APPNAME +from psycopg2 import DatabaseError logger = get_default_logger() diff --git a/gpMgmt/bin/gppylib/commands/test/unit/test_unit_pg_base_backup.py b/gpMgmt/bin/gppylib/commands/test/unit/test_unit_pg_base_backup.py index 117f62b41ea..3ff231a4a92 100644 --- a/gpMgmt/bin/gppylib/commands/test/unit/test_unit_pg_base_backup.py +++ b/gpMgmt/bin/gppylib/commands/test/unit/test_unit_pg_base_backup.py @@ -1,6 +1,119 @@ import unittest from gppylib.commands import pg +from test.unit.gp_unittest import GpTestCase, run_tests +from psycopg2 import DatabaseError +from gppylib.test.unit.gp_unittest import GpTestCase +from gppylib.commands.base import CommandResult + +class TestUnitPgReplicationSlot(GpTestCase): + def setUp(self): + mock_logger = Mock(spec=['log', 'warn', 'info', 'debug', 'error', 'warning', 'fatal']) + self.replication_slot_name = "internal_wal_replication_slot" + self.source_host = "bar" + self.source_port = 1234 + + self.pg_replication_slot = pg.PgReplicationSlot( + self.source_host, + self.source_port, + self.replication_slot_name, + ) + self.apply_patches([ + patch('gppylib.commands.pg.logger', return_value=mock_logger), + patch('gppylib.db.dbconn.DbURL', return_value=Mock()) + ]) + + self.mock_logger = self.get_mock_from_apply_patch('logger') + + @patch('gppylib.db.dbconn.connect', side_effect=Exception()) + def test_slot_exist_conn_exception(self, mock1): + + with self.assertRaises(Exception) as ex: + self.pg_replication_slot.slot_exists() + + self.assertEqual(1, self.mock_logger.debug.call_count) + self.assertEqual([call('Checking if slot internal_wal_replication_slot exists for host:bar, port:1234')], + self.mock_logger.debug.call_args_list) + self.assertTrue('Failed to query pg_replication_slots for' in str(ex.exception)) + + @patch('gppylib.db.dbconn.connect', autospec=True) + @patch('gppylib.db.dbconn.querySingleton', return_value=1) + def test_slot_exist_query_true(self, mock1, mock2): + self.assertTrue(self.pg_replication_slot.slot_exists()) + self.assertEqual(1, self.mock_logger.debug.call_count) + self.assertEqual([call('Checking if slot internal_wal_replication_slot exists for host:bar, port:1234')], + self.mock_logger.debug.call_args_list) + + @patch('gppylib.db.dbconn.connect', autospec=True) + @patch('gppylib.db.dbconn.querySingleton', return_value=0) + def test_slot_exist_query_false(self, mock1, mock2): + self.assertFalse(self.pg_replication_slot.slot_exists()) + self.assertEqual(2, self.mock_logger.debug.call_count) + self.assertEqual([call('Checking if slot internal_wal_replication_slot exists for host:bar, port:1234'), + call('Slot internal_wal_replication_slot does not exist for host:bar, port:1234')], + self.mock_logger.debug.call_args_list) + + @patch('gppylib.db.dbconn.connect', side_effect=Exception()) + def test_drop_slot_conn_exception(self, mock1): + with self.assertRaises(Exception) as ex: + self.pg_replication_slot.drop_slot() + + self.assertEqual(1, self.mock_logger.debug.call_count) + self.assertEqual([call('Dropping slot internal_wal_replication_slot for host:bar, port:1234')], + self.mock_logger.debug.call_args_list) + self.assertTrue('Failed to drop replication slot for host:bar, port:1234' in str(ex.exception)) + + @patch('gppylib.db.dbconn.connect', autospec=True) + @patch('gppylib.db.dbconn.query', side_effect=DatabaseError("DatabaseError Exception")) + def test_drop_slot_db_error_exception(self, mock1, mock2): + self.pg_replication_slot.drop_slot() + self.assertEqual(1, self.mock_logger.debug.call_count) + self.assertEqual(1, self.mock_logger.exception.call_count) + self.assertEqual([call('Dropping slot internal_wal_replication_slot for host:bar, port:1234')], + self.mock_logger.debug.call_args_list) + self.assertEqual([call('Failed to query pg_drop_replication_slot for host:bar, port:1234: DatabaseError Exception')], + self.mock_logger.exception.call_args_list) + + @patch('gppylib.db.dbconn.connect', autospec=True) + @patch('gppylib.db.dbconn.query', autospec=True) + def test_drop_slot_success(self, mock1, mock2): + self.assertTrue(self.pg_replication_slot.drop_slot()) + self.assertEqual(2, self.mock_logger.debug.call_count) + self.assertEqual([call('Dropping slot internal_wal_replication_slot for host:bar, port:1234'), + call('Successfully dropped replication slot internal_wal_replication_slot for host:bar, port:1234')], + self.mock_logger.debug.call_args_list) + + @patch('gppylib.db.dbconn.connect', side_effect=Exception()) + def test_create_slot_conn_exception(self, mock1): + with self.assertRaises(Exception) as ex: + self.pg_replication_slot.create_slot() + + self.assertEqual(1, self.mock_logger.debug.call_count) + self.assertEqual([call('Creating slot internal_wal_replication_slot for host:bar, port:1234')], + self.mock_logger.debug.call_args_list) + self.assertTrue('Failed to create replication slot for host:bar, port:1234' in str(ex.exception)) + + @patch('gppylib.db.dbconn.connect', autospec=True) + @patch('gppylib.db.dbconn.query', side_effect=DatabaseError("DatabaseError Exception")) + def test_create_slot_db_error_exception(self, mock1, mock2): + self.pg_replication_slot.create_slot() + self.assertEqual(1, self.mock_logger.debug.call_count) + self.assertEqual(1, self.mock_logger.exception.call_count) + self.assertEqual([call('Creating slot internal_wal_replication_slot for host:bar, port:1234')], + self.mock_logger.debug.call_args_list) + self.assertEqual( + [call('Failed to query pg_create_physical_replication_slot for host:bar, port:1234: DatabaseError Exception')], + self.mock_logger.exception.call_args_list) + + @patch('gppylib.db.dbconn.connect', autospec=True) + @patch('gppylib.db.dbconn.query', autospec=True) + def test_create_slot_success(self, mock1, mock2): + self.assertTrue(self.pg_replication_slot.create_slot()) + self.assertEqual(2, self.mock_logger.debug.call_count) + self.assertEqual([call('Creating slot internal_wal_replication_slot for host:bar, port:1234'), + call( + 'Successfully created replication slot internal_wal_replication_slot for host:bar, port:1234')], + self.mock_logger.debug.call_args_list) class TestUnitPgBaseBackup(unittest.TestCase): def test_replication_slot_not_passed_when_not_given_slot_name(self): diff --git a/gpMgmt/bin/gppylib/db/catalog.py b/gpMgmt/bin/gppylib/db/catalog.py index 6214b805c29..80ca66289eb 100644 --- a/gpMgmt/bin/gppylib/db/catalog.py +++ b/gpMgmt/bin/gppylib/db/catalog.py @@ -6,8 +6,8 @@ """ import copy - -import pg +import os +from contextlib import closing from gppylib import gplog from gppylib.db import dbconn diff --git a/gpMgmt/bin/gppylib/db/dbconn.py b/gpMgmt/bin/gppylib/db/dbconn.py index b85f802d02b..1492b2511c5 100644 --- a/gpMgmt/bin/gppylib/db/dbconn.py +++ b/gpMgmt/bin/gppylib/db/dbconn.py @@ -9,9 +9,8 @@ import sys import os import stat - +import psycopg2 try: - import pgdb from gppylib.commands.unix import UserId except ImportError as e: @@ -159,67 +158,44 @@ def canonicalize(s): # 1. pg notice is accessible to a user of connection returned by dbconn.connect(), # lifted from the underlying _pg connection # 2. multiple calls to dbconn.close() should not return an error -class Connection(pgdb.Connection): +class Connection: def __init__(self, connection): - self._notices = collections.deque(maxlen=100) - # we must do an attribute by attribute copy of the notices here - # due to limitations in pg implementation. Wrap with with a - # namedtuple for ease of use. - def handle_notice(notice): - received = {} - for attr in dir(notice): - if attr.startswith('__'): - continue - value = getattr(notice, attr) - received[attr] = value - Notice = collections.namedtuple('Notice', sorted(received)) - self._notices.append(Notice(**received)) - - - self._impl = connection - self._impl._cnx.set_notice_receiver(handle_notice) + self._conn = connection + self._conn.notices = collections.deque(maxlen=100) def __enter__(self): - return self._impl.__enter__() + return self._conn.__enter__() # __exit__() does not close the connection. This is in line with the # python DB API v2 specification (pep-0249), where close() is done on # __del__(), not __exit__(). def __exit__(self, *args): - return self._impl.__exit__(*args) + return self._conn.__exit__(*args) def __getattr__(self, name): - return getattr(self._impl, name) + return getattr(self._conn, name) def notices(self): - notice_list = list(self._notices) - self._notices.clear() + notice_list = list(self._conn.notices) + self._conn.notices.clear() return notice_list # don't return operational error if connection is already closed def close(self): - if not self._impl.closed: - self._impl.close() + if not self._conn.closed: + self._conn.close() def connect(dburl, utility=False, verbose=False, - encoding=None, allowSystemTableMods=False, logConn=True, unsetSearchPath=True): + encoding=None, allowSystemTableMods=False, logConn=True, unsetSearchPath=True, cursorFactory=None): conninfo = { 'user': dburl.pguser, 'password': dburl.pgpass, 'host': dburl.pghost, 'port': dburl.pgport, - # dbname is very subtle, Package pgdb contains a bug it will only escape the string when - # 1. a space in the dbname, and - # 2. there are other keyword arguments of pgdb.connect method - # See issue https://github.com/PyGreSQL/PyGreSQL/issues/77 for details - # The code here is test if there is space, if so, we know pgdb will escape, let's not do here - # if not, let's do escape here since pgdb forget to do. - # - # NB: we always provide port keyword argument to connect method of pgdb, thus - # we will always enter the code path of pgdb.connect of the above escape logic. - 'database': dburl.pgdb if ' ' in dburl.pgdb else dburl.pgdb.replace('\\', '\\\\').replace("'", "\\'"), + 'database': dburl.pgdb, + 'cursor_factory': cursorFactory } # building options @@ -257,22 +233,23 @@ def connect(dburl, utility=False, verbose=False, logFunc = logger.info if dburl.timeout is not None else logger.debug logFunc("Connecting to db {} on host {}".format(dburl.pgdb, dburl.pghost)) - connection = None + conn = None for i in range(retries): try: - connection = pgdb.connect(**conninfo) + conn = psycopg2.connect(**conninfo) + conn.set_session(autocommit=True) break - except pgdb.OperationalError as e: + except psycopg2.OperationalError as e: if 'timeout expired' in str(e): logger.warning('Timeout expired connecting to %s, attempt %d/%d' % (dburl.pgdb, i+1, retries)) continue raise - if connection is None: + if conn is None: raise ConnectionError('Failed to connect to %s' % dburl.pgdb) - return Connection(connection) + return Connection(conn) def execSQL(conn, sql, autocommit=True): """ @@ -286,7 +263,6 @@ def execSQL(conn, sql, autocommit=True): Using `with dbconn.connect() as conn` syntax will override autocommit and complete queries in a transaction followed by a commit on context close """ - conn.autocommit = autocommit with conn.cursor() as cursor: cursor.execute(sql) diff --git a/gpMgmt/bin/gppylib/db/test/unit/test_cluster_dbconn.py b/gpMgmt/bin/gppylib/db/test/unit/test_cluster_dbconn.py index 086ccce9298..a03eb4db42b 100644 --- a/gpMgmt/bin/gppylib/db/test/unit/test_cluster_dbconn.py +++ b/gpMgmt/bin/gppylib/db/test/unit/test_cluster_dbconn.py @@ -46,7 +46,7 @@ def test_verbose_mode_allows_warnings_to_be_sent_to_the_client(self): for notice in notices: - if warning in notice.message: + if warning in notice: return # found it! self.fail("Didn't find expected notice '{}' in {!r}".format( diff --git a/gpMgmt/bin/gppylib/gpcatalog.py b/gpMgmt/bin/gppylib/gpcatalog.py index dc95de34e8f..f802e02da0e 100644 --- a/gpMgmt/bin/gppylib/gpcatalog.py +++ b/gpMgmt/bin/gppylib/gpcatalog.py @@ -168,7 +168,7 @@ def __init__(self, dbConnection): curs = self._query(version_query) except Exception as e: raise GPCatalogException("Error reading database version: " + str(e)) - self._version = GpVersion(curs.getresult()[0][0]) + self._version = GpVersion(curs.fetchone()[0]) # Read the list of catalog tables from the database try: @@ -178,7 +178,7 @@ def __init__(self, dbConnection): # Construct our internal representation of the catalog - for [oid, relname, relisshared] in curs.getresult(): + for [oid, relname, relisshared] in curs.fetchall(): self._tables[relname] = GPCatalogTable(self, relname) # Note: stupid API returns t/f for boolean value self._tables[relname]._setShared(relisshared == 't') @@ -217,7 +217,9 @@ def _query(self, qry): """ Simple wrapper around querying the database connection """ - return self._dbConnection.query(qry) + cur = self._dbConnection.cursor() + cur.execute(qry) + return cur def _markCoordinatorOnlyTables(self): """ @@ -507,10 +509,10 @@ def __init__(self, parent, name, pkey=None): # exist. raise GPCatalogException("Catalog table %s does not exist" % name) - if cur.ntuples() == 0: + if cur.rowcount == 0: raise GPCatalogException("Catalog table %s does not exist" % name) - for row in cur.getresult(): + for row in cur.fetchall(): (attname, atttype, typname) = row # Mark if the catalog has an oid column @@ -546,7 +548,7 @@ def __init__(self, parent, name, pkey=None): WHERE attrelid = 'pg_catalog.{catname}'::regclass """.format(catname=name) cur = parent._query(qry) - self._pkey = [row[0] for row in cur.getresult()] + self._pkey = [row[0] for row in cur.fetchall()] # Primary key must be in the column list for k in self._pkey: diff --git a/gpMgmt/bin/gppylib/operations/segment_reconfigurer.py b/gpMgmt/bin/gppylib/operations/segment_reconfigurer.py index 643489fd086..913847a5eb5 100644 --- a/gpMgmt/bin/gppylib/operations/segment_reconfigurer.py +++ b/gpMgmt/bin/gppylib/operations/segment_reconfigurer.py @@ -1,8 +1,7 @@ import time - from gppylib.commands import base from gppylib.db import dbconn -import pg +from contextlib import closing FTS_PROBE_QUERY = 'SELECT pg_catalog.gp_request_fts_probe_scan()' @@ -13,15 +12,19 @@ def __init__(self, logger, worker_pool, timeout): self.timeout = timeout def _trigger_fts_probe(self, dburl): - conn = pg.connect(dbname=dburl.pgdb, - host=dburl.pghost, - port=dburl.pgport, - opt=None, - user=dburl.pguser, - passwd=dburl.pgpass, - ) - conn.query(FTS_PROBE_QUERY) - conn.close() + start_time = time.time() + while True: + try: + with closing(dbconn.connect(dburl)) as conn: + with conn.cursor() as cur: + cur.execute(FTS_PROBE_QUERY) + break + except Exception as e: + now = time.time() + if now < start_time + self.timeout: + continue + else: + raise RuntimeError("FTS probing did not complete in {} seconds.".format(self.timeout)) def reconfigure(self): # issue a distributed query to make sure we pick up the fault @@ -36,9 +39,12 @@ def reconfigure(self): # Empty block of 'BEGIN' and 'END' won't start a distributed transaction, # execute a DDL query to start a distributed transaction. # so the primaries'd better be up - conn = dbconn.connect(dburl) - conn.cursor().execute('CREATE TEMP TABLE temp_test(a int)') - conn.cursor().execute('COMMIT') + with closing(dbconn.connect(dburl)) as conn: + with conn.cursor() as cur: + cur.execute('BEGIN') + cur.execute('CREATE TEMP TABLE temp_test(a int)') + cur.execute('COMMIT') + break except Exception as e: # Should close conn here # Otherwise, the postmaster will be blocked by abort transaction @@ -48,6 +54,3 @@ def reconfigure(self): continue else: raise RuntimeError("Mirror promotion did not complete in {0} seconds.".format(self.timeout)) - else: - conn.close() - break diff --git a/gpMgmt/bin/gppylib/operations/test/unit/test_unit_segment_reconfigurer.py b/gpMgmt/bin/gppylib/operations/test/unit/test_unit_segment_reconfigurer.py index 9d86071bafd..d4c2a0c26e7 100644 --- a/gpMgmt/bin/gppylib/operations/test/unit/test_unit_segment_reconfigurer.py +++ b/gpMgmt/bin/gppylib/operations/test/unit/test_unit_segment_reconfigurer.py @@ -4,8 +4,7 @@ from gppylib.operations.segment_reconfigurer import SegmentReconfigurer, FTS_PROBE_QUERY from gppylib.test.unit.gp_unittest import GpTestCase -import pg -import pgdb +import psycopg2 import mock from mock import Mock, patch, call, MagicMock import contextlib @@ -38,22 +37,22 @@ def setUp(self): self.apply_patches([ patch('gppylib.db.dbconn.connect', new=self.connect), patch('gppylib.db.dbconn.DbURL', return_value=self.db_url), - patch('pg.connect'), + patch('psycopg2.connect'), ]) def test_it_triggers_fts_probe(self): reconfigurer = SegmentReconfigurer(logger=self.logger, worker_pool=self.worker_pool, timeout=self.timeout) reconfigurer.reconfigure() - pg.connect.assert_has_calls([ - call(dbname=self.db, host=self.host, port=self.port, opt=None, user=self.user, passwd=self.passwd), + psycopg2.connect.assert_has_calls([ + call(dbname=self.db, host=self.host, port=self.port, options=None, user=self.user, password=self.passwd), call().query(FTS_PROBE_QUERY), call().close(), ] ) def test_it_retries_the_connection(self): - self.connect.configure_mock(side_effect=[pgdb.DatabaseError, pgdb.DatabaseError, self.conn]) + self.connect.configure_mock(side_effect=[psycopg2.DatabaseError, psycopg2.DatabaseError, self.conn]) reconfigurer = SegmentReconfigurer(logger=self.logger, worker_pool=self.worker_pool, timeout=self.timeout) @@ -74,7 +73,7 @@ def fail_for_five_minutes(): # leap forward 300 seconds new_time += self.timeout / 2 now_mock.configure_mock(return_value=new_time) - yield pgdb.DatabaseError + yield psycopg2.DatabaseError self.connect.configure_mock(side_effect=fail_for_five_minutes()) @@ -87,3 +86,27 @@ def fail_for_five_minutes(): self.connect.assert_has_calls([call(self.db_url), call(self.db_url), ]) self.conn.close.assert_has_calls([]) + + @patch('time.time') + def test_it_gives_up_after_600_seconds_2(self, now_mock): + start_datetime = datetime.datetime(2023, 7, 27, 16, 0, 0) + start_time = time.mktime(start_datetime.timetuple()) + now_mock.configure_mock(return_value=start_time) + + def fail_for_ten_minutes(): + new_time = start_time + # leap forward 600 seconds + new_time += self.timeout + now_mock.configure_mock(return_value=new_time) + yield psycopg2.DatabaseError + + self.connect.configure_mock(side_effect=fail_for_ten_minutes()) + + reconfigurer = SegmentReconfigurer(logger=self.logger, + worker_pool=self.worker_pool, timeout=self.timeout) + with self.assertRaises(RuntimeError) as context: + reconfigurer.reconfigure() + self.assertEqual("FTS probing did not complete in {} seconds.".format(self.timeout), context.exception.message) + + self.connect.assert_has_calls([call(self.db_url)]) + self.conn.close.assert_has_calls([]) diff --git a/gpMgmt/bin/gppylib/operations/test/unit/test_unit_utils.py b/gpMgmt/bin/gppylib/operations/test/unit/test_unit_utils.py index 38fcd327dee..e62aa7a40b7 100755 --- a/gpMgmt/bin/gppylib/operations/test/unit/test_unit_utils.py +++ b/gpMgmt/bin/gppylib/operations/test/unit/test_unit_utils.py @@ -11,7 +11,7 @@ from gppylib.operations.test_utils_helper import TestOperation, RaiseOperation, RaiseOperation_Unpicklable, RaiseOperation_Safe, ExceptionWithArgs from operations.unix import ListFiles from test.unit.gp_unittest import GpTestCase, run_tests -from pg import DatabaseError +from psycopg2 import DatabaseError class UtilsTestCase(GpTestCase): """ diff --git a/gpMgmt/bin/gppylib/operations/test_utils_helper.py b/gpMgmt/bin/gppylib/operations/test_utils_helper.py index 109bc83bb87..74cfeda2bc0 100755 --- a/gpMgmt/bin/gppylib/operations/test_utils_helper.py +++ b/gpMgmt/bin/gppylib/operations/test_utils_helper.py @@ -1,4 +1,5 @@ from gppylib.operations import Operation +import psycopg2 """ These objects needed for gppylib.operations.test.test_utils are pulled out of said file for @@ -37,5 +38,4 @@ def __init__(self, x, y): class RaiseOperation_Unpicklable(Operation): def execute(self): - import pg - raise pg.DatabaseError() + raise psycopg2.DatabaseError() diff --git a/gpMgmt/bin/gppylib/programs/clsSystemState.py b/gpMgmt/bin/gppylib/programs/clsSystemState.py index e234b633122..4bf55a783c4 100644 --- a/gpMgmt/bin/gppylib/programs/clsSystemState.py +++ b/gpMgmt/bin/gppylib/programs/clsSystemState.py @@ -10,7 +10,7 @@ import sys, os import re import collections -import pgdb +import psycopg2 from contextlib import closing from gppylib import gparray, gplog from gppylib.commands import base, gp @@ -1026,7 +1026,7 @@ def _get_unsync_segs_add_wal_remaining_bytes(data, gpArray): wal_sync_bytes_out = 'Unknown' unsync_segs.append(s) data.addValue(VALUE__REPL_SYNC_REMAINING_BYTES, wal_sync_bytes_out) - except pgdb.InternalError: + except (psycopg2.InternalError, psycopg2.OperationalError): logger.warning('could not query segment {} ({}:{})'.format( s.dbid, s.hostname, s.port )) @@ -1098,7 +1098,7 @@ def _add_replication_info(data, primary, mirror): cursor.close() - except pgdb.InternalError: + except (psycopg2.InternalError, psycopg2.OperationalError): logger.warning('could not query segment {} ({}:{})'.format( primary.dbid, primary.hostname, primary.port )) diff --git a/gpMgmt/bin/gppylib/test/unit/test_unit_foreign_key_check.py b/gpMgmt/bin/gppylib/test/unit/test_unit_foreign_key_check.py index 9888472bb43..b9e691a7e56 100755 --- a/gpMgmt/bin/gppylib/test/unit/test_unit_foreign_key_check.py +++ b/gpMgmt/bin/gppylib/test/unit/test_unit_foreign_key_check.py @@ -11,7 +11,7 @@ class GpCheckCatTestCase(GpTestCase): def setUp(self): self.logger = Mock(spec=['log', 'info', 'debug', 'error']) - self.db_connection = Mock(spec=['close', 'query']) + self.db_connection = Mock(spec=['close', 'cursor']) self.autoCast = {'regproc': '::oid', 'regprocedure': '::oid', 'regoper': '::oid', @@ -25,9 +25,10 @@ def setUp(self): self.full_join_cat_tables = set(['pg_attribute','gp_distribution_policy','pg_appendonly','pg_constraint','pg_index']) self.foreign_key_check= Mock(spec=['runCheck']) self.foreign_key_check.runCheck.return_value = [] - self.db_connection.query.return_value.ntuples.return_value = 2 - self.db_connection.query.return_value.listfields.return_value = ['pkey1', 'pkey2'] - self.db_connection.query.return_value.getresult.return_value = [('r1','r2'), ('r3','r4')] + + self.db_connection.cursor.return_value.rowcount = 2 + self.db_connection.cursor.return_value.description = [('pkey1',), ('pkey2',)] + self.db_connection.cursor.return_value.fetchall.return_value = [('r1','r2'), ('r3','r4')] def test_get_fk_query_left_join_returns_the_correct_query(self): @@ -127,7 +128,7 @@ def test_checkTableForeignKey__returns_correct_join_query(self, log_literal_mock self.assertEqual(len(issue_list) , 2) self.assertEqual(issue_list[0], ('pg_class', ['pkey1', 'pkey2'], [('r1', 'r2'), ('r3', 'r4')])) self.assertEqual(issue_list[1], ('arbitrary_catalog_table', ['pkey1', 'pkey2'], [('r1', 'r2'), ('r3', 'r4')])) - self.assertEqual(self.db_connection.query.call_count, 2) + self.assertEqual(self.db_connection.cursor.call_count, 2) def __generate_pg_class_call(table, primary_key_cat_name, col_type, with_filter=True): if with_filter: @@ -168,7 +169,7 @@ def __generate_pg_class_call(table, primary_key_cat_name, col_type, with_filter= self.assertEqual(fk_query_full_join_mock.call_count, 0) fk_query_left_join_mock.assert_has_calls(foreign_key_mock_calls_left, any_order=False) - self.db_connection.query.call_count = 0 + self.db_connection.cursor.call_count = 0 fk_query_full_join_mock.call_count = 0 fk_query_left_join_mock.call_count = 0 diff --git a/gpMgmt/bin/gppylib/test/unit/test_unit_gpcheckcat.py b/gpMgmt/bin/gppylib/test/unit/test_unit_gpcheckcat.py index ccdfb03a7ad..28aa0f1227c 100755 --- a/gpMgmt/bin/gppylib/test/unit/test_unit_gpcheckcat.py +++ b/gpMgmt/bin/gppylib/test/unit/test_unit_gpcheckcat.py @@ -18,11 +18,11 @@ def setUp(self): self.subject = imp.load_source('gpcheckcat', gpcheckcat_file) self.subject.check_gpexpand = lambda : (True, "") - self.db_connection = Mock(spec=['close', 'query']) + self.db_connection = Mock(spec=['close', 'cursor', 'set_session']) self.unique_index_violation_check = Mock(spec=['runCheck']) self.foreign_key_check = Mock(spec=['runCheck', 'checkTableForeignKey']) self.apply_patches([ - patch("gpcheckcat.pg.connect", return_value=self.db_connection), + patch("gpcheckcat.connect", return_value=self.db_connection), patch("gpcheckcat.UniqueIndexViolationCheck", return_value=self.unique_index_violation_check), patch("gpcheckcat.ForeignKeyCheck", return_value=self.foreign_key_check), patch('os.environ', new={}), @@ -129,23 +129,26 @@ def test_drop_leaked_schemas__when_leaked_schemas_exist__reports_which_schemas_a self.assertIn(expected_message, log_messages) def test_automatic_thread_count(self): - self.db_connection.query.return_value.getresult.return_value = [[0]] + self.db_connection.cursor.return_value.fetchall.return_value = [[0]] self._run_batch_size_experiment(100) self._run_batch_size_experiment(101) + @patch('gpcheckcat.getversion', return_value='4.3') @patch('gpcheckcat.GPCatalog', return_value=Mock()) @patch('sys.exit') @patch('gppylib.gplog.log_literal') - def test_truncate_batch_size(self, mock_log, mock_gpcheckcat, mock_sys_exit): + def test_truncate_batch_size(self, mock_log, mock_sys_exit, mock_gpcatalog, mock_version): self.subject.GV.opt['-B'] = 300 # override the setting from available memory # setup conditions for 50 primaries and plenty of RAM such that max threads > 50 primaries = [dict(hostname='host0', port=123, id=1, address='123', datadir='dir', content=-1, dbid=0, isprimary='t')] for i in range(1, 50): primaries.append(dict(hostname='host0', port=123, id=1, address='123', datadir='dir', content=1, dbid=i, isprimary='t')) - self.db_connection.query.return_value.getresult.return_value = [['4.3']] - self.db_connection.query.return_value.dictresult.return_value = primaries + self.db_connection.cursor.return_value = Mock() + self.db_connection.cursor.return_value.__enter__ = Mock(return_value=Mock(spec=['fetchall', 'execute'])) + self.db_connection.cursor.return_value.__exit__ = Mock(return_value=False) + self.db_connection.cursor.return_value.__enter__.return_value.fetchall.return_value = primaries testargs = ['some_string','-port 1', '-R foo'] @@ -221,10 +224,11 @@ def test_checkForeignKey__no_arg(self, process_foreign_key_mock): self.foreign_key_check.runCheck.assert_called_once_with(cat_tables) # Test gpcheckat -C option with checkForeignKey + @patch('gpcheckcat.getversion', return_value='4.3') @patch('gpcheckcat.GPCatalog', return_value=Mock()) @patch('sys.exit') @patch('gpcheckcat.checkTableMissingEntry') - def test_runCheckCatname__for_checkForeignKey(self, mock1, mock2, mock3): + def test_runCheckCatname__for_checkForeignKey(self, mock1, mock2, mock3, mock4): self.subject.checkForeignKey = Mock() gpcat_class_mock = Mock(spec=['getCatalogTable']) cat_obj_mock = Mock() @@ -234,8 +238,12 @@ def test_runCheckCatname__for_checkForeignKey(self, mock1, mock2, mock3): for i in range(1, 50): primaries.append(dict(hostname='host0', port=123, id=1, address='123', datadir='dir', content=1, dbid=i, isprimary='t')) - self.db_connection.query.return_value.getresult.return_value = [['4.3']] - self.db_connection.query.return_value.dictresult.return_value = primaries + + # context manager helper functions. + self.db_connection.cursor.return_value = Mock() + self.db_connection.cursor.return_value.__enter__ = Mock(return_value=Mock(spec=['fetchall', 'execute'])) + self.db_connection.cursor.return_value.__exit__ = Mock(return_value=False) + self.db_connection.cursor.return_value.__enter__.return_value.fetchall.return_value = primaries self.subject.GV.opt['-C'] = 'pg_class' @@ -314,7 +322,13 @@ def test_skip_one_test(self, mock_ver, mock_run, mock1, mock2): primaries = [dict(hostname='host0', port=123, id=1, address='123', datadir='dir', content=-1, dbid=0, isprimary='t')] for i in range(1, 50): primaries.append(dict(hostname='host0', port=123, id=1, address='123', datadir='dir', content=1, dbid=i, isprimary='t')) - self.db_connection.query.return_value.dictresult.return_value = primaries + + # context manager helper functions. + self.db_connection.cursor.return_value = Mock() + self.db_connection.cursor.return_value.__enter__ = Mock(return_value=Mock(spec=['fetchall', 'execute'])) + self.db_connection.cursor.return_value.__exit__ = Mock(return_value=False) + self.db_connection.cursor.return_value.__enter__.return_value.fetchall.return_value = primaries + self.subject.all_checks = {'test1': 'a', 'test2': 'b', 'test3': 'c'} testargs = ['gpcheckcat', '-port 1', '-s test2'] @@ -330,7 +344,13 @@ def test_skip_multiple_test(self, mock_ver, mock_run, mock1, mock2): primaries = [dict(hostname='host0', port=123, id=1, address='123', datadir='dir', content=-1, dbid=0, isprimary='t')] for i in range(1, 50): primaries.append(dict(hostname='host0', port=123, id=1, address='123', datadir='dir', content=1, dbid=i, isprimary='t')) - self.db_connection.query.return_value.dictresult.return_value = primaries + + # context manager helper functions. + self.db_connection.cursor.return_value = Mock() + self.db_connection.cursor.return_value.__enter__ = Mock(return_value=Mock(spec=['fetchall', 'execute'])) + self.db_connection.cursor.return_value.__exit__ = Mock(return_value=False) + self.db_connection.cursor.return_value.__enter__.return_value.fetchall.return_value = primaries + self.subject.all_checks = {'test1': 'a', 'test2': 'b', 'test3': 'c'} testargs = ['gpcheckcat', '-port 1', '-s', "test1, test2"] @@ -346,7 +366,11 @@ def test_skip_test_warning(self, mock_ver, mock_run, mock1, mock2): primaries = [dict(hostname='host0', port=123, id=1, address='123', datadir='dir', content=-1, dbid=0, isprimary='t')] for i in range(1, 50): primaries.append(dict(hostname='host0', port=123, id=1, address='123', datadir='dir', content=1, dbid=i, isprimary='t')) - self.db_connection.query.return_value.dictresult.return_value = primaries + # context manager helper functions. + self.db_connection.cursor.return_value = Mock() + self.db_connection.cursor.return_value.__enter__ = Mock(return_value=Mock(spec=['fetchall', 'execute'])) + self.db_connection.cursor.return_value.__exit__ = Mock(return_value=False) + self.db_connection.cursor.return_value.__enter__.return_value.fetchall.return_value = primaries self.subject.all_checks = {'test1': 'a', 'test2': 'b', 'test3': 'c'} testargs = ['gpcheckcat', '-port 1', '-s', "test_invalid, test2"] @@ -365,7 +389,13 @@ def test_run_multiple_test(self, mock_ver, mock_run, mock1, mock2): primaries = [dict(hostname='host0', port=123, id=1, address='123', datadir='dir', content=-1, dbid=0, isprimary='t')] for i in range(1, 50): primaries.append(dict(hostname='host0', port=123, id=1, address='123', datadir='dir', content=1, dbid=i, isprimary='t')) - self.db_connection.query.return_value.dictresult.return_value = primaries + + # context manager helper functions. + self.db_connection.cursor.return_value = Mock() + self.db_connection.cursor.return_value.__enter__ = Mock(return_value=Mock(spec=['fetchall', 'execute'])) + self.db_connection.cursor.return_value.__exit__ = Mock(return_value=False) + self.db_connection.cursor.return_value.__enter__.return_value.fetchall.return_value = primaries + self.subject.all_checks = {'test1': 'a', 'test2': 'b', 'test3': 'c'} testargs = ['gpcheckcat', '-port 1', '-R', "test1, test2"] diff --git a/gpMgmt/bin/gppylib/test/unit/test_unit_gpconfig.py b/gpMgmt/bin/gppylib/test/unit/test_unit_gpconfig.py index 54fa8f3cf7c..42afb96763d 100644 --- a/gpMgmt/bin/gppylib/test/unit/test_unit_gpconfig.py +++ b/gpMgmt/bin/gppylib/test/unit/test_unit_gpconfig.py @@ -5,11 +5,10 @@ import shutil import sys import tempfile - +from psycopg2 import DatabaseError from gppylib.gparray import Segment, GpArray, SegmentPair from gpconfig_modules.parse_guc_metadata import ParseGuc import errno -from pg import DatabaseError from .gp_unittest import * from unittest.mock import * diff --git a/gpMgmt/bin/gppylib/test/unit/test_unit_gpstate.py b/gpMgmt/bin/gppylib/test/unit/test_unit_gpstate.py index e9c60760aeb..4858e80e65a 100644 --- a/gpMgmt/bin/gppylib/test/unit/test_unit_gpstate.py +++ b/gpMgmt/bin/gppylib/test/unit/test_unit_gpstate.py @@ -1,6 +1,6 @@ import unittest import mock -import pgdb +import psycopg2 import tempfile from gppylib import gparray @@ -228,7 +228,7 @@ def test_add_replication_info_adds_unknowns_if_primary_is_down(self): @mock.patch('gppylib.db.dbconn.connect', autospec=True) def test_add_replication_info_adds_unknowns_if_connection_cannot_be_made(self, mock_connect): # Simulate a connection failure in dbconn.connect(). - mock_connect.side_effect = pgdb.InternalError('connection failure forced by unit test') + mock_connect.side_effect = psycopg2.InternalError('connection failure forced by unit test') GpSystemStateProgram._add_replication_info(self.data, self.primary, self.mirror) self.assertEqual('Unknown', self.data.getStrValue(self.mirror, VALUE__REPL_SENT_LSN)) diff --git a/gpMgmt/bin/gppylib/test/unit/test_unit_leaked_schema_dropper.py b/gpMgmt/bin/gppylib/test/unit/test_unit_leaked_schema_dropper.py index 1eda2e72a25..1cd81684c23 100644 --- a/gpMgmt/bin/gppylib/test/unit/test_unit_leaked_schema_dropper.py +++ b/gpMgmt/bin/gppylib/test/unit/test_unit_leaked_schema_dropper.py @@ -6,45 +6,57 @@ class LeakedSchemaDropperTestCase(GpTestCase): def setUp(self): - self.db_connection = Mock(spec=['query']) - - two_leaked_schemas = Mock() - two_leaked_schemas.getresult.return_value = [ + self.db_connection = Mock(spec=['cursor']) + self.db_connection.cursor.return_value.fetchall.return_value = [ ('fake_leak_1', 'something_else'), ('some"test"special_#;character--schema', 'something_else') ] - self.db_connection.query.return_value = two_leaked_schemas - self.subject = LeakedSchemaDropper() def test_drop_leaked_schemas__returns_a_list_of_leaked_schemas(self): + self.db_connection.cursor.return_value = Mock() + self.db_connection.cursor.return_value.__enter__ = Mock(return_value=Mock(spec=['fetchall', 'execute'])) + self.db_connection.cursor.return_value.__exit__ = Mock(return_value=False) + self.db_connection.cursor.return_value.__enter__.return_value.fetchall.return_value = [ + ('fake_leak_1', 'something_else'), + ('some"test"special_#;character--schema', 'something_else') + ] self.assertEqual(self.subject.drop_leaked_schemas(self.db_connection), ['fake_leak_1', 'some"test"special_#;character--schema']) def test_drop_leaked_schemas__when_there_are_no_leaked_schemas__returns_an_empty_list(self): - no_leaked_schemas = Mock() - no_leaked_schemas.getresult.return_value = [] - self.db_connection.query.return_value = no_leaked_schemas - + self.db_connection.cursor.return_value = Mock() + self.db_connection.cursor.return_value.__enter__ = Mock(return_value=Mock(spec=['fetchall', 'execute'])) + self.db_connection.cursor.return_value.__exit__ = Mock(return_value=False) + self.db_connection.cursor.return_value.__enter__.return_value.fetchall.return_value = [] self.assertEqual(self.subject.drop_leaked_schemas(self.db_connection), []) def test_drop_leaked_schemas__when_query_returns_null_schema__returns_an_empty_list(self): - null_leaked_schema = Mock() - null_leaked_schema.getresult.return_value = [(None, 'something_else')] - self.db_connection.query.return_value = null_leaked_schema - + self.db_connection.cursor.return_value = Mock() + self.db_connection.cursor.return_value.__enter__ = Mock(return_value=Mock(spec=['fetchall', 'execute'])) + self.db_connection.cursor.return_value.__exit__ = Mock(return_value=False) + self.db_connection.cursor.return_value.__enter__.return_value.fetchall.return_value = [(None, 'something_else')] self.assertEqual(self.subject.drop_leaked_schemas(self.db_connection), []) def test_drop_leaked_schemas__when_query_returns_null__returns_an_empty_list(self): - self.db_connection.query.return_value = None - + self.db_connection.cursor.return_value = Mock() + self.db_connection.cursor.return_value.__enter__ = Mock(return_value=Mock(spec=['fetchall', 'execute'])) + self.db_connection.cursor.return_value.__exit__ = Mock(return_value=False) + self.db_connection.cursor.return_value.__enter__.return_value.fetchall.return_value = [] self.assertEqual(self.subject.drop_leaked_schemas(self.db_connection), []) def test_drop_leaked_schemas__drops_orphaned_and_leaked_schemas(self): + self.db_connection.cursor.return_value = Mock() + self.db_connection.cursor.return_value.__enter__ = Mock(return_value=Mock(spec=['fetchall', 'execute'])) + self.db_connection.cursor.return_value.__exit__ = Mock(return_value=False) + self.db_connection.cursor.return_value.__enter__.return_value.fetchall.return_value = [ + ('fake_leak_1', 'something_else'), + ('some"test"special_#;character--schema', 'something_else') + ] self.subject.drop_leaked_schemas(self.db_connection) drop_query_expected_list = [call("DROP SCHEMA IF EXISTS \"fake_leak_1\" CASCADE;"), call("DROP SCHEMA IF EXISTS \"some\"\"test\"\"special_#;character--schema\" CASCADE;")] - self.db_connection.query.assert_has_calls(drop_query_expected_list) + self.db_connection.cursor.return_value.__enter__.return_value.execute.assert_has_calls(drop_query_expected_list) if __name__ == '__main__': diff --git a/gpMgmt/bin/gppylib/test/unit/test_unit_unique_index_violation_check.py b/gpMgmt/bin/gppylib/test/unit/test_unit_unique_index_violation_check.py index c9306d69b97..19ddb773232 100644 --- a/gpMgmt/bin/gppylib/test/unit/test_unit_unique_index_violation_check.py +++ b/gpMgmt/bin/gppylib/test/unit/test_unit_unique_index_violation_check.py @@ -9,33 +9,37 @@ def setUp(self): self.subject = UniqueIndexViolationCheck() self.index_query_result = Mock() - self.index_query_result.getresult.return_value = [ + self.index_query_result.fetchall.return_value = [ (9001, 'index1', 'table1', ['index1_column1','index1_column2']), (9001, 'index2', 'table1', ['index2_column1','index2_column2']) ] - self.violated_segments_query_result = Mock() - - self.db_connection = Mock(spec=['query']) - self.db_connection.query.side_effect = self.mock_query_return_value - - def mock_query_return_value(self, query_string): - if query_string == UniqueIndexViolationCheck.unique_indexes_query: - return self.index_query_result - else: - return self.violated_segments_query_result + self.db_connection = Mock(spec=['cursor']) + self.db_connection.cursor.return_value.__enter__ = Mock(return_value=Mock(spec=['fetchall', 'execute'])) + self.db_connection.cursor.return_value.__exit__ = Mock(return_value=False) def test_run_check__when_there_are_no_issues(self): - self.violated_segments_query_result.getresult.return_value = [] + self.db_connection.cursor.return_value.__enter__.return_value.fetchall.side_effect = [ + [ + (9001, 'index1', 'table1', ['index1_column1','index1_column2']), + (9001, 'index2', 'table1', ['index2_column1','index2_column2']) + ], + [], + [], + ] violations = self.subject.runCheck(self.db_connection) self.assertEqual(len(violations), 0) def test_run_check__when_index_is_violated(self): - self.violated_segments_query_result.getresult.side_effect = [ + self.db_connection.cursor.return_value.__enter__.return_value.fetchall.side_effect = [ + [ + (9001, 'index1', 'table1', ['index1_column1','index1_column2']), + (9001, 'index2', 'table1', ['index2_column1','index2_column2']) + ], [(-1,), (0,), (1,)], - [(-1,)] + [(-1,)], ] violations = self.subject.runCheck(self.db_connection) diff --git a/gpMgmt/bin/gppylib/utils.py b/gpMgmt/bin/gppylib/utils.py index fead818d3ac..42c77e620ab 100644 --- a/gpMgmt/bin/gppylib/utils.py +++ b/gpMgmt/bin/gppylib/utils.py @@ -5,8 +5,7 @@ from sys import * from xml.dom import minidom from xml.dom import Node - -import pgdb +import psycopg2 from gppylib.gplog import * logger = get_default_logger() @@ -503,14 +502,12 @@ def escapeDoubleQuoteInSQLString(string, forceDoubleQuote=True): string = '"' + string + '"' return string - -def Escape(query_str): - return pgdb.escape_string(query_str) - +def escape_string(string): + return psycopg2.extensions.QuotedString(string).getquoted()[1:-1].decode() def escapeArrayElement(query_str): # also escape backslashes and double quotes, in addition to the doubling of single quotes - return pgdb.escape_string(query_str.encode(errors='backslashreplace')).decode(errors='backslashreplace').replace('\\','\\\\').replace('"','\\"') + return escape_string(query_str.encode(errors='backslashreplace')).encode().decode(errors='backslashreplace').replace('\\','\\\\').replace('"','\\"') # Transform Python list to Postgres array literal (of the form: '{...}') @@ -593,7 +590,7 @@ def formatInsertValuesList(row, starelid, inclHLL): # Format stavalues5 for an hll slot elif i == 30 and hll: if inclHLL: - val = '\'{"%s"}\'' % pgdb.escape_bytea(val[0]) + val = '\'{\\%s}\'' % val[0] rowVals.append('\t{0}::{1}'.format(val, 'bytea[]')) else: rowVals.append('\t{0}'.format('NULL::int4[]')) diff --git a/gpMgmt/bin/gpsd b/gpMgmt/bin/gpsd index bffbc02065b..b9b19953b58 100755 --- a/gpMgmt/bin/gpsd +++ b/gpMgmt/bin/gpsd @@ -11,8 +11,8 @@ import sys import re from contextlib import closing from optparse import OptionParser -import pgdb -from gppylib.utils import formatInsertValuesList, Escape +from gppylib.utils import formatInsertValuesList, escape_string +import psycopg2 gpsd_version = '%prog 1.0' @@ -42,7 +42,7 @@ def get_num_segments(cursor): query = "select count(*) from gp_segment_configuration where role='p' and content >=0;" try: cursor.execute(query) - except pgdb.DatabaseError as e: + except psycopg2.DatabaseError as e: sys.stderr.write('\nError while trying to retrieve number of segments.\n\n' + str(e) + '\n\n') sys.exit(1) vals = cursor.fetchone() @@ -82,7 +82,13 @@ def dumpTupleCount(cur): def dumpStats(cur, inclHLL): - query = 'SELECT pgc.relname, pgn.nspname, pga.attname, pgtn.nspname, pgt.typname, pgs.* ' \ + query = 'SELECT pgc.relname, pgn.nspname, pga.attname, pgtn.nspname, pgt.typname, ' \ + 'pgs.starelid, pgs.staattnum, pgs.stainherit, pgs.stanullfrac, pgs.stawidth, pgs.stadistinct, ' \ + 'pgs.stakind1, pgs.stakind2, pgs.stakind3, pgs.stakind4, pgs.stakind5, ' \ + 'pgs.staop1, pgs.staop2, pgs.staop3, pgs.staop4, pgs.staop5, ' \ + 'pgs.stacoll1, pgs.stacoll2, pgs.stacoll3, pgs.stacoll4, pgs.stacoll5, ' \ + 'pgs.stanumbers1, pgs.stanumbers2, pgs.stanumbers3, pgs.stanumbers4, pgs.stanumbers5, ' \ + 'pgs.stavalues1::text::text[], pgs.stavalues2::text::text[], pgs.stavalues3::text::text[], pgs.stavalues4::text::text[], pgs.stavalues5::text::text[] ' \ 'FROM pg_class pgc, pg_statistic pgs, pg_namespace pgn, pg_attribute pga, pg_type pgt, pg_namespace pgtn ' \ 'WHERE pgc.relnamespace = pgn.oid and pgn.nspname NOT IN ' + \ sysnslist + \ @@ -101,7 +107,7 @@ def dumpStats(cur, inclHLL): cur.execute(query) for vals in ResultIter(cur): - starelid = "'%s.%s'::regclass" % (Escape(vals[1]), Escape(vals[0])) + starelid = "'%s.%s'::regclass" % (escape_string(vals[1]), escape_string(vals[0])) rowVals = formatInsertValuesList(vals, starelid, inclHLL) print(pstring.format(vals[0], vals[2], ',\n'.join(rowVals))) @@ -152,7 +158,7 @@ def main(): 'options': pgoptions } num_segments = 0 - with closing(pgdb.connect(**connectionInfo)) as connection: + with closing(psycopg2.connect(**connectionInfo)) as connection: with closing(connection.cursor()) as cursor: num_segments = get_num_segments(cursor) sys.stdout.writelines(['\n-- Greenplum database Statistics Dump', @@ -187,7 +193,7 @@ def main(): sys.stdout.flush() try: - with closing(pgdb.connect(**connectionInfo)) as connection: + with closing(psycopg2.connect(**connectionInfo)) as connection: with closing(connection.cursor()) as cursor: dumpTupleCount(cursor) dumpStats(cursor, inclHLL) @@ -196,11 +202,11 @@ def main(): 'which requires some data elements to be included in the output file.\n', 'Please review output file to ensure it is within corporate policy to transport the output file.\n']) - except pgdb.DatabaseError as err: # catch *all* exceptions + except psycopg2.DatabaseError as err: # catch *all* exceptions sys.stderr.write('Error while dumping statistics:\n') sys.stderr.write(str(err)) sys.exit(1) if __name__ == "__main__": - main() + main() diff --git a/gpMgmt/bin/minirepro b/gpMgmt/bin/minirepro index 79d4c9fbb31..858b77933dd 100755 --- a/gpMgmt/bin/minirepro +++ b/gpMgmt/bin/minirepro @@ -61,10 +61,10 @@ minirepro gptest -h locahost -U gpadmin -p 4444 -q ~/in.sql -f ~/out.sql import pwd import os, sys, re, json, platform, subprocess -import pgdb +import psycopg2 from optparse import OptionParser from datetime import datetime -from gppylib.utils import formatInsertValuesList, Escape +from gppylib.utils import formatInsertValuesList, escape_string version = '1.13' PATH_PREFIX = '/tmp/' @@ -97,7 +97,7 @@ def get_server_version(cursor): query = "select version()" try: cursor.execute(query) - except pgdb.DatabaseError as e: + except psycopg2.DatabaseError as e: sys.stderr.write('\nError while trying to find GPDB version.\n\n' + str(e) + '\n\n') sys.exit(1) vals = cursor.fetchone() @@ -107,7 +107,7 @@ def get_num_segments(cursor): query = "select count(*) from gp_segment_configuration where role='p' and content >=0;" try: cursor.execute(query) - except pgdb.DatabaseError as e: + except psycopg2.DatabaseError as e: sys.stderr.write('\nError while trying to retrieve number of segments.\n\n' + str(e) + '\n\n') sys.exit(1) vals = cursor.fetchone() @@ -136,7 +136,7 @@ def dump_query(connectionInfo, query_file): with open(query_file, 'r') as query_f: sql_text = query_f.read() - query = "select pg_catalog.gp_dump_query_oids('%s')" % Escape(sql_text) + query = "select pg_catalog.gp_dump_query_oids('%s')" % escape_string(sql_text) toolkit_sql = PATH_PREFIX + 'toolkit.sql' with open(toolkit_sql, 'w') as toolkit_f: @@ -187,7 +187,7 @@ def pg_dump_object(mr_query, connectionInfo, envOpts): out_file = PATH_PREFIX + PGDUMP_FILE dmp_cmd = 'pg_dump -h %s -p %s -U %s -sxO %s' % connectionInfo dmp_cmd = "%s --relation-oids %s --function-oids %s -f %s" % \ - (dmp_cmd, mr_query.relids, mr_query.funcids, Escape(out_file)) + (dmp_cmd, mr_query.relids, mr_query.funcids, escape_string(out_file)) print(dmp_cmd) p = subprocess.Popen(dmp_cmd, shell=True, stderr=subprocess.PIPE, env=envOpts) _, errormsg = p.communicate() @@ -213,11 +213,17 @@ def dump_tuple_count(cur, oid_str, f_out): for col, val, typ in zip(columns[2:], vals[2:], types): # i.e. relpages = 1::int, reltuples = 1.0::real lines.append('\t%s = %s::%s' % (col, val, typ)) - updateStmt = templateStmt.format(Escape(',\n'.join(lines)), Escape(vals[0]), Escape(vals[1])) + updateStmt = templateStmt.format(escape_string(',\n'.join(lines)), escape_string(vals[0]), escape_string(vals[1])) f_out.writelines(updateStmt) def dump_stats(cur, oid_str, f_out, inclHLL): - query = 'SELECT pgc.relname, pgn.nspname, pga.attname, pgtn.nspname, pgt.typname, pgs.* ' \ + query = 'SELECT pgc.relname, pgn.nspname, pga.attname, pgtn.nspname, pgt.typname, ' \ + 'pgs.starelid, pgs.staattnum, pgs.stainherit, pgs.stanullfrac, pgs.stawidth, pgs.stadistinct, ' \ + 'pgs.stakind1, pgs.stakind2, pgs.stakind3, pgs.stakind4, pgs.stakind5, ' \ + 'pgs.staop1, pgs.staop2, pgs.staop3, pgs.staop4, pgs.staop5, ' \ + 'pgs.stacoll1, pgs.stacoll2, pgs.stacoll3, pgs.stacoll4, pgs.stacoll5, ' \ + 'pgs.stanumbers1, pgs.stanumbers2, pgs.stanumbers3, pgs.stanumbers4, pgs.stanumbers5, ' \ + 'pgs.stavalues1::text::text[], pgs.stavalues2::text::text[], pgs.stavalues3::text::text[], pgs.stavalues4::text::text[], pgs.stavalues5::text::text[] ' \ 'FROM pg_class pgc, pg_statistic pgs, pg_namespace pgn, pg_attribute pga, pg_type pgt, pg_namespace pgtn ' \ 'WHERE pgc.relnamespace = pgn.oid and pgc.oid in (%s) ' \ 'and pgn.nspname NOT LIKE \'pg_temp_%%\' ' \ @@ -239,7 +245,7 @@ def dump_stats(cur, oid_str, f_out, inclHLL): for vals in result_iter(cur): schemaname = vals[1] - starelid = "'%s.%s'::regclass" % (Escape(vals[1]), Escape(vals[0])) + starelid = "'%s.%s'::regclass" % (escape_string(vals[1]), escape_string(vals[0])) rowVals = formatInsertValuesList(vals, starelid, inclHLL) # For non-catalog tables we don't need to delete stats first @@ -248,7 +254,7 @@ def dump_stats(cur, oid_str, f_out, inclHLL): if schemaname != 'pg_catalog': linecomment = '-- ' # This will comment out the DELETE query - f_out.writelines(pstring.format(Escape(vals[0]), Escape(vals[2]), linecomment, starelid, vals[6], ',\n'.join(rowVals))) + f_out.writelines(pstring.format(escape_string(vals[0]), escape_string(vals[2]), linecomment, starelid, vals[6], ',\n'.join(rowVals))) def main(): parser = parse_cmd_line() @@ -299,7 +305,7 @@ def main(): } print("Connecting to database: host=%s, port=%s, user=%s, db=%s ..." % connectionInfo) - conn = pgdb.connect(**connectionDict) + conn = psycopg2.connect(**connectionDict) cursor = conn.cursor() # get server version, which is dumped to minirepro output file @@ -346,7 +352,7 @@ def main(): # first create schema DDLs print("Writing schema DDLs ...") - table_schemas = ["CREATE SCHEMA %s;\n" % Escape(schema) for schema in mr_query.schemas if schema != 'public'] + table_schemas = ["CREATE SCHEMA %s;\n" % escape_string(schema) for schema in mr_query.schemas if schema != 'public'] f_out.writelines(table_schemas) # write relation and function DDLs @@ -392,4 +398,4 @@ def main(): print('Please review output file to ensure it is within corporate policy to transport the output file.') if __name__ == "__main__": - main() + main() diff --git a/gpMgmt/sbin/gpsegstop.py b/gpMgmt/sbin/gpsegstop.py index ab369f63473..9f13c10883b 100755 --- a/gpMgmt/sbin/gpsegstop.py +++ b/gpMgmt/sbin/gpsegstop.py @@ -23,7 +23,6 @@ from gppylib.commands import gp from gppylib.commands.gp import SEGMENT_STOP_TIMEOUT_DEFAULT, DEFAULT_SEGHOST_NUM_WORKERS from gppylib.commands import pg -from gppylib.db import dbconn from gppylib import pgconf from gppylib.commands.gp import is_pid_postmaster diff --git a/gpMgmt/test/behave/mgmt_utils/steps/mgmt_utils.py b/gpMgmt/test/behave/mgmt_utils/steps/mgmt_utils.py index dfcc137fe71..0d025ea7044 100644 --- a/gpMgmt/test/behave/mgmt_utils/steps/mgmt_utils.py +++ b/gpMgmt/test/behave/mgmt_utils/steps/mgmt_utils.py @@ -19,7 +19,8 @@ from datetime import datetime, timedelta from os import path from contextlib import closing - +import psycopg2 +from psycopg2 import extras from gppylib.gparray import GpArray, ROLE_PRIMARY, ROLE_MIRROR from gppylib.commands.gp import SegmentStart, GpStandbyStart, CoordinatorStop from gppylib.commands import gp @@ -3159,31 +3160,41 @@ def impl(context, table_name): dbname = 'gptest' conn = dbconn.connect(dbconn.DbURL(dbname=dbname), unsetSearchPath=False) context.long_run_select_only_conn = conn + cursor = conn.cursor() + context.long_run_select_only_cursor = cursor + + # Start a readonly transaction. + cursor.execute("BEGIN") query = """SELECT gp_segment_id, * from %s order by 1, 2""" % table_name - data_result = dbconn.query(conn, query).fetchall() + cursor.execute(query) + data_result = cursor.fetchall() + context.long_run_select_only_data_result = data_result query = """SELECT txid_current()""" - xid = dbconn.querySingleton(conn, query) + cursor.execute(query) + xid = cursor.fetchone()[0] context.long_run_select_only_xid = xid @then('verify that long-run read-only transaction still exists on {table_name}') def impl(context, table_name): dbname = 'gptest' - conn = context.long_run_select_only_conn + cursor = context.long_run_select_only_cursor query = """SELECT gp_segment_id, * from %s order by 1, 2""" % table_name - data_result = dbconn.query(conn, query).fetchall() + cursor.execute(query) + data_result = cursor.fetchall() query = """SELECT txid_current()""" - xid = dbconn.querySingleton(conn, query) + cursor.execute(query) + xid = cursor.fetchone()[0] if (xid != context.long_run_select_only_xid or data_result != context.long_run_select_only_data_result): error_str = "Incorrect xid or select result of long run read-only transaction: \ - xid(before %s, after %), result(before %s, after %s)" - raise Exception(error_str % (context.long_run_select_only_xid, xid, context.long_run_select_only_data_result, data_result)) + xid(before {}, after {}), result(before {}, after {})" + raise Exception(error_str.format(context.long_run_select_only_xid, xid, context.long_run_select_only_data_result, data_result)) @given('a long-run transaction starts') def impl(context): @@ -3191,30 +3202,36 @@ def impl(context): conn = dbconn.connect(dbconn.DbURL(dbname=dbname), unsetSearchPath=False) context.long_run_conn = conn + cursor = conn.cursor() + context.long_run_cursor = cursor + + cursor.execute("BEGIN") + query = """SELECT txid_current()""" - xid = dbconn.querySingleton(conn, query) + cursor.execute(query) + xid = cursor.fetchone()[0] context.long_run_xid = xid @then('verify that long-run transaction aborted for changing the catalog by creating table {table_name}') def impl(context, table_name): - dbname = 'gptest' - conn = context.long_run_conn + cursor = context.long_run_cursor query = """SELECT txid_current()""" - xid = dbconn.querySingleton(conn, query) + cursor.execute(query) + xid = cursor.fetchone()[0] if context.long_run_xid != xid: raise Exception("Incorrect xid of long run transaction: before %s, after %s" % (context.long_run_xid, xid)); query = """CREATE TABLE %s (a INT)""" % table_name try: - data_result = dbconn.query(conn, query) - except Exception as msg: - key_msg = "FATAL: cluster is expanded" - if key_msg not in msg.__str__(): - raise Exception("transaction not abort correctly, errmsg:%s" % msg) + cursor.execute(query) + except Exception as e: + key_msg = "cluster is expanded from" + if key_msg not in str(e): + raise Exception("transaction not abort correctly, errmsg:%s" % str(e)) else: - raise Exception("transaction not abort, result:%s" % data_result) + raise Exception("transaction not abort") @when('verify that the cluster has {num_of_segments} new segments') @then('verify that the cluster has {num_of_segments} new segments') @@ -3832,7 +3849,7 @@ def impl(context): @then('the database locales are saved') def impl(context): - with closing(dbconn.connect(dbconn.DbURL())) as conn: + with closing(dbconn.connect(dbconn.DbURL(), cursorFactory=psycopg2.extras.NamedTupleCursor)) as conn: rows = dbconn.query(conn, "SELECT name, setting FROM pg_settings WHERE name LIKE 'lc_%'").fetchall() context.database_locales = {row.name: row.setting for row in rows} diff --git a/gpMgmt/test/behave/mgmt_utils/steps/replication_slots_utils.py b/gpMgmt/test/behave/mgmt_utils/steps/replication_slots_utils.py index aa9b4a011c1..1c20e690d53 100644 --- a/gpMgmt/test/behave/mgmt_utils/steps/replication_slots_utils.py +++ b/gpMgmt/test/behave/mgmt_utils/steps/replication_slots_utils.py @@ -28,7 +28,7 @@ def create_cluster(context, with_mirrors=True): cd ../gpAux/gpdemo; \ export DEMO_PORT_BASE={port_base} && \ export NUM_PRIMARY_MIRROR_PAIRS={num_primary_mirror_pairs} && \ - export WITH_MIRRORS={with_mirrors} && \A + export WITH_MIRRORS={with_mirrors} && \ ./demo_cluster.sh -d && ./demo_cluster.sh -c && \ ./demo_cluster.sh """.format(port_base=os.getenv('PORT_BASE', 15432), @@ -108,18 +108,17 @@ def step_impl(context): def step_impl(context): result_cursor = query_sql( "postgres", - "select pg_get_replication_slots() from gp_dist_random('gp_id') order by gp_segment_id" + "select (pg_get_replication_slots()).* from gp_dist_random('gp_id') order by gp_segment_id" ) if result_cursor.rowcount != context.current_cluster_size: raise Exception("expected all %d primaries to have replication slots, only %d have slots" % (context.current_cluster_size, results.rowcount)) - for content_id, result in enumerate(result_cursor.fetchall()): - pg_rep_slot = result[0] - if (pg_rep_slot[0], pg_rep_slot[2], pg_rep_slot[4]) != ('internal_wal_replication_slot','physical','f') : + for content_id, pg_rep_slot in enumerate(result_cursor.fetchall()): + if (pg_rep_slot[0], pg_rep_slot[2], pg_rep_slot[4]) != ('internal_wal_replication_slot', 'physical', False) : raise Exception( "expected replication slot to be active for content id %d, got %s" % - (content_id, result[0]) + (content_id, pg_rep_slot) ) @then('the mirrors should not have replication slots') diff --git a/gpMgmt/test/behave_utils/gpexpand_dml.py b/gpMgmt/test/behave_utils/gpexpand_dml.py index 8658c7e58ff..55f0e37b34d 100755 --- a/gpMgmt/test/behave_utils/gpexpand_dml.py +++ b/gpMgmt/test/behave_utils/gpexpand_dml.py @@ -31,9 +31,15 @@ def __init__(self, dbname, dmltype): def run(self): conn = dbconn.connect(dbconn.DbURL(dbname=self.dbname), unsetSearchPath=False) + with conn.cursor() as cur: + cur.execute("BEGIN") + self.loop(conn) self.verify(conn) + with conn.cursor() as cur: + cur.execute("COMMIT") + conn.commit() conn.close() @@ -109,13 +115,15 @@ def loop_step(self): def verify(self, conn): sql = ''' select c1 from {tablename} order by c1; - '''.format(tablename=self.tablename, counter=self.counter) - results = dbconn.query(conn, sql).fetchall() + '''.format(tablename=self.tablename) + with conn.cursor() as cur: + cur.execute(sql) + results = cur.fetchall() - for i in range(0, self.counter): - if i != int(results[i][0]): - self.report_incorrect_result() - return + for i in range(self.counter): + if i != int(results[i][0]): + self.report_incorrect_result() + return class TestUpdate(TestDML): datasize = 1000 @@ -135,13 +143,15 @@ def loop_step(self): def verify(self, conn): sql = ''' select c2 from {tablename} order by c1; - '''.format(tablename=self.tablename, counter=self.counter) - results = dbconn.query(conn, sql).fetchall() + '''.format(tablename=self.tablename) + with conn.cursor() as cur: + cur.execute(sql) + results = cur.fetchall() - for i in range(0, self.datasize): - if i + self.counter - 1 != int(results[i][0]): - self.report_incorrect_result() - return + for i in range(self.datasize): + if i + self.counter - 1 != int(results[i][0]): + self.report_incorrect_result() + return class TestDelete(TestDML): datasize = 100000 @@ -161,13 +171,15 @@ def loop_step(self): def verify(self, conn): sql = ''' select c1 from {tablename} order by c1; - '''.format(tablename=self.tablename, counter=self.counter) - results = dbconn.query(conn, sql).fetchall() - - for i in range(self.counter, self.datasize): - if i != int(results[i - self.counter][0]): - self.report_incorrect_result() - return + '''.format(tablename=self.tablename) + with conn.cursor() as cur: + cur.execute(sql) + results = cur.fetchall() + + for i in range(self.counter, self.datasize): + if i != int(results[i - self.counter][0]): + self.report_incorrect_result() + return # for test only if __name__ == '__main__': diff --git a/gpMgmt/test/behave_utils/utils.py b/gpMgmt/test/behave_utils/utils.py index a61febcd9f7..06c8c2209a6 100644 --- a/gpMgmt/test/behave_utils/utils.py +++ b/gpMgmt/test/behave_utils/utils.py @@ -11,15 +11,13 @@ import subprocess import difflib -import pg - from contextlib import closing from datetime import datetime from gppylib.commands.base import Command, ExecutionError, REMOTE from gppylib.commands.gp import chk_local_db_running, get_coordinatordatadir from gppylib.db import dbconn from gppylib.gparray import GpArray, MODE_SYNCHRONIZED - +from gppylib.utils import escape_string PARTITION_START_DATE = '2010-01-01' PARTITION_END_DATE = '2013-01-01' @@ -317,14 +315,14 @@ def check_table_exists(context, dbname, table_name, table_type=None, host=None, FROM pg_class c, pg_namespace n WHERE c.relname = '%s' AND n.nspname = '%s' AND c.relnamespace = n.oid; """ - SQL = SQL_format % (escape_string(tablename, conn=conn), escape_string(schemaname, conn=conn)) + SQL = SQL_format % (escape_string(tablename), escape_string(schemaname)) else: SQL_format = """ SELECT oid, relkind, relam, reloptions \ FROM pg_class \ WHERE relname = E'%s';\ """ - SQL = SQL_format % (escape_string(table_name, conn=conn)) + SQL = SQL_format % (escape_string(table_name)) table_row = None try: @@ -773,11 +771,6 @@ def replace_special_char_env(str): str = str.replace("$%s" % var, os.environ[var]) return str - -def escape_string(string, conn): - return pg.DB(db=conn).escape_string(string) - - def wait_for_unblocked_transactions(context, num_retries=150): """ Tries once a second to successfully commit a transaction to the database diff --git a/gpcontrib/gp_replica_check/gp_replica_check.py b/gpcontrib/gp_replica_check/gp_replica_check.py index 1627b859c1e..d00b66dc34a 100755 --- a/gpcontrib/gp_replica_check/gp_replica_check.py +++ b/gpcontrib/gp_replica_check/gp_replica_check.py @@ -40,8 +40,7 @@ import time import os from collections import defaultdict -from pg import DB - +import psycopg2 def run_sql(sql, host=None, port=None, dbname="postgres", is_query=True, @@ -51,10 +50,15 @@ def run_sql(sql, host=None, port=None, if port is None: port = int(os.getenv("PGPORT")) opt = "-c gp_role=utility" if is_utility else None - with DB(dbname=dbname, host=host, port=port, opt=opt) as db: - r = db.query(sql) - if is_query: - return r.getresult() + try: + with psycopg2.connect(dbname=dbname, host=host, port=port, options=opt) as conn: + with conn.cursor() as cur: + cur.execute(sql) + if is_query: + resultList = cur.fetchall() + return resultList + except Exception as e: + print('Exception: %s while running query %s dbname = %s' % (e, sql, dbname)) class ReplicaCheck(threading.Thread): diff --git a/python-dependencies.txt b/python-dependencies.txt index e00003d485b..2fd60bd41b1 100644 --- a/python-dependencies.txt +++ b/python-dependencies.txt @@ -1,2 +1,3 @@ psutil==5.7.0 pyyaml==5.3.1 +psycopg2==2.9.6 From 40842194449eb788d6a3cff26cfa888ee994a3d4 Mon Sep 17 00:00:00 2001 From: Xing Guo Date: Tue, 12 Sep 2023 14:09:24 +0800 Subject: [PATCH 6/7] [7X] Fix psycopg2 encoding issue (#16408) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit psycopg2's `getquoted()` API returns `latin-1` encoded binary string by default which is causing unexpected failures to some gpMgmt tools including gpload, analyzedb, minirepro. This patch helps fix it by teaching psycopg2's `QuotedString` adapter use `utf-8` encoding. Reproducing steps for `analyzedb`: Create a table with special name. ```sql postgres=# create table spiegelungssätze(i int); ``` Run `analyzedb` against the postgres db. ```bash $ analyzedb -d postgres ``` Backtrace: ``` ➜ analyzedb -d postgres 20230910:21:51:11:689552 analyzedb:laptop:v-[INFO]:-Starting analyzedb with args: -d postgres 20230910:21:51:11:689552 analyzedb:laptop:v-[INFO]:-Getting and verifying input tables... 20230910:21:51:11:689552 analyzedb:laptop:v-[INFO]:-Checking for tables with stale stats... 20230910:21:51:11:689552 analyzedb:laptop:v-[ERROR]:-'utf-8' codec can't decode byte 0xe4 in position 21: invalid continuation byte Traceback (most recent call last): File "/home/v/.local/gpdb7/bin/analyzedb", line 376, in execute heap_partitions = get_heap_tables_set(self.conn, input_tables_set) # set((schema1,table1), ...]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/v/.local/gpdb7/bin/analyzedb", line 1004, in get_heap_tables_set oid_str = get_oid_str(input_tables_set) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/v/.local/gpdb7/bin/analyzedb", line 976, in get_oid_str return ','.join(map((lambda x: regclass_schema_tbl(x[0], x[1])), table_list)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/v/.local/gpdb7/bin/analyzedb", line 976, in return ','.join(map((lambda x: regclass_schema_tbl(x[0], x[1])), table_list)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/v/.local/gpdb7/bin/analyzedb", line 984, in regclass_schema_tbl return "to_regclass('%s')" % (escape_string(schema_tbl)) ^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/v/.local/gpdb7/lib/python/gppylib/utils.py", line 515, in escape_string return adapted.getquoted().decode()[1:-1] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe4 in position 21: invalid continuation byte 20230910:21:51:11:689552 analyzedb:laptop:v-[CRITICAL]:-analyzedb failed. (Reason=''utf-8' codec can't decode byte 0xe4 in position 21: invalid continuation byte') exiting... ``` --- gpMgmt/bin/gpload.py | 10 +++++++++- .../gpload2/TEST_local_schema_and_mode.py | 11 +++++++++++ gpMgmt/bin/gpload_test/gpload2/query548.ans | 13 +++++++++++++ gpMgmt/bin/gpload_test/gpload2/setup.ans | 4 ++++ gpMgmt/bin/gpload_test/gpload2/setup.sql | 2 ++ gpMgmt/bin/gppylib/test/unit/test_unit_utils.py | 7 +++++++ gpMgmt/bin/gppylib/utils.py | 10 +++++++++- gpMgmt/test/behave/mgmt_utils/analyzedb.feature | 9 --------- gpMgmt/test/behave/mgmt_utils/environment.py | 8 ++++++++ gpMgmt/test/behave/mgmt_utils/minirepro.feature | 12 ++++++++++++ 10 files changed, 75 insertions(+), 11 deletions(-) create mode 100644 gpMgmt/bin/gpload_test/gpload2/query548.ans create mode 100644 gpMgmt/bin/gppylib/test/unit/test_unit_utils.py diff --git a/gpMgmt/bin/gpload.py b/gpMgmt/bin/gpload.py index 39abc206db4..19963c7c80d 100755 --- a/gpMgmt/bin/gpload.py +++ b/gpMgmt/bin/gpload.py @@ -548,8 +548,16 @@ def is_keyword(tab): else: return False +# Escape single quotes, backslashes appearing in the string according to the SQL string constants syntax. +# E.g., +# >>> escape_string(r"O'Reilly") +# "O''Reilly" def escape_string(string): - return psycopg2.extensions.QuotedString(string).getquoted()[1:-1].decode() + adapted = psycopg2.extensions.QuotedString(string) + # The getquoted() API returns 'latin-1' encoded binary string by default, we need to specify + # the encoding manually. + adapted.encoding = 'utf-8' + return adapted.getquoted().decode()[1:-1] def caseInsensitiveDictLookup(key, dictionary): """ diff --git a/gpMgmt/bin/gpload_test/gpload2/TEST_local_schema_and_mode.py b/gpMgmt/bin/gpload_test/gpload2/TEST_local_schema_and_mode.py index 79f05d1c74c..8ad5e45deeb 100644 --- a/gpMgmt/bin/gpload_test/gpload2/TEST_local_schema_and_mode.py +++ b/gpMgmt/bin/gpload_test/gpload2/TEST_local_schema_and_mode.py @@ -880,3 +880,14 @@ def test_547_gpload_insert_staging_without_DK(): f = open(TestBase.mkpath('query547.sql'), 'a') f.write("\\! psql -d reuse_gptest -c '\\d staging_gpload_reusable_*'") f.close() + +@TestBase.prepare_before_test(num=548, times=1) +def test_548_gpload_exttable_with_special_schema_name(): + "548 gpload reuse external table with special schema name" + setup_file = TestBase.mkpath('setup.sql') + TestBase.runfile(setup_file) + with open(TestBase.mkpath('query548.sql'), 'wt') as f: + f.write("\\! gpload -f " + TestBase.mkpath('config/config_file') + "\n") + f.write("\\! psql -d reuse_gptest -c 'select count(*) from csvtable;'\n") + TestBase.copy_data('external_file_13.csv','data_file.csv') + TestBase.write_config_file(reuse_tables=True, format='csv', file='data_file.csv', table='csvtable', delimiter="','",log_errors=True,error_limit=10, staging_table='staging_table',externalSchema='spiegelungssätze') diff --git a/gpMgmt/bin/gpload_test/gpload2/query548.ans b/gpMgmt/bin/gpload_test/gpload2/query548.ans new file mode 100644 index 00000000000..0933a693444 --- /dev/null +++ b/gpMgmt/bin/gpload_test/gpload2/query548.ans @@ -0,0 +1,13 @@ +2023-09-11 11:05:29|INFO|gpload session started 2023-09-11 11:05:29 +2023-09-11 11:05:29|INFO|setting schema 'public' for table 'csvtable' +2023-09-11 11:05:29|INFO|started gpfdist -p 8081 -P 8082 -f "/home/v/workspace/gpdb7/gpMgmt/bin/gpload_test/gpload2/data_file.csv" -t 30 +2023-09-11 11:05:29|INFO|running time: 0.09 seconds +2023-09-11 11:05:29|INFO|rows Inserted = 2 +2023-09-11 11:05:29|INFO|rows Updated = 0 +2023-09-11 11:05:29|INFO|data formatting errors = 0 +2023-09-11 11:05:29|INFO|gpload succeeded + count +------- + 2 +(1 row) + diff --git a/gpMgmt/bin/gpload_test/gpload2/setup.ans b/gpMgmt/bin/gpload_test/gpload2/setup.ans index ea4eeaeb625..386cdd1e1f8 100644 --- a/gpMgmt/bin/gpload_test/gpload2/setup.ans +++ b/gpMgmt/bin/gpload_test/gpload2/setup.ans @@ -5,6 +5,10 @@ CREATE DATABASE You are now connected to database "reuse_gptest" as user "gpadmin". CREATE SCHEMA test; CREATE SCHEMA +CREATE SCHEMA "EXT_schema_test"; +CREATE SCHEMA +CREATE SCHEMA "spiegelungssätze"; +CREATE SCHEMA set client_min_messages='warning'; SET DROP EXTERNAL TABLE IF EXISTS temp_gpload_staging_table; diff --git a/gpMgmt/bin/gpload_test/gpload2/setup.sql b/gpMgmt/bin/gpload_test/gpload2/setup.sql index 37bd494cafc..75b1d47fced 100644 --- a/gpMgmt/bin/gpload_test/gpload2/setup.sql +++ b/gpMgmt/bin/gpload_test/gpload2/setup.sql @@ -5,6 +5,8 @@ CREATE DATABASE reuse_gptest; \c reuse_gptest CREATE SCHEMA test; +CREATE SCHEMA "EXT_schema_test"; +CREATE SCHEMA "spiegelungssätze"; set client_min_messages='warning'; DROP EXTERNAL TABLE IF EXISTS temp_gpload_staging_table; diff --git a/gpMgmt/bin/gppylib/test/unit/test_unit_utils.py b/gpMgmt/bin/gppylib/test/unit/test_unit_utils.py new file mode 100644 index 00000000000..082e52d8d11 --- /dev/null +++ b/gpMgmt/bin/gppylib/test/unit/test_unit_utils.py @@ -0,0 +1,7 @@ +from mock import * +from .gp_unittest import * +from gppylib.utils import escape_string + +class UtilsFunctionsTest(GpTestCase): + def test_escape_string_can_handle_utf8(self): + self.assertEqual('public."spiegelungssätze"', escape_string('public."spiegelungssätze"')) diff --git a/gpMgmt/bin/gppylib/utils.py b/gpMgmt/bin/gppylib/utils.py index 42c77e620ab..19791c6280d 100644 --- a/gpMgmt/bin/gppylib/utils.py +++ b/gpMgmt/bin/gppylib/utils.py @@ -502,8 +502,16 @@ def escapeDoubleQuoteInSQLString(string, forceDoubleQuote=True): string = '"' + string + '"' return string +# Escape single quotes, backslashes appearing in the string according to the SQL string constants syntax. +# E.g., +# >>> escape_string(r"O'Reilly") +# "O''Reilly" def escape_string(string): - return psycopg2.extensions.QuotedString(string).getquoted()[1:-1].decode() + adapted = psycopg2.extensions.QuotedString(string) + # The getquoted() API returns 'latin-1' encoded binary string by default, we need to specify + # the encoding manually. + adapted.encoding = 'utf-8' + return adapted.getquoted().decode()[1:-1] def escapeArrayElement(query_str): # also escape backslashes and double quotes, in addition to the doubling of single quotes diff --git a/gpMgmt/test/behave/mgmt_utils/analyzedb.feature b/gpMgmt/test/behave/mgmt_utils/analyzedb.feature index 5809c7745a9..40b8d87623b 100644 --- a/gpMgmt/test/behave/mgmt_utils/analyzedb.feature +++ b/gpMgmt/test/behave/mgmt_utils/analyzedb.feature @@ -1781,12 +1781,3 @@ Feature: Incrementally analyze the database And the user executes "CREATE TEMP TABLE spiegelungssätze (c1 int) DISTRIBUTED BY (c1)" with named connection "default" When the user runs "analyzedb -a -d special_encoding_db" Then analyzedb should return a return code of 0 - - Scenario: analyzedb finds materialized views - Given a materialized view "public.mv_test_view" exists on table "pg_class" - And the user runs "analyzedb -a -d incr_analyze" - Then analyzedb should print "-public.mv_test_view" to stdout - And the user runs "analyzedb -a -s public -d incr_analyze" - Then analyzedb should print "-public.mv_test_view" to stdout - And the user runs "analyzedb -a -t public.mv_test_view -d incr_analyze" - Then analyzedb should print "-public.mv_test_view" to stdout diff --git a/gpMgmt/test/behave/mgmt_utils/environment.py b/gpMgmt/test/behave/mgmt_utils/environment.py index d79f9c18acc..c1dcca351ae 100644 --- a/gpMgmt/test/behave/mgmt_utils/environment.py +++ b/gpMgmt/test/behave/mgmt_utils/environment.py @@ -62,12 +62,20 @@ def before_feature(context, feature): dbconn.execSQL(context.conn, 'create table t1(a integer, b integer)') dbconn.execSQL(context.conn, 'create table t2(c integer, d integer)') dbconn.execSQL(context.conn, 'create table t3(e integer, f integer)') + dbconn.execSQL(context.conn, 'create table spiegelungssätze(col_ä integer, 列2 integer)') dbconn.execSQL(context.conn, 'create view v1 as select a, b from t1, t3 where t1.a=t3.e') dbconn.execSQL(context.conn, 'create view v2 as select c, d from t2, t3 where t2.c=t3.f') dbconn.execSQL(context.conn, 'create view v3 as select a, d from v1, v2 where v1.a=v2.c') dbconn.execSQL(context.conn, 'insert into t1 values(1, 2)') dbconn.execSQL(context.conn, 'insert into t2 values(1, 3)') dbconn.execSQL(context.conn, 'insert into t3 values(1, 4)') + dbconn.execSQL(context.conn, 'insert into spiegelungssätze values(1, 5)') + # minirepro tests require statistical data about the contents of the database + # we should execute 'ANALYZE' to fill the pg_statistic catalog table. + dbconn.execSQL(context.conn, 'analyze t1') + dbconn.execSQL(context.conn, 'analyze t2') + dbconn.execSQL(context.conn, 'analyze t3') + dbconn.execSQL(context.conn, 'analyze spiegelungssätze') context.conn.commit() if 'gppkg' in feature.tags: diff --git a/gpMgmt/test/behave/mgmt_utils/minirepro.feature b/gpMgmt/test/behave/mgmt_utils/minirepro.feature index 15e9c666a51..756803aafac 100644 --- a/gpMgmt/test/behave/mgmt_utils/minirepro.feature +++ b/gpMgmt/test/behave/mgmt_utils/minirepro.feature @@ -263,3 +263,15 @@ Feature: Dump minimum database objects that is related to the query And the output file "/tmp/out.sql" should contain "Table: t3, Attribute: f" And the output file "/tmp/out.sql" should be loaded to database "minidb_tmp" without error And the file "/tmp/in.sql" should be executed in database "minidb_tmp" without error + + @minirepro_core + Scenario: Dump database objects related with select query on table with specially encoded charaters + Given the file "/tmp/in.sql" exists and contains "select * from spiegelungssätze;" + And the file "/tmp/out.sql" does not exist + When the user runs "minirepro minireprodb -q /tmp/in.sql -f /tmp/out.sql" + Then the output file "/tmp/out.sql" should exist + And the output file "/tmp/out.sql" should not contain "CREATE TABLE public.spiegelungssätze" + And the output file "/tmp/out.sql" should contain "Table: spiegelungssätze, Attribute: col_ä" + And the output file "/tmp/out.sql" should contain "Table: spiegelungssätze, Attribute: 列2" + And the output file "/tmp/out.sql" should be loaded to database "minidb_tmp" without error + And the file "/tmp/in.sql" should be executed in database "minidb_tmp" without error From c8aa01c75d5d70696edb96603bddc6f9f255190b Mon Sep 17 00:00:00 2001 From: vrhappy Date: Tue, 26 Dec 2023 11:00:55 +0530 Subject: [PATCH 7/7] Fix for gpcheckcat when issue `gpcheckcat -C pg_class` (#16902) Error occurs when we issue command `gpcheckcat -C pg_class`. Reported error is "[ERROR] executing: Cross consistency check for pg_class\n Execution error: name 'db' is not defined". This is because of use of an undefined variable 'db'. This commit fixes the issue by removing its usage. Authored-by: vrhappy --- gpMgmt/bin/gpcheckcat | 2 +- gpMgmt/test/behave/mgmt_utils/gpcheckcat.feature | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/gpMgmt/bin/gpcheckcat b/gpMgmt/bin/gpcheckcat index 9bb50d7feb1..26c0e7e30d5 100755 --- a/gpMgmt/bin/gpcheckcat +++ b/gpMgmt/bin/gpcheckcat @@ -1255,7 +1255,7 @@ def checkTableACL(cat): try: conn = connect2(GV.cfg[GV.coordinator_dbid], utilityMode=False) with conn.cursor() as curs: - curs = db.execute(qry) + curs.execute(qry) nrows = curs.rowcount if nrows == 0: diff --git a/gpMgmt/test/behave/mgmt_utils/gpcheckcat.feature b/gpMgmt/test/behave/mgmt_utils/gpcheckcat.feature index d9b91838909..84cdcba4b03 100644 --- a/gpMgmt/test/behave/mgmt_utils/gpcheckcat.feature +++ b/gpMgmt/test/behave/mgmt_utils/gpcheckcat.feature @@ -9,6 +9,9 @@ Feature: gpcheckcat tests Given database "all_good" is dropped and recreated Then the user runs "gpcheckcat -A" Then gpcheckcat should return a return code of 0 + When the user runs "gpcheckcat -C pg_class" + Then gpcheckcat should return a return code of 0 + And gpcheckcat should not print "Execution error:" to stdout And the user runs "dropdb all_good" Scenario: gpcheckcat should drop leaked schemas